免费Python机器学习课程二:多元线性回归

时间:2021-09-23 21:01:30

从头开始学习为Python中任意数量的变量开发多元线性回归。

线性回归可能是最简单的机器学习算法。对于初学者来说非常好,因为它使用简单的公式。因此,这对学习机器学习概念很有帮助。在本文中,我将尝试逐步解释多元线性回归。

 

概念和公式

线性回归使用我们在学校都学过的简单公式:

Y = C + AX

提醒一下,Y是输出或因变量,X是输入或自变量,A是斜率,C是截距。

对于线性回归,对于相同的公式,我们遵循以下符号:

免费Python机器学习课程二:多元线性回归

如果我们有多个自变量,则线性回归的公式将如下所示:

免费Python机器学习课程二:多元线性回归

在这里," h"称为假设。这是预测的输出变量。Theta0是偏差项,所有其他theta值是系数。它们首先是随机启动的,然后使用算法进行优化,以便此公式可以紧密预测因变量。

成本函数和梯度下降

当theta值从一开始就被初始化时,该公式未经过训练以预测因变量。该假设与原始输出变量" Y"相去甚远。这是估算所有训练数据的累积距离的公式:

免费Python机器学习课程二:多元线性回归

这称为成本函数。如果您注意到了,它从假设(预测输出)中减去y(原始输出),取平方去掉负数,求和除以2乘以m。在此,m是训练数据的数量。您可能会看到成本函数是原始输出和预测输出之间差异的指示。机器学习算法的思想是最小化成本函数,以使原始输出与预测输出之间的差异更小。为此,我们需要优化theta值。

这是我们更新theta值的方法。我们将成本函数相对于每个theta值的偏微分,然后从现有theta值中减去该值,

免费Python机器学习课程二:多元线性回归

在此,alpha是学习率,它是一个常数。我没有为所有theta值显示相同的公式。但这是所有theta值的相同公式。经过微分后,公式得出为:

免费Python机器学习课程二:多元线性回归

这称为梯度下降。

逐步实现算法

我要使用的数据集来自吴安德(Andre Ng)的Coursera机器学习课程。我将在此页面底部提供链接。请随时下载数据集并通过本教程进行练习。我鼓励您在阅读数据集时进行练习(如果这对您来说是新的)。那是了解它的唯一方法。

在此数据集中,只有两个变量。但是我开发了适用于任意数量变量的算法。如果您对10个变量或20个变量使用相同的算法,那么它也应该工作。我将在Python中使用Numpy和Pandas库。所有这些丰富的Python库使机器学习算法更加容易。导入包和数据集:

import pandas as pd 

import numpy as np 

 

df = pd.read_csv('ex1data2.txt', header = None

df.head() 

免费Python机器学习课程二:多元线性回归

(1) 在偏项中添加一列。之所以选择1,是因为如果您将一个值乘以任意值,则该值不会改变。

df = pd.concat([pd.Series(1, index=df.index, name='00'), df], axis=1

df.head() 

免费Python机器学习课程二:多元线性回归

(2) 定义输入变量或自变量X以及输出变量或因变量y。在此数据集中,列0和1是输入变量,列2是输出变量。

X = df.drop(columns=2

y = df.iloc[:, 3] 

(3) 通过将每一列除以该列的最大值来标准化输入变量。这样,每列的值将在0到1之间。此步骤不是必需的。但这会使算法更快地达到最佳状态。同样,如果您注意到数据集,则列0的元素与列1的元素相比太大。如果对数据集进行规范化,则可以防止第一列在算法中占主导地位。

for i in range(1, len(X.columns)):  

    X[i-1] = X[i-1]/np.max(X[i-1]) 

X.head() 

免费Python机器学习课程二:多元线性回归

(4) 初始化theta值。我将它们初始化为零。但是任何其他数字都可以。

theta = np.array([0]*len(X.columns)) 

#Output: array([0, 0, 0]) 

(5) 计算在上式中以m表示的训练数据的数量:

m = len(df) 

(6) 定义假设函数

def hypothesis(theta, X):  

    return theta*X 

(7) 使用上述成本函数的公式定义成本函数

def computeCost(X, y, theta):  

    y1 = hypothesis(theta, X)  

    y1=np.sum(y1, axis=1)  

    return sum(np.sqrt((y1-y)**2))/(2*47) 

(8) 编写梯度下降函数。此函数将以X,y,theta,学习率(公式中的alpha)和历元(或迭代)作为输入。我们需要不断更新theta值,直到成本函数达到最小值为止。

def gradientDescent(X, y, theta, alpha, i): 

    J = []  #cost function in each iterations 

    k = 0 

    while k < i:         

        y1 = hypothesis(theta, X) 

        y1 = np.sum(y1, axis=1

        for c in range(0, len(X.columns)): 

            theta[c] = theta[c] - alpha*(sum((y1-y)*X.iloc[:,c])/len(X)) 

        j = computeCost(X, y, theta) 

        J.append(j) 

        k += 1 

    return J, j, theta 

(9) 使用梯度下降函数获得最终成本,每次迭代的成本列表以及优化的参数theta。我选择alpha为0.05。但是您可以尝试使用其他一些值(例如0.1、0.01、0.03、0.3)来查看会发生什么。我运行了10000次迭代。请尝试进行更多或更少的迭代,以查看差异。

J, j, theta = gradientDescent(X, y, theta, 0.05, 10000) 

(10) 使用优化的theta预测输出

y_hat = hypothesis(theta, X)y_hat = np.sum(y_hat, axis=1

(11) 绘制原始y和预测输出y_hat

%matplotlib inline 

import matplotlib.pyplot as plt 

plt.figure() 

plt.scatter(x=list(range(0, 47)),yy= y, color='blue')  

plt.scatter(x=list(range(0, 47)), y=y_hatcolor='black'

plt.show() 

免费Python机器学习课程二:多元线性回归

一些输出点几乎与预测输出重叠。有些接近但不重叠。

(12) 绘制每次迭代的成本以查看行为

plt.figure() 

plt.scatter(x=list(range(0, 10000)), y=J

plt.show() 

免费Python机器学习课程二:多元线性回归

每次迭代的成本都在下降。这表明算法运行良好。

希望对您有所帮助,您也可以自己尝试一下。我鼓励您下载数据集,并在阅读本章以学习机器学习概念时尝试自己运行所有代码。这是数据集的链接:

https://github.com/rashida048/Machine-Learning-With-Python/blob/master/ex1data2.txt

原文地址:https://www.toutiao.com/i6907382831228600840/