一个在训练数据上不能获得很好的拟合,在训练集数据以外的数据集上也不能很好的拟合数据,此时认为这个假设出现了欠拟合的现象(模型过于简单)原因:模型学习到样本的特征太少解决:增加样本的特征数量(多项式回归) 案例
现在有一组天鹅的特征数据,对其进行模型训练,模型学习到的内容有翅膀,嘴巴长就是天鹅,然后使用模型进行预测,该模型可能会将所有符合这两个特征的动物都预测为天鹅,则会出现误差,因为鹦鹉,秃鹫都符合有翅膀,嘴巴长的特征原因:模型学习到的天鹅数据太少,区分标准太粗糙,不能准确的识别出天鹅 1.1欠拟合处理:多项式回归
为了解决欠拟合的情况,经常要提高线型的次数(高次多项式)建立模型拟合曲线,次数过高会导致过拟合,次数低会导致欠拟合
y=w*x+b,一次多项式函数【解决线型(回归的为直线)问题】
y=w1*x^2+w2x+b,二次多项式函数【二次曲线】
y=w1*x^3+w2x^2+w3*x+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 PolynomialFeaturesc=[[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 LinearRegressionimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.preprocessing import PolynomialFeaturesfeature=[[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 LinearRegressionfrom sklearn.preprocessing import PolynomialFeaturesimport numpy as npimport matplotlib.pyplot as pltfeature=[[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 Ridgefrom sklearn.linear_model import LinearRegressionimport numpy as npimport matplotlib.pyplot as pltfeature=[[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]])
优点
获取的回归系数更符合实际更可靠在病态数据(异常值多的数据)偏多的研究中有更大的存在意义 案例
先有一组特征数据,对其进行模型训练,模型学习到的内容是有翅膀,嘴巴长,白色,体型像2,脖子长且有弯度的就是天鹅,然后对其进行模型预测,现在有一组特征数据是黑天鹅,结果因为颜色不是白色,预测结果不是天鹅。
原因:模型学习到的特征已经基本可以区分天鹅和其他动物,但是学习到的特征有一项是白色,就导致黑天鹅无法识别,即机器学习的特征太依赖或太符合训练数据
3.模型的保存和加载
保存训练好模型,下次直接调用就可使用
import joblib
import joblib#linear训练好的模型#保存模型joblib.dump(linner,'./data/123.m')#加载模型joblib.load('./data/123.m')
https://www.luffycity.com/