机器学习中的简单线性回归



什么是简单线性回归?

简单线性回归是一种统计学和监督学习方法,其中使用单个自变量(也称为预测变量)来预测因变量。换句话说,它模拟因变量与单个自变量之间的线性关系。

机器学习中的简单线性回归是线性回归的一种类型。当线性回归算法处理单个自变量时,称为简单线性回归。当存在多个自变量(特征变量)时,称为多元线性回归

自变量

数据集中特征输入称为自变量。简单线性回归中只有一个自变量。自变量也称为预测变量,因为它用于预测目标值。它绘制在水平轴上。

因变量

数据集中目标值称为因变量。它也称为响应变量或预测变量。它绘制在垂直轴上。

回归线

在简单线性回归中,回归线是一条最适合数据点的直线,用于显示因变量和自变量之间的关系。

图形表示

下图描述了简单线性回归模型 -

ML Simple Linear Regression

在上图中,直线表示简单线性回归线,其中Ŷ是预测值,Y是因变量(目标),X是自变量(输入)。

简单线性回归模型

机器学习中的简单线性回归模型可以用以下数学方程式表示 -

$$\mathrm{ Y = w_0 + w_1 X + \epsilon }$$

其中

  • Y 是因变量(目标)。
  • X 是自变量(特征)。
  • w0 是线的 y 截距。
  • w1 是线的斜率,表示 X 对 Y 的影响。
  • ε 是误差项,捕获 X 未解释的 Y 中的变化。

简单线性回归如何工作?

简单线性回归的主要目的是找到穿过数据点并使实际值与预测值之间的差异最小化的最佳拟合线(直线)。

定义假设函数

在简单线性回归中,假设是因变量(输出/目标)和自变量(输入)之间存在线性关系。这种线性关系可以使用线性方程表示 -

$$\mathrm{\hat{Y} = w_0 + w_1 X}$$

使用参数 w0 和 w1 的不同值,存在多个线性方程(直线)。所有此类线性方程(所有直线)的集合称为假设空间。

现在,简单线性回归模型的主要目标是在假设空间(所有直线的集合)中找到最佳拟合线。

找到最佳拟合线

现在任务是找到最佳拟合线(回归线)。为此,我们定义一个成本函数或损失函数来衡量实际值与预测值之间的差异。

为了找到最佳拟合线,简单线性回归模型会初始化(使用默认值)回归线的参数。此回归线(使用初始化的参数)用于找到给定输入值的预测值。

简单线性回归的损失函数

现在使用输入值和预测值,我们计算损失函数。损失函数用于找到参数的最佳值。

损失函数找到输入值与预测值之间的差异。简单线性回归中使用了不同的损失函数,例如均方误差 (MSE)、平均绝对误差 (MEA)、R 平方等。最常用的损失函数是均方误差。

简单线性回归的损失函数(以均方误差表示)如下 -

$$\mathrm{J(w_0, w_1) = \frac{1}{2n} \sum_{i=1}^{n} \left( Y_i - \hat{Y}_i \right)^2}$$

优化

参数的最佳值是使成本函数最小化的那些值。找到最佳值是一个迭代过程,其中参数被迭代更新。

简单线性回归中应用了许多优化技术。梯度下降是一种简单且最常用的优化技术,用于简单线性回归。

具有最佳参数值的线性方程是最佳拟合线(回归线),它是简单线性回归问题的最终解决方案。此线用于预测新的和看不见的数据。

简单线性回归的假设

简单线性回归模型对数据集做出了一些假设。以下是一些假设 -

  • 线性 - 此假设假设因变量和自变量之间的关系是线性的。这意味着随着自变量的变化,因变量线性变化。散点图将显示数据集中线性关系。
  • 同方差性 - 对于所有观察值,残差的方差相同。此假设与残差平方有关。
  • 独立性 - 示例(观察值或 X 和 Y 对)是独立的。数据中不存在共线性,因此残差不会相关。要检查这一点,我们查看残差与拟合的散点图。

  • 正态性 - 模型残差服从正态分布。残差是实际值和预测值之间的差异。为了检查正态性,我们检查残差的直方图。直方图应该近似服从正态分布。

使用 Python 实现简单线性回归算法

为了实现简单线性回归算法,我们使用一个包含两个变量的数据集:工作年限(自变量)和薪资(因变量)。

这里,我们使用以下数据集。数据集包含 30 个数据点的示例。您可以创建一个 CSV 文件并将这些数据点存储在其中。

Salary_Data.csv

工作年限 薪资
1.1 39343
1.3 46205
1.5 37731
2 43525
2.2 39891
2.9 56642
3 60150
3.2 54445
3.2 64445
3.7 57189
3.9 63218
4 55794
4 56957
4.1 57081
4.5 61111
4.9 67938
5.1 66029
5.3 83088
5.9 81363
6 93940
6.8 91738
7.1 98273
7.9 101302
8.2 113812
8.7 109431
9 105582
9.5 116969
9.6 112635
10.3 122391
10.5 121872

此实现的目的是什么?

构建这个简单线性回归模型的目的是确定哪条线最能代表这两个变量之间的关系。

以下是使用 Python 实现简单线性回归模型的步骤:

步骤 1:数据准备

数据准备或预处理是第一步。我们有一个名为“Salary_Data.csv”的 CSV 文件作为数据集,如上所述。

在导入数据集和构建简单线性回归模型之前,我们需要导入 Python 库

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

加载数据集

dataset = pd.read_csv('Salary_Data.csv')

然后必须从提供的数据集中提取因变量 (X) 和自变量 (Y)。工作年限(YearsExperience)是自变量,Salary 是因变量。

X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values

让我们检查数据集的前五个示例。

print(dataset.head())

输出

0	1.1	39343.0
1	1.3	46205.0
2	1.5	37731.0
3	2.0	43525.0
4	2.2	39891.0

让我们检查数据集是否线性

plt.scatter(X, y, color="green")
plt.title("Salary vs Experience")
plt.xlabel("Years of Experience")
plt.ylabel("Salary (INR)")
plt.show()

输出

Linear Relation Between Dependent and Independent Variables

上图显示自变量和因变量之间存在线性关系。因此,我们可以对数据集应用简单线性回归,以找到这些变量之间最佳的关系。

将数据集分成训练集和测试集

然后将训练集和测试集分成两组。我们将使用 80% 的观测值作为训练集,20% 的观测值作为测试集,从我们拥有的总共 30 个观测值中。因此,训练集中将有 24 个观测值,测试集中将有 6 个观测值。我们将数据集分成训练集和测试集,以便我们可以使用一组进行训练,另一组进行测试我们的模型。

# Split the dataset into training and testing sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)

这里,X_train 表示训练数据的输入特征,y_train 表示输出变量(目标变量)。

步骤 2:模型训练(将简单线性回归拟合到训练集)

下一步是用训练数据集拟合我们的模型。我们将使用 scikit-learn 的 LinearRegression 类在训练数据上训练一个简单线性回归模型。代码如下:

from sklearn.linear_model import LinearRegression

# Create a linear regression object
regressor= LinearRegression()
regressor.fit(X_train, y_train)

fit() 方法用于将线性回归对象(regressor)拟合到训练数据。模型学习预测变量 (X_train) 和目标变量 (y_train) 之间的关系。

步骤 3:模型测试

模型训练完成后,我们可以使用它对测试数据进行预测。代码如下:

y_pred = regressor.predict(X_test)
df = pd.DataFrame({'Actual Values':y_test, 'Predicted Values':y_pred})
print(df)

输出

   Actual Values  Predicted Values
0        60150.0      54093.648425
1        93940.0      82416.119864
2        57081.0      64478.554619
3       116969.0     115459.003211
4        56957.0      63534.472238
5       121872.0     124899.827024

以上输出显示了测试集中薪资的实际值和预测值。

这里,X_test 表示测试数据的输入特征,y_pred 表示预测的输出变量(目标变量)。

同样,您可以使用训练数据测试模型。

y_pred = regressor.predict(X_train)
df = pd.DataFrame({'Real Values':y_test, 'Predicted Values':y_pred})
print(df)

输出

    Real Values  Predicted Values
0       57189.0      60702.225094
1       64445.0      55981.813188
2       63218.0      62590.389857
3      122391.0     123011.662261
4       91738.0      89968.778915
5       43525.0      44652.824612
6       61111.0      68254.884145
7       56642.0      53149.566044
8       66029.0      73919.378433
9       83088.0      75807.543195
10      46205.0      38044.247943
11     109431.0     107906.344160
12      98273.0      92801.026059
13      37731.0      39932.412705
14      54445.0      55981.813188
15      39891.0      46540.989374
16     101302.0     100353.685109
17      55794.0      63534.472238
18      81363.0      81472.037483
19      39343.0      36156.083180
20     113812.0     103185.932253
21      67938.0      72031.213670
22     112635.0     116403.085592
23     105582.0     110738.591304

步骤 4:模型评估

我们需要评估模型的性能以确定其准确性。我们将使用均方误差 (MSE)、均方根误差 (RMSE)、平均绝对误差 (MAE) 和决定系数 (R^2) 作为评估指标。代码如下:

from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import r2_score

# get the predicted values for test dat
y_pred = regressor.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print("mse", mse)
rmse = mean_squared_error(y_test, y_pred, squared=False)
print("rsme", rmse)
mae = mean_absolute_error(y_test, y_pred)
print("mae", mae)
r2 = r2_score(y_test, y_pred)
print("r2", r2)

输出

mse:  46485664.99327367
rsme:  6818.0396737826095
mae:  6015.513730219523
r2:  0.9399326805390613

这里,y_test 表示测试数据的实际输出变量。

步骤 5:可视化训练集结果(带回归线)

现在,让我们可视化训练集上的结果和回归线。

我们使用散点图绘制训练集中实际值(输入和目标值)。我们还绘制了一条直线(回归线)表示训练集的实际值(输入)和预测值。

y_pred = regressor.predict(X_train)
plt.scatter(X_train, y_train, color="green", label="training data points (actual)")
plt.scatter(X_train, y_pred, color="blue",label="training data points (predicted)")
plt.plot(X_train, y_pred, color="red")
plt.title("Salary vs Experience (Training Dataset)")
plt.xlabel("Years of Experience")
plt.ylabel("Salary(In Rupees)")
plt.legend()
plt.show()

输出

Visualizing training set results

上图显示了回归线(红色直线)、实际值(绿色)和训练集的预测值(蓝色)。

步骤 6:可视化测试集结果(带回归线)

现在,让我们可视化测试集上的结果和回归线。

我们使用散点图绘制测试集中实际值(输入和目标值)。我们还绘制了一条直线(回归线)表示测试集的实际值(输入)和预测值。

y_pred = regressor.predict(X_test)
plt.scatter(X_test, y_test, color="green", label="test data points (actual)")
plt.scatter(X_test, y_pred, color="blue",label="test data points (predicted)")
plt.plot(X_test, y_pred, color="red")
plt.title("Salary vs Experience (Test Dataset)")
plt.xlabel("Years of Experience")
plt.ylabel("Salary(In Rupees)")
plt.legend()
plt.show()

输出

Visualizing test set results

上图显示了回归线(红色直线)、实际值(绿色)和测试集的预测值(蓝色)。

广告