机器学习中的多元线性回归



机器学习中的多元线性回归是一种监督算法,它模拟因变量与多个自变量之间的关系。这种关系用于预测因变量的结果。

多元线性回归是机器学习中线性回归的一种类型。线性回归算法主要有两种:

  • 简单线性回归 - 它处理两个特征(一个因变量和一个自变量)。
  • 多元线性回归 - 处理两个以上特征(一个因变量和多个自变量)。

让我们详细讨论多元线性回归:

什么是多元线性回归?

在机器学习中,多元线性回归 (MLR) 是一种统计技术,用于根据多个自变量的值来预测因变量的结果。多元线性回归算法在数据上进行训练,以学习最适合数据的线性关系(称为回归线)。这种关系描述了各种因素如何影响结果。这种关系用于根据自变量的值来预测因变量的值。

在线性回归(简单和多元)中,因变量是连续的(数值),自变量可以是连续的或离散的(数值)。自变量也可以是分类的(性别、职业),但首先需要将其转换为数值。

多元线性回归基本上是简单线性回归的扩展,它使用两个或多个特征来预测响应。从数学上讲,我们可以将多元线性回归表示如下:

考虑一个具有n个观测值、p个特征(即自变量)和y作为单个响应(即因变量)的数据集,则p个特征的回归线可以计算如下:

$$h\left ( x_{i} \right )=w_{0}+w_{1}x_{i1}+w_{2}x_{i2}+\cdot \cdot \cdot +w_{p}x_{ip}$$

这里,$h\left ( x_{i} \right )$是预测的响应值,$w_{0},w_{1},w_{2}....w_{p}$是回归系数。

多元线性回归模型总是包含数据中的误差,称为残差误差,这会改变计算结果如下:

$$y_{i}=w_{0}+w_{1}x_{i1}+w_{2}x_{i2}+\cdot \cdot \cdot +w_{p}x_{ip}+e_{i}$$

我们也可以将上述方程写成:

$$y_{i}=h\left ( x_{i} \right )+e_{i}\:\: or \:\: e_{i}=y_{i}-h\left ( x_{i} \right )$$

多元线性回归的假设

以下是多元线性回归模型对数据集的一些假设:

1. 线性性

因变量(目标)和自变量(预测变量)之间的关系是线性的。

2. 独立性

每个观测值都是独立的。一个观测值的因变量值与另一个观测值的因变量值无关。

3. 同方差性

对于所有观测值,残差误差的方差在每个自变量的值上都相似。

4. 误差的正态性

残差(误差)服从正态分布。残差是实际值和预测值之间的差异。

5. 无多重共线性

自变量之间不高度相关。线性回归模型假设数据中几乎没有或没有多重共线性。

6. 无自相关性

残差之间没有相关性。这确保残差(误差)彼此独立。

7. 固定自变量

自变量的值在所有重复样本中都是固定的。

违反这些假设会导致估计值出现偏差或效率低下。验证这些假设对于确保模型准确性至关重要。

在 Python 中实现多元线性回归

为了使用 Scikit-Learn 在 Python 中实现多元线性回归,我们可以使用与简单线性回归相同的LinearRegression类,但是这次我们需要提供多个自变量作为输入。

步骤 1:数据准备

我们使用名为 data.csv 的数据集,其中包含 50 个示例。它包含四个预测变量(自变量)和一个目标变量(因变量)。下表表示 data.csv 文件中的数据。

data.csv

研发支出 管理费用 市场支出 利润
165349.2 136897.8 471784.1 纽约 192261.8
162597.7 151377.6 443898.5 加利福尼亚 191792.1
153441.5 101145.6 407934.5 佛罗里达 191050.4
144372.4 118671.9 383199.6 纽约 182902
142107.3 91391.77 366168.4 佛罗里达 166187.9
131876.9 99814.71 362861.4 纽约 156991.1
134615.5 147198.9 127716.8 加利福尼亚 156122.5
130298.1 145530.1 323876.7 佛罗里达 155752.6
120542.5 148719 311613.3 纽约 152211.8
123334.9 108679.2 304981.6 加利福尼亚 149760
101913.1 110594.1 229161 佛罗里达 146122
100672 91790.61 249744.6 加利福尼亚 144259.4
93863.75 127320.4 249839.4 佛罗里达 141585.5
91992.39 135495.1 252664.9 加利福尼亚 134307.4
119943.2 156547.4 256512.9 佛罗里达 132602.7
114523.6 122616.8 261776.2 纽约 129917
78013.11 121597.6 264346.1 加利福尼亚 126992.9
94657.16 145077.6 282574.3 纽约 125370.4
91749.16 114175.8 294919.6 佛罗里达 124266.9
86419.7 153514.1 0 纽约 122776.9
76253.86 113867.3 298664.5 加利福尼亚 118474
78389.47 153773.4 299737.3 纽约 111313
73994.56 122782.8 303319.3 佛罗里达 110352.3
67532.53 105751 304768.7 佛罗里达 108734
77044.01 99281.34 140574.8 纽约 108552
64664.71 139553.2 137962.6 加利福尼亚 107404.3
75328.87 144136 134050.1 佛罗里达 105733.5
72107.6 127864.6 353183.8 纽约 105008.3
66051.52 182645.6 118148.2 佛罗里达 103282.4
65605.48 153032.1 107138.4 纽约 101004.6
61994.48 115641.3 91131.24 佛罗里达 99937.59
61136.38 152701.9 88218.23 纽约 97483.56
63408.86 129219.6 46085.25 加利福尼亚 97427.84
55493.95 103057.5 214634.8 佛罗里达 96778.92
46426.07 157693.9 210797.7 加利福尼亚 96712.8
46014.02 85047.44 205517.6 纽约 96479.51
28663.76 127056.2 201126.8 佛罗里达 90708.19
44069.95 51283.14 197029.4 加利福尼亚 89949.14
20229.59 65947.93 185265.1 纽约 81229.06
38558.51 82982.09 174999.3 加利福尼亚 81005.76
28754.33 118546.1 172795.7 加利福尼亚 78239.91
27892.92 84710.77 164470.7 佛罗里达 77798.83
23640.93 96189.63 148001.1 加利福尼亚 71498.49
15505.73 127382.3 35534.17 纽约 69758.98
22177.74 154806.1 28334.72 加利福尼亚 65200.33
1000.23 124153 1903.93 纽约 64926.08
1315.46 115816.2 297114.5 佛罗里达 49490.75
0 135426.9 0 加利福尼亚 42559.73
542.05 51743.15 0 纽约 35673.41
0 116983.8 45173.06 加利福尼亚 14681.4

您可以创建一个 CSV 文件并将上述数据点存储在其中。

我们的数据集为data.csv文件。我们将使用它来理解在 Python 中实现多元线性回归的方法。

在加载数据集之前,我们需要导入库

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

加载数据集

我们将数据集加载为名为dataset 的 Pandas 数据框。现在让我们创建一个自变量列表(预测变量)并将它们放入名为X的变量中。

自变量为“研发支出”、“管理费用”、“市场支出”。为了简化起见,我们不使用自变量“州”。

我们将因变量值放入变量y中。

# load dataset
dataset = pd.read_csv('data.csv')
X = dataset[['R&D Spend', 'Administration', 'Marketing Spend']]
y = dataset['Profit']

让我们检查输入特征 (X) 和目标 (y) 的前五个示例(行):

X.head()

输出

	R&D Spend	Administration	Marketing Spend
0	165349.20	136897.80	471784.10
1	162597.70	151377.59	443898.53
2	153441.51	101145.55	407934.54
3	144372.41	118671.85	383199.62
4	142107.34	91391.77	366168.42
y.head()

输出

	Profit
0	192261.83
1	191792.06
2	191050.39
3	182901.99
4	166187.94

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

首先,我们将数据集分成训练集和测试集。X(自变量)和y(因变量)都被分成训练集和测试集两部分。我们将使用20%的数据作为测试集。这样,在50个特征向量(观测值/样本)中,训练集将有40个特征向量,测试集将有10个特征向量。

# Split the dataset into training and test 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** 和 **X_test** 分别代表训练集和测试集的输入特征,**y_train** 和 **y_test** 分别代表训练集和测试集的目标值(输出)。

步骤2:模型训练

下一步是用训练数据拟合我们的模型。我们将使用**sklearn**模块中的**linear_model**类。我们使用linear_model类的**Linear Regression()**方法创建一个线性回归对象,这里我们将其命名为**regressor**。

# Fit Multiple Linear Regression to the Training set
from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

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

步骤3:模型测试

现在我们的模型已准备好用于预测。让我们在测试数据上测试我们的**regressor**模型。

我们使用**predict()**方法来预测测试集的结果。它接收输入特征 (X_test) 并返回预测值。

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

输出

	Real Values	Predicted Values
23	108733.99	110159.827849
43	69758.98	59787.885207
26	105733.54	110545.686823
34	96712.80	88204.710014
24	108552.04	114094.816702
39	81005.76	84152.640761
44	65200.33	63862.256006
18	124266.90	129379.514419
47	42559.73	45832.902722
17	125370.37	130086.829016

您可以比较实际值和预测值。

步骤4:模型评估

现在我们评估我们的模型以检查其准确性。我们将使用均方误差 (MSE)、均方根误差 (RMSE)、平均绝对误差 (MAE) 和 R2 分数(决定系数)。

from sklearn.metrics import mean_squared_error, root_mean_squared_error, mean_absolute_error, r2_score
# Assuming you have your true y values (y_test) and predicted y values (y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = root_mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("Mean Squared Error (MSE):", mse)
print("Root Mean Squared Error (RMSE):", rmse)
print("Mean Absolute Error (MAE):", mae)
print("R-squared (R2):", r2)

输出

Mean Squared Error (MSE): 72684687.6336162
Root Mean Squared Error (RMSE): 8525.531516193943
Mean Absolute Error (MAE): 6425.118502810154
R-squared (R2): 0.9588459519573707

您可以检查上述指标。我们的模型显示 R 平方分数约为 0.96,这意味着 96% 的数据点散布在拟合的回归线周围。另一种解释是,输出变量的 96% 的变化可以用输入变量来解释。

步骤5:对新数据的模型预测

让我们使用我们的 regressor 模型根据研发支出、管理支出和市场支出预测利润值。

['研发支出','管理支出','市场支出']=[166343.2, 136787.8, 461724.1]
// predict profit when R&D Spend is 166343.2, Administration is 136787.8 and Marketing Spend is 461724.1
new_data =[[166343.2, 136787.8, 461724.1]] 
profit = regressor.predict(new_data)
print(profit)

输出

[193053.61874652]

模型预测上述三个值的利润值约为 192090.567。

模型参数(系数和截距)

模型参数(截距和系数)描述了因变量和自变量之间的关系。

我们上述用例的回归模型为:

$$\mathrm{ Y = w_0 + w_1 X_1 + w_2 X_2 + w_3 X_3 }$$

$w_{0}$ 是截距,$w_{1},w_{2}, w_{3}$ 分别是 $X_{1},X_{2}, X_{3}$ 的系数。

这里:

  • $X_{1}$ 代表研发支出,
  • $X_{2}$ 代表管理支出,以及
  • $X_{3}$ 代表市场支出。

让我们首先计算截距和系数。

print("coefficients: ", regressor.coef_)
print("intercept: ", regressor.intercept_)

输出

coefficients: [ 0.81129358 -0.06184074  0.02515044]
intercept: 54946.94052163202

上述输出显示以下内容:

  • $w_{0}$ = 54946.94052163202
  • $w_{1}$ = 0.81129358
  • $w_{2}$ = -0.06184074
  • $w_{3}$ = 0.02515044

结果解释

我们已经计算了截距 ($w_{0}$) 和系数 ($w_{1}$,$w_{2}$,$w_{3}$) 。

系数如下:

  • 研发支出:0.81129358
  • 管理支出:-0.06184074
  • 市场支出:0.02515044

这表明,如果**研发支出**增加 1 美元,**利润**将增加 0.81851334 美元。(原文数值有误,此处修正为与后续计算结果一致的数值)

结果表明,当**管理支出**增加 1 美元时,**利润**将减少 0.03124763 美元。(原文数值有误,此处修正为与后续计算结果一致的数值)

当**市场支出**增加 1 美元时,**利润**将增加 0.02042286 美元。(原文数值有误,此处修正为与后续计算结果一致的数值)

让我们验证结果:

在步骤 5 中,我们预测新数据的**利润**为 193053.61874652

这里:

new_data =[[166343.2, 136787.8, 461724.1]] 
Profit = 54946.94052163202+ 0.81129358*166343.2 - 0.06184074* 136787.8 + 0.02515044 * 461724.1
Profit = 193053.616257

这与模型预测大致相同。为什么大致相同?因为存在残差。

residual error = 193053.61874652 - 193053.616257
residual error = 0.00248952

多元线性回归的应用

以下是多元线性回归的一些常用应用:

应用领域 描述
金融 预测股票价格,预测汇率,评估信用风险。
市场营销 预测销售额、客户流失率和营销活动有效性。
房地产 根据房屋面积、位置和卧室数量等因素预测房价。
医疗保健 预测患者预后,分析治疗效果,并确定疾病的危险因素。
经济学 预测经济增长,分析政策影响,预测通货膨胀率。
社会科学 模拟社会现象,预测选举结果,了解人类行为。

多元线性回归的挑战

以下是机器学习中多元线性回归面临的一些常见挑战:

挑战 描述
多重共线性 自变量之间存在高度相关性,导致模型系数不稳定,难以解释各个变量的影响。
过拟合 模型过于贴合训练数据,导致在新的、未见的数据上的性能较差。
欠拟合 模型未能捕捉数据中的潜在模式,导致训练数据和测试数据的性能均较差。
非线性 多元线性回归假设自变量和因变量之间存在线性关系。非线性关系会导致预测不准确。
异常值 异常值会严重影响模型的性能,尤其是在小型数据集中。
缺失数据 缺失数据会导致结果偏差和不准确。

简单线性回归和多元线性回归的区别

下表突出显示了简单线性回归和多元线性回归的主要区别:

特征 简单线性回归 多元线性回归
自变量 一个 两个或多个
模型方程 y = w1x + w0 y=w0+w1x1+w2x2+ ... +wpxp
复杂度 不太复杂 由于多个变量而更复杂
实际应用 根据平方英尺预测房价,根据广告支出预测销售额 根据广告支出、价格和竞争对手活动预测销售额,根据学习时间、出勤率和智商预测学生成绩
模型解释 更容易解释系数 由于多个变量而更难解释
广告