试图学得一个通过属性的线性组合来进行预测的函数:
f ( x ) = w 1 x 1 + w 2 x 2 + . . . + w d x d + b f(x)=w_{1}x_{1}+w_{2}x_{2}+...+w_{d}x_{d}+b f(x)=w1x1+w2x2+...+wdxd+b
定义:线性回归通过一个或者多个自变量与因变量之问之间进行建模的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合
通用公式:
h ( w ) = w 0 + w 1 x 1 + w 2 x 2 + . . . = w T x h(w)=w_{0}+w_{1}x_{1}+w_{2}x_{2}+...=w^Tx h(w)=w0+w1x1+w2x2+...=wTx
其中,w,x为矩阵:
w = ( w 0 w 1 w 2 ) w=\begin{pmatrix} w_0\\ w_1\\ w_2\\ \end{pmatrix} w=⎝⎛w0w1w2⎠⎞
x = ( 1 x 1 x 2 ) x=\begin{pmatrix} 1\\ x_1\\ x_2\\ \end{pmatrix} x=⎝⎛1x1x2⎠⎞
预测结果与真实值是有一定的误差
总损失定义:
J ( θ ) = ( h w ( x 1 ) − y 1 ) 2 + ( h w ( x 2 ) − y 2 ) 2 + . . . + ( h w ( x m ) − y m ) 2 J(\theta)=(h_w(x_1)-y_1)^2+(h_w(x_2)-y_2)^2+...+(h_w(x_m)-y_m)^2 J(θ)=(hw(x1)−y1)2+(hw(x2)−y2)2+...+(hw(xm)−ym)2
= ∑ i = 1 m ( h w ( x i ) − y i ) 2 =\sum_{i=1}^m(h_w(x_i)-y_i)^2 =i=1∑m(hw(xi)−yi)2
如何去求模型当中的W,使得损失最小?
(目的是找到最小损失对应的W值)
最小二乘法之正规方程(不做要求)
w = ( X T X ) − 1 X T y w=(X^TX)^{-1}X^Ty w=(XTX)−1XTy
X为特征值矩阵,y为目标值矩阵
缺点:当特征过于复杂,求解速度太慢;对于复杂的算法,不能使用正规方程求解(逻辑回归等)
最小二乘法之梯度下降
以单变量中的 w 0 , w 1 w_0,w_1 w0,w1为例:
w 1 = − w 1 − α ( ∂ cos t ( w 0 + w 1 x 1 ) ∂ w 1 ) w_1=-w_1-\alpha\left (\frac {\partial{\cos t(w_{0}+w_{1}x_{1})}} {\partial{w_{1}}} \right) w1=−w1−α(∂w1∂cost(w0+w1x1))
w 0 = − w 0 − α ( ∂ cos t ( w 0 + w 1 x 1 ) ∂ w 1 ) w_0=-w_0-\alpha\left (\frac {\partial{\cos t(w_{0}+w_{1}x_{1})}} {\partial{w_{1}}} \right) w0=−w0−α(∂w1∂cost(w0+w1x1))
α \alpha α为学习率,需要手动指定,
∂ cos t ( w 0 + w 1 x 1 ) ∂ w 1 \frac{\partial{\cos t(w_{0}+w_{1}x_{1})}}{\partial{w_{1}}} ∂w1∂cost(w0+w1x1)表示方向
理解:沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后更新
参考文档
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过 Euler integral
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
sklearn.linear_model.LinearRegression
正规方程
sklearn.linear_model.SGDRegressor
梯度下降
sklearn.linear_model.LinearRegression()
sklearn.linear_model.SGDRegressor( )
流程
1、波士顿地区房价数据获取
2、波士顿地区房价数据分割
3、训练与测试数据标准化处理
4、使用最简单的线性回归模型LinearRegression和梯度下降估计SGDRegressor对房价进行预测
代码
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
def mylinear():
# 获取数据
lb=load_boston()
#分割
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
print(y_train,y_test)
#标准化(目标值需要标准化吗?需要,否则x计算后与y差距很大,后续可通过inverse_transform转换回来)
#实例化两个标准化API
std_x=StandardScaler()
x_train=std_x.fit_transform(x_train)
x_test=std_x.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))
# 预测
lr=LinearRegression()
lr.fit(x_train,y_train)
print(lr.coef_)
#预测测试集房子价格
y_predict=std_y.inverse_transform(lr.predict(x_test))
print("测试集中房子预测价格:",y_predict)
return None
mylinear()
结果:
[[-0.07467382 0.07732555 0.02364533 0.0663568 -0.20713084 0.3195057
-0.00632141 -0.30715911 0.23733141 -0.19967829 -0.23709455 0.10231363
-0.37638967]]
测试集中房子预测价格: [[23.51063754]
[13.35629776]
[23.64063601]
...
[33.68088207]
[27.02842901]
[26.20574798]]
# SGD预测
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print(sgd.coef_)
# 预测测试集房子价格
y_predict = std_y.inverse_transform(sgd.predict(x_test))
print("测试集中房子预测价格:", y_predict)
结果:
[-0.05730963 0.01562689 -0.03388252 0.07846016 -0.07653516 0.36513421
-0.01739758 -0.1860541 0.06181751 -0.04777769 -0.20958852 0.09646331
-0.32850719]
测试集中房子预测价格: [23.28695233 12.3593322 22.85129124
...
31.26093941 25.81228545
26.37901119]
(均方误差(Mean Squared Error)MSE) 评价机制:
M S E = 1 m ∑ i = 1 m ( y i − y ‾ ) 2 MSE=\frac{1}{m}\sum_{i=1}^m (y^i-\overline{y})^2 MSE=m1∑i=1m(yi−y)2
sklearn回归评估API
sklearn.metrics.mean_squared_error
mean_squared_error(y_true,y_pred)
注:真实值,预测值为标准化之前的值
实例
y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
print("正规方程均方误差:",mean_squared_error(std_y.inverse_transform(y_test),y_lr_predict))
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
print("梯度下降均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
结果:
正规方程均方误差: 32.10789269504813
梯度下降均方误差: 33.79175991934641
线性回归器是最为简单、易用的回归模型。
从某种程度上限制了使用,尽管如此,在不知道特征之
间关系的前提下,我们仍然使用线性回归器作为大多数
系统的首要选择。
过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合
, 但是在训练数据外的数据集上却不能很好地拟合数据
,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:一个假设在训练数据上不能获得更好的拟合
, 但是在训练数据外的数据集上也不能很好地拟合数据
,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
原因:
学习到数据的特征过少
解决办法:
增加数据的特征数量
原因:
原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型尝试去兼顾各个测试数据点
解决办法:
特征选择:过滤式:低⽅差特征
嵌⼊式:正则化,决策树,神经⽹络
作用:可以使得W的每个元素都很小,都接近于0;尽量减小高次项特征的影响
优点:越小的参数说明模型越简单,越简单的模型则越不
容易产生过拟合现象
sklearn.linear_model.Ridge
sklearn.linear_model.Ridge(alpha=1.0)
** 案例**
from sklearn.datasets import load_boston
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
def mylinear():
# 获取数据
lb=load_boston()
#分割
x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25)
print(y_train,y_test)
#标准化(目标值需要标准化吗?需要,否则x计算后与y差距很大,后续可通过inverse_transform转换回来)
#实例化两个标准化API
std_x=StandardScaler()
x_train=std_x.fit_transform(x_train)
x_test=std_x.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))
# 预测
#岭回归预测
rd=Ridge(alpha=1.0)
rd.fit(x_train,y_train)
print(rd.coef_)
y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
print("测试集中房子预测价格:", y_rd_predict)
print("岭回归均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))
return None
mylinear()
测试集中房子预测价格: [[29.79041118]
[17.95605696]
[21.78228781]
...
[14.1836944 ]
[17.7654579 ]
[14.96521967]]
岭回归均方误差: 27.738423019827078
岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研究中有较大的实用价值。
线性回归:LInearRegression 容易出现过拟合