线性回归
定义:线性回归通过一个或者多个自变量与因变量之间之间进行建模的回归分析。特点为一个或多个称为回归系数的模型参数的线性组合
一元线性回归
一元线性回归的模型是模型中的变量只有一个。一元线性回归方程的表达式为
y
i
=
β
0
+
β
1
x
i
+
ϵ
i
y_{i} = \beta_{0}+\beta_{1}x_{i}+\epsilon_{i}
yi=β0+β1xi+ϵi
其中
β
0
\beta_{0}
β0、
β
1
\beta{1}
β1是变量的系数,
ϵ
i
\epsilon_{i}
ϵi是随机误差服从正态分布
N
(
0
,
1
)
N(0,1)
N(0,1)
然后假设模型的预测值为
y
^
\hat{y}
y^,真实值为
y
y
y,然后得到模型的损失函数为
l
o
s
s
=
∑
i
=
1
n
(
y
^
−
y
)
2
loss = \sum^{n}_{i=1}(\hat{y}-y)^{2}
loss=i=1∑n(y^−y)2
使用最小二乘法进行求解之后可以解出
β
0
\beta_{0}
β0、
β
1
\beta{1}
β1。
β
0
=
y
ˉ
−
β
1
x
ˉ
\beta_{0}=\bar{y}-\beta_{1}\bar{x}
β0=yˉ−β1xˉ
β
1
=
∑
i
=
1
n
x
i
y
ˉ
−
∑
i
=
1
n
x
i
y
i
∑
i
=
1
n
(
x
i
−
x
ˉ
)
2
\beta_{1}=\frac{\sum^{n}_{i=1}x_{i}\bar{y}-\sum^{n}_{i=1}x_{i}y_{i}}{\sum^{n}_{i=1}(x_{i}-\bar{x})^{2}}
β1=∑i=1n(xi−xˉ)2∑i=1nxiyˉ−∑i=1nxiyi
多元线性回归
多元线性回归模型是模型中的变量有俩个或者多个。多元线性回归模型的表达式为
Y
=
X
β
+
ϵ
Y =X\beta+\epsilon
Y=Xβ+ϵ
其中
X
X
X的维度为
m
×
n
m\times n
m×n,
β
\beta
β的维度为
m
×
(
n
+
1
)
m\times (n+1)
m×(n+1)
然后假设模型的预测值为
Y
^
\hat{Y}
Y^,真实值为
Y
Y
Y,且
Y
^
=
X
β
\hat{Y}=X\beta
Y^=Xβ然后得到模型的损失函数为
l
o
s
s
=
1
2
(
X
β
−
Y
)
T
(
X
β
−
Y
)
loss =\frac{1}{2}(X\beta-Y)^{T}(X\beta-Y)
loss=21(Xβ−Y)T(Xβ−Y)
通过求导可以解出
β
=
(
X
T
X
)
−
1
X
T
Y
\beta=(X^{T}X)^{-1}X^{T}Y
β=(XTX)−1XTY
使用梯度下降法也可以对数据进行求解
β
i
←
β
i
−
l
r
∗
∂
l
o
s
s
∂
β
i
\beta_{i} \leftarrow \beta_{i}-lr*\frac{\partial loss}{\partial \beta_{i}}
βi←βi−lr∗∂βi∂loss
其中
l
r
lr
lr是指学习率,也是个超参数,需要进行指定,一般学习率都是比较小的。
模型评价
对于回归方程的结果,通常采用均方误差来衡量模型的优劣,均方误差记为
M
S
E
MSE
MSE。
M
S
E
=
1
m
∑
i
=
1
m
(
y
i
^
−
y
i
)
2
MSE=\frac{1}{m}\sum^{m}_{i=1}(\hat{y_{i}}-y_{i})^{2}
MSE=m1i=1∑m(yi^−yi)2
代码实现
本次使用的数据集为sklearn中的波士顿房价数据集
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
#导入数据集
boston = load_boston()
#切分数据集
x = boston.data
y = boston.target
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=123)
#对数据集进行标准化处理
std = StandardScaler()
x_train = std.fit_transform(x_train)
x_test = std.transform(x_test)
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train.reshape(-1,1))
y_test = std_y.transform(y_test.reshape(-1,1))
#使用回归模型的API进行拟合模型
LR = LinearRegression()
LR.fit(x_train,y_train)
print("查看回归模型的系数",LR.coef_)
y_pre = LR.predict(x_test)
#还原预测值
y_pre = std_y.inverse_transform(y_pre)
print("模型的误差为",mean_squared_error(y_pre,y_test)) #540.01
#使用梯度下降求解回归方程系数
from sklearn.linear_model import SGDRegressor
sgd = SGDRegressor()
sgd.fit(x_train,y_train)
print("查看回归模型的系数",sgd.coef_)
y_pre = sgd.predict(x_test)
#还原预测值
y_pre = std_y.inverse_transform(y_pre)
print("模型的误差为",mean_squared_error(y_pre,y_test)) #538.93
欠拟合和过拟合
在现实的生活中,回归模型所选取的变量往往存在线性相关的关系(多重共线性),那么模型的效果将会被严重的低估。在机器学习中,模型的效果不好有俩种,一种是过拟合,一种是欠拟合。
过拟合
过拟合是指模型在训练集上的准确率较高,而在测试集的准确率十分的低。这是说明了模型过度拟合原数据,导致模型发生了过度拟合的状况,使其泛化能力降低。
欠拟合
欠拟合是指模型对数据的拟合程度较低,无法从数据中提取出信息,导致模型在训练集和测试集的准确率都比较低。一般而言是因为模型学习的数据特征过少或是数据集的数量太少。
解决方法
对于欠拟合的模型而言,需要增加数据集的特征数量和数据的数量,使模型学习更多的信息。对于过拟合的模型而言,需要对数据集进行过滤,选择有用的特征、使用交叉验证,使数据都经过训练或者是使用正则化,降低模型的过拟合程度。
岭回归
岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。
岭回归是在原有的模型上加入L2正则项,使模型的系数变小,模型变得简单,不容易发生过拟合的情况。
岭回归的表达式为
Y
=
X
β
+
ϵ
+
λ
X
T
X
Y=X\beta +\epsilon+\lambda X^{T}X
Y=Xβ+ϵ+λXTX
其中
λ
\lambda
λ为超参数,一般通过搜索找到最优值,模型求解后得到
β
=
(
X
T
X
+
λ
I
)
−
1
X
T
Y
\beta =(X^{T}X+\lambda I)^{-1}X^{T}Y
β=(XTX+λI)−1XTY,这样可以防止
X
T
X
X^{T}X
XTX趋近于0,使得
β
\beta
β趋近于无穷大,从而使模型发生过拟合的状况
优点:岭回归得出的参数波动比较小, 模型比较稳定;能处理数据中存在病态数据的情况
代码实现
from sklearn.linear_model import Ridge
rd = Ridge(alpha=1.0)#指定lambda值
rd.fit(x_train,y_train)
print("查看回归模型的系数",rd.coef_)
y_pre = sgd.predict(x_test)
#还原预测值
y_pre = std_y.inverse_transform(y_pre)
print("模型的误差为",mean_squared_error(y_pre,y_test)) #538.93