过拟合与欠拟合
1.欠拟合
定义
- 一个在训练数据上不能获得很好的拟合,在训练集数据以外的数据集上也不能很好的拟合数据,此时认为这个假设出现了欠拟合的现象(模型过于简单)
- 原因:模型学习到样本的特征太少
- 解决:增加样本的特征数量(多项式回归)
1.1欠拟合处理:多项式回归
-
为了解决欠拟合的情况,经常要提高线型的次数(高次多项式)建立模型拟合曲线,次数过高会导致过拟合,次数低会导致欠拟合
-
y=w*x+b
,一次多项式函数【解决线型(回归的为直线)问题】 -
y=w1*x^2+w2x+b
,二次多项式函数【二次曲线】 -
…
-
实际上,多项式回归可以看成特殊的线性回归,即把
x^2
看成一个特征,把x看成另一个特征,这样就可以表示成y=w1x^2+w2x+b
,即多项式回归就变成了线性回归 -
还可以把
y=wx+b
转为更高的多项式,是否需要转换为更高次的多项式取决于想要拟合样本的程度,更高次的多项式可以更好的拟合我们的样本数据,但是也可能造成过拟合
1.3多项式回归API
-
根据二次多项式公式可知,需要添给原始数据添加更高次的特征数据x^2,
-
使用
sklearn.preporcessing.PolynomialFeatures
来进行高次特征的创建 -
它是使用多项式的方法来进行的,如果有a,b两个特征,2次多项式就为
(1,a,b,a^2,ab,b^2)
-
PolynomialFeatures
三个参数参数 含义 degree 默认为2,控制多项式的度【最高次项】 interaction_only 默认为False,如果指定True,那么就不会有自己特征和自己结合的项,2次项就为(1,a,b,ab) include_bias 默认为True,如果为False,就不会有1的那一项,2次项就为 (a,b,a^2,ab,b^2)
from sklearn.preprocessing import PolynomialFeatures c=[[5,10]] #[[a,b]] p1=PolynomialFeatures() #将特征数据变为高次特征数据 b=p1.fit_transform(c) b #array([[ 1., 5., 10., 25., 50., 100.]])
1.2案例
-
二次多项式与一次线性回归图
from sklearn.linear_model import LinearRegression import numpy as np import matplotlib.pyplot as plt from sklearn.preprocessing import PolynomialFeatures feature=[[6],[8],[10],[14],[18]] #蛋糕大小 target=[[7],[9],[13],[17.5],[18]] #蛋糕价格 #一次线性回归 regressor=LinearRegression() regressor.fit(feature,target) x1=np.linspace(0,25,100) x=x1.reshape(-1,1) y=regressor.predict(x) plt.scatter(feature,target) plt.plot(x,y) #建立二次多项式线性回归模型进行预测 ploy2=PolynomialFeatures(degree=2) #2次多项式特征生成器 x_train_poly2=ploy2.fit_transform(feature) #建立模型预测 regressor_ploy2=LinearRegression() regressor_ploy2.fit(x_train_poly2,target) #2次图像 x_ploy2=ploy2.transform(x) y_ploy2=regressor_ploy2.predict(x_ploy2) plt.scatter(feature,target) plt.plot(x,y,label='Degree1') plt.plot(x,y_ploy2,label='Degree2') plt.legend()
-
3次多项式与一次线性回归图
from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures import numpy as np import matplotlib.pyplot as plt feature=[[6],[8],[10],[14],[18]] #蛋糕大小 target=[[7],[9],[13],[17.5],[18]] #蛋糕价格 #一次线性回归 regressor=LinearRegression() regressor.fit(feature,target) x1=np.linspace(0,25,100) x=x1.reshape(-1,1) y=regressor.predict(x) plt.scatter(feature,target) plt.plot(x,y) #3次多项式 ploy3=PolynomialFeatures(degree=3) x_train_ploy3=ploy3.fit_transform(feature) #建立模型预测 regressor_ploy3=LinearRegression() regressor_ploy3.fit(x_train_ploy3,target) #画图 x_ploy3=ploy3.transform(x) y_ploy3=regressor_ploy3.predict(x_ploy3) plt.scatter(feature,target) plt.plot(x,y,label='Degree1') plt.plot(x,y_ploy3,label='Degree3') plt.legend()
2.过拟合
定义
- 一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据以外的数据集上却不能很好的拟合数据,此时认为这个假设出现了过拟合现象(模型过于复杂)
- 原因:原始特征过多,存在一些嘈杂特征
- 解决:
- 进行特征选择,消除关联性大的特征(难做);
- 正则化之邻回归
2.1过拟合处理:正则化
- 将过拟合的曲线的凹凸幅度减少就可以将过拟合曲线趋近于拟合曲线。过拟合曲线的凹凸幅度肯定是由高次项导致的,正则化就可以通过不断的尝试和发现高次项的特征,然后将这些高次特征的权重w调小,趋近于0,则高次项特征就没有了,那么凹凸幅度就减少了,就越趋近于拟合曲线
LinnerRegression
没有办法进行正则化,所以该模型容易出现过拟合,无法解决- 使用
L2
正则化- 可以使用带有正则化算法的回归模型(Ridge邻回归)处理过拟合的问题
2.2Ridge邻回归
-
API
from sklearn.linear_model import Ridge
Ridge(alpha=1.0):
alpha
:正则化的力度,力度越大,表示高次项的权重w越接近于0,导致过拟合曲线的凹凸幅度减小,取值:0-1小数或者1-10整数
coef_
:回归系数
from sklearn.linear_model import Ridge from sklearn.linear_model import LinearRegression import numpy as np import matplotlib.pyplot as plt feature=[[6],[8],[10],[14],[18]] #蛋糕大小 target=[[7],[9],[13],[17.5],[18]] #蛋糕价格 ploy3=PolynomialFeatures(degree=3) x_train_ploy3=ploy3.fit_transform(feature) regressor_ploy3=Ridge(alpha=0.8) regressor_ploy3.fit(x_train_ploy3,target) regressor_ploy3.coef_ #array([[ 0. , -0.08943533, 0.19485391, -0.00778026]])
-
优点
- 获取的回归系数更符合实际更可靠
- 在病态数据(异常值多的数据)偏多的研究中有更大的存在意义
3.模型的保存和加载
-
保存训练好模型,下次直接调用就可使用
-
import joblib
import joblib #linear训练好的模型 #保存模型 joblib.dump(linner,'./data/123.m') #加载模型 joblib.load('./data/123.m')