一.问题的引入
当训练集数据训练的很好,为什么在测试集上面就会出现问题?
原因:可能产生了过拟合
1.欠拟合
2.过拟合
分析:对于第一种情况,由于机器学习到的特征太少,导致区分标准太粗糙,不能准确识别。导致模型发生了欠拟合。
第二种情况,机器模型研究基本能够识别出具体的类别了,但是很不巧的是由于机器模型的训练数据的全部特征都是白色的,于是训练出来的模型认为天鹅都是白色的,对于黑色的天鹅就无法进行识别。导致模型发生了过拟合。
二.过拟合与欠拟合
1.过拟合
模型在训练数据集上可以很好的拟合数据,但是在测试集上却不能很好的表现数据,此时认为模型出现了过拟合现象。模型过于复杂!
- 原因:原始特征过多,存在一些嘈杂特征,模型需要去兼顾每一个测试数据点,导致模型过于复杂
- 解决办法:针对线性回归可以使用正则化。但是对于其他的机器学习模型除了决策树,神经网络等算法本身的作用,我们可以使用特征选择,删除,合并一些特征来进行处理。
如何解决?尽量减小高次项特征的影响。
- 正则化:学习的时候,数据提供的特征有些会影响模型的复杂度或者这个特征的数据异常点较多,所以再算法学习的时候尽量减少这个特征的影响,或者删除某个特征的影响,这个就是正则化。
- 再构建模型的时候,算法不知道某个特征的影响,而是去调整参数得出优化结果。
- 正则化的类别
(1) L2正则化:使得某些参数的权重W很小,甚至接近于0,削弱某个特征的影响
优点:越小的参数说明模型越简单,模型越简单说明模型越不容易产生过拟合现象
L2正则化也叫Ridge回归
加入L2正则化后的损失函数
(2)L1正则化
使得某些特征值前的权重系数为0,删除这个特征值的影响。
也叫LASSO回归
2.欠拟合
模型在测试集上不能很好的拟合数据,然后再测试集上也不能很好的拟合数据。模型过于简单。
3.带有L2正则化的线性回归-岭回归
岭回归也是一种线性回归。只是再算法建立回归方程的时候,加上正则化的限制,来解决模型的过拟合问题。
API:sklearn.linearmodel.Ridege(alph=1.0,fit _intercept=True,solver="auto",normalize=False)
正则化力度越大,权重系数会越小;
正则化力度越小,权重系数越大。
三.岭回归模型来预测波士顿房价
1.获取数据
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor
boston=load_boston()
2.拆分数据集
x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target)
3.特征工程
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
4.构建预估价器
estimator=SGDRegressor(learning_rate="constant",eta0=0.01,max_iter=1000,penalty="l1")
estimator.fit(x_train,y_train)
print("梯度下降权重系数为:n",estimator.coef_)
print("梯度下降偏置为:n",estimator.intercept_)
5.模型评估
y_predict=estimator.predict(x_test)
print("预测房价:n",y_predict)
from sklearn.metrics import mean_squared_error
error=mean_squared_error(y_test,y_predict)
print("梯度下降均方误差为:n",error)、
结果如下
梯度下降均方误差为:
23.81925675982709