过拟合与欠拟合

过拟合与欠拟合

在这里插入图片描述

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')
    
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荼靡~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值