1.回归问题
1.1 线性模型
试图学得一个通过属性的线性组合来进行预测的函数:
- w为权重,b称为偏置项,可以理解为
1.2 线性回归
定义:线性回归通过一个或者多个自变量与因变量之问之间进行建模的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合
- 一元线性回归:涉及到的变量只有一个
- 多元线性回归:涉及到的变量两个或两个以上
通用公式:
其中,w,x为矩阵:
预测结果与真实值是有一定的误差
1.3 损失函数(误差大小)
- 为第i个训练样本的真实值
- 为第i个训练样本特征值组合预测函数
总损失定义:
如何去求模型当中的W,使得损失最小?
(目的是找到最小损失对应的W值)
-
最小二乘法之正规方程(不做要求)
X为特征值矩阵,y为目标值矩阵
缺点:当特征过于复杂,求解速度太慢;对于复杂的算法,不能使用正规方程求解(逻辑回归等) -
最小二乘法之梯度下降
以单变量中的 为例:
为学习率,需要手动指定,
表示方向
理解:沿着这个函数下降的方向找,最后就能找到山谷的最低点,然后更新
Gamma公式展示 是通过 Euler integral
1.4 sklearn线性回归正规方程、梯度下降API
sklearn.linear_model.LinearRegression
正规方程
sklearn.linear_model.SGDRegressor
梯度下降
-
sklearn.linear_model.LinearRegression()
- 普通最小二乘线性回归
- coef_:回归系数
-
sklearn.linear_model.SGDRegressor( )
- 通过使用SGD最小化线性模型
- coef_:回归系数
1.5 波士顿房价数据案例分析
流程
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]
1.6 回归性能评估
(均方误差(Mean Squared Error)MSE) 评价机制:
sklearn回归评估API
sklearn.metrics.mean_squared_error
mean_squared_error(y_true,y_pred)
- 均方误差回归损失
- y_true:真实值
- y_pred:预测值
- return:浮点数结果
注:真实值,预测值为标准化之前的值
实例
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
1.7 LinearRegression与SGDRegressor评估
线性回归器是最为简单、易用的回归模型。
从某种程度上限制了使用,尽管如此,在不知道特征之
间关系的前提下,我们仍然使用线性回归器作为大多数
系统的首要选择。
- 小规模数据:LinearRegression(不能解决拟合问题)以及其它
- 大规模数据:SGDRegressor
2.过拟合与欠拟合
2.1 概念
过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合
, 但是在训练数据外的数据集上却不能很好地拟合数据
,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:一个假设在训练数据上不能获得更好的拟合
, 但是在训练数据外的数据集上也不能很好地拟合数据
,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
2.2 欠拟合原因以及解决办法
-
原因:
学习到数据的特征过少 -
解决办法:
增加数据的特征数量
2.3 过拟合原因以及解决办法
-
原因:
原始特征过多,存在一些嘈杂特征,模型过于复杂是因为模型尝试去兼顾各个测试数据点 -
解决办法:
- 进行特征选择,消除关联性大的特征(很难做)
- 交叉验证(让所有数据都有过训练)
- 正则化(了解)
特征选择:过滤式:低⽅差特征
嵌⼊式:正则化,决策树,神经⽹络
2.4 L2正则化
-
作用:可以使得W的每个元素都很小,都接近于0;尽量减小高次项特征的影响
-
优点:越小的参数说明模型越简单,越简单的模型则越不
容易产生过拟合现象
2.5 带有正则化的线性回归-Ridge
sklearn.linear_model.Ridge
sklearn.linear_model.Ridge(alpha=1.0)
- 具有l2正则化的线性最小二乘法
- alpha:正则化力度
- coef_:回归系数
正则化程度越高,权重越趋近于零
** 案例**
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
2.6 LinearRegression与Ridge对比
-
岭回归:回归得到的回归系数更符合实际,更可靠。另外,能让估计参数的波动范围变小,变的更稳定。在存在病态数据偏多的研究中有较大的实用价值。
-
线性回归:LInearRegression 容易出现过拟合
转载:https://blog.csdn.net/muguangjingkong/article/details/106542528