PolynomialFeatures中不同degree的值对拟合结果的影响

使用 scikit-learn提供的PolynomialFeatures 类进行特征的构造, 例如有两个特征a和b,由这两个特征构造的特征项为[1, a, b, a2, a*b, b2]。

PolynomialFeatures 类有 3 个参数:

degree:控制多项式的次数;

  • 用来升维数据,在线性回归算法中,多重回归需要把x数据升维,比如测试数据是曲线,你用直线去拟合,那就不行。
  • 升维时,维度也不能过高,过高会造成过拟合;过低会造成欠拟合。这需要去尝试。

interaction_only:默认为 False,如果指定为 True,那么就不会有特征本身和本身结合的项,组合的特征中没有 a2 和 b2;
include_bias:默认为 True 。如果为 True 的话,那么结果中就会有 0 次幂项,即全为 1 这一列。

多项式拟合过程中,PolynomialFeatures函数的degree值对拟合结果的影响

一、导入包

import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

二、准备数据

生成100个数据,其中X的取值在 [-3,3] 之间随机抽取100个,y为X的一元二次函数,其中截距项符合高斯分布

m = 100
X = 6 * np.random.rand(m, 1) - 3
y = 0.5 * X ** 2 + X + np.random.randn(m, 1)
plt.plot(X, y, "b.")
plt.xlabel("X_1")
plt.ylabel("y")
plt.axis([-3, 3, -5, 10])
plt.show()

三、通过PolynomialFeatures生成多项式系数

# 生成包含2次项和1次项多项式系数,偏差值不保留
poly_features = PolynomialFeatures(degree=2, include_bias=False)
# 将X变换为X的平方和X组成的项
X_poly = poly_features.fit_transform(X)
# 查看下变换的结果
print(X[0], X_poly[0])

四、通过线性回归,拟合方程y,可以发现拟合系数和方程y的值接近

# 采用线性回归拟合数据
reg = LinearRegression()
reg.fit(X_poly, y)
# 比较方程y = 0.5 * X ** 2 + X + np.random.randn(m, 1)的参数,可以发现二者区别不大
print(reg.coef_, "\n", reg.intercept_)

五、验证拟合结果


plt.plot(X, y, "b.")
plt.plot(X_new, y_new, "--", label="prediction")
plt.axis([-3, 3, -5, 10])
plt.legend()
plt.show()

六、对比不同degree的值对拟合结果的影响

plt.figure(figsize=(40, 20), dpi=200)
for style, width, degree in (("g-", 1, 50), ("b--", 2, 10), ("r-+", 3, 1)):
    poly_features = PolynomialFeatures(degree=degree, include_bias=False)
    std = StandardScaler()    
    reg = LinearRegression()    
    poly_reg = Pipeline([("poly_features", poly_features), ("std", std), ("reg", reg)])    
    poly_reg.fit(X, y)    
    y_new_2 = poly_reg.predict(X_new)    
    plt.plot(X_new, y_new_2, style, label=str(degree), linewidth=width)

plt.plot(X, y, "b.")
plt.axis([-3, 3, -5, 10])
plt.legend()
plt.show()

可以看出,degree的值对拟合结果的影响非常明显,degree的值越大,越容易出现过拟合的现象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值