线性回归属于监督学习算法中,回归算法的一种,主要应用场景是连续数值型变量的预测问题。
模型
线性回归的模型为:
y
i
^
=
w
x
i
+
b
\hat{y_i}=wx_i+b
yi^=wxi+b
其中
w
:
特
征
权
重
w:特征权重
w:特征权重,
b
:
偏
置
值
b:偏置值
b:偏置值,
y
i
^
为
自
变
量
的
预
测
值
\hat{y_i} 为自变量的预测值
yi^为自变量的预测值,
x
i
为
因
变
量
x_i为因变量
xi为因变量,
y
i
为
自
变
量
的
真
实
值
y_i为自变量的真实值
yi为自变量的真实值。
策略
线性回归通过拟合一条直线,使得预测值与真实值之间的差异最小。基于此目的,我们确定损失函数:
L
=
∑
i
(
y
i
−
y
i
^
)
2
L=\sum_{i}(y_i-\hat{y_i})^2
L=i∑(yi−yi^)2
参数
(
w
,
b
)
(w, b)
(w,b)的估计值
(
w
^
,
b
^
)
(\hat{w}, \hat{b})
(w^,b^),将使得损失函数
L
L
L达到最小值,即:
(
w
^
,
b
^
)
=
a
r
g
m
i
n
w
,
b
∑
(
y
i
−
w
x
i
−
b
)
2
(\hat{w}, \hat{b})=argmin_{w,b}\sum(y_i-wx_i-b)^2
(w^,b^)=argminw,b∑(yi−wxi−b)2
参数求解
使用梯度下降法求解参数
(
w
^
,
b
^
)
(\hat{w}, \hat{b})
(w^,b^),即分别对损失函数中的
w
,
b
w,b
w,b求一阶偏导数:
∂
∂
w
L
=
∂
∂
w
∑
(
y
i
−
w
x
i
−
b
)
2
=
2
(
w
x
i
+
b
−
y
i
)
x
i
\begin{aligned} \frac{\partial}{\partial_w}L &=\frac{\partial}{\partial_w}\sum(y_i-wx_i-b)^2 = 2(wx_i+b-y_i)x_i\end{aligned}
∂w∂L=∂w∂∑(yi−wxi−b)2=2(wxi+b−yi)xi
∂ ∂ b L = ∂ ∂ b ∑ ( y i − w x i − b ) 2 = 2 ( w x i + b − y i ) \begin{aligned} \frac{\partial}{\partial_b}L &=\frac{\partial}{\partial_b}\sum(y_i-wx_i-b)^2 = 2(wx_i+b-y_i)\end{aligned} ∂b∂L=∂b∂∑(yi−wxi−b)2=2(wxi+b−yi)
可以得到参数
w
w
w,
b
b
b的更新公式为:
w
⟵
w
−
η
(
w
x
i
+
b
−
y
i
)
x
i
w \longleftarrow w-\eta(wx_i+b-y_i)x_i
w⟵w−η(wxi+b−yi)xi
b
⟵
b
−
η
(
w
x
i
+
b
−
y
i
)
b \longleftarrow b-\eta(wx_i+b-y_i)
b⟵b−η(wxi+b−yi)
其中,
η
\eta
η为学习率,即学习的步长,取值范围在
[
0
,
1
]
[0,1]
[0,1]之间。
线性回归的scikit-learn实现
在scikit-learn中通过 sklearn.linear_model.LinearRegression 类进行实现,该类的主要参数和方法如下:
class sklearn.linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1)
参数
- fit_intercept:是否计算偏置项
- normalize:是否归一化
- n_jobs:指定CPU核数
属性
- coef_:输出模型的权重向量 w w w
- intercept_:输出模型的偏置项 b b b
方法
- fit(X_train, y_train):在训练集上训练模型
- score(X_test, y_test):返回模型在测试集上的得分,这里的得分是实际上是决定系数
R
2
R^2
R2,可以理解成回归模型对原始数据的可解释程度,计算公式如下:
R 2 = 1 − ∑ ( y i − y i ^ ) 2 ∑ ( y i − y i ˉ ) 2 = 1 − 回 归 误 差 均 方 误 差 R^2 = 1-\frac{\sum(y_i-\hat{y_i})^2}{\sum(y_i-\bar{y_i})^2}=1-\frac{回归误差}{均方误差} R2=1−∑(yi−yiˉ)2∑(yi−yi^)2=1−均方误差回归误差
我们使用官方自带的波士顿房价数据建立线性回归预测模型,代码运行环境如下:
系统/软件 | 版本 |
---|---|
Windows | Windows 10专业版 |
Python | Python 3.7 |
# 忽略警告
import warnings
warnings.filterwarnings('ignore')
# 导入波士顿房价数据
from sklearn.datasets import load_boston
boston = load_boston()
X = boston.data
y = boston.target
print (X.shape)
print(y.shape)
'''
上述步骤运行结果如下:
(506, 13)
(506,)
'''
# 划分数据集:训练集、测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y)
# 数据标准化
from sklearn import preprocessing
standard_X = preprocessing.StandardScaler()
X_train = standard_X.fit_transform(X_train)
X_test = standard_X.fit_transform(X_test)
standard_y = preprocessing.StandardScaler()
y_train = standard_y.fit_transform(y_train.reshape(-1, 1))
y_test = standard_y.fit_transform(y_test.reshape(-1, 1))
# 使用普通线性回归模型训练和预测
from sklearn.linear_model import LinearRegression
model_linearRegression = LinearRegression()
model_linearRegression.fit(X_train, y_train.ravel())
print('普通线性回归模型得分:%.3f'% model_linearRegression.score(X_test, y_test.ravel()))
print('特征权重:', model_linearRegression.coef_)
print('偏置值', model_linearRegression.intercept_)
'''
普通线性回归模型得分:0.778
特征权重: [-1.25033986e-01 8.31820979e-02 2.21863444e-03 4.95293742e-02
-2.30770283e-01 2.66947733e-01 3.62496237e-04 -3.38742538e-01
3.13757680e-01 -2.00036848e-01 -2.48256928e-01 1.24455186e-01
-4.28563706e-01]
偏置值 3.997687893659791e-15
'''
# 画图(以普通线性回归模型的测试集数据示例)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] # 设置中文显示
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
fig = plt.figure(figsize=(20, 5), dpi=100)
ax = fig.add_subplot(111)
ax.set_title('线性回归模型得分:%.3f'%model_linearRegression.score(X_test, y_test.ravel()))
line1 = ax.plot(range(len(y_test)), y_test, 'b', label='真实值')
line2 = ax.plot(range(len(model_linearRegression.predict(X_test))), model_linearRegression.predict(X_test),'r--', label='预测值',linewidth=2)
legend = plt.legend(shadow=True)
legend.get_frame().set_facecolor('#6F93AE')
#保存图片
plt.savefig('线性回归模型结果.png')
#显示图片
plt.show()
最终可视化呈现如下:
可以看到模型最终的拟合效果与得分。