使用 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的值越大,越容易出现过拟合的现象。