线性回归中只能处理线性关系,处理非线性关系的数据时可以使用多元线性回归。

多项式回归 - 图1变成多项式回归 - 图2,也就是用一元线性回归的式子处理非线性的问题。也就是所谓的升维(增加特征列,但图像还是二维)。

调包使用

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn.linear_model import LinearRegression
  4. x = np.random.uniform(-3,3,size=100)
  5. X = x.reshape(-1, 1)
  6. y = 0.5 * x**2 + x + 2 + np.random.normal(0,1,size=100) # 生成正态分布的数据集,正太分布指的是大部分数据落在一块区间
  7. ''' # 添加多项式特征,最高为2次幂'''
  8. from sklearn.preprocessing import PolynomialFeatures
  9. poly = PolynomialFeatures(degree=2) # 添加多项式特征,最高为2次幂
  10. poly.fit(X)
  11. X2 = poly.transform(X)
  12. X2.shape # 第一列是x的0次方,第二列是原列,第三列是二次方列
  13. '''out: (100, 3)'''
  14. '''建立模型并用模型的参数预测标签'''
  15. lin_reg = LinearRegression()
  16. lin_reg.fit(X2, y)
  17. y_predict2 = lin_reg.predict(X2)
  18. '''绘制源数据散点图和预测标签曲线图'''
  19. plt.scatter(x, y)
  20. plt.plot(np.sort(x),y_predict2[np.argsort(x)],color='r')
  21. plt.show()

多项式回归 - 图3

  1. '''输出系数和截距'''
  2. print(lin_reg.coef_)
  3. print(lin_reg.intercept_)

pipline使用多项式回归

  1. from sklearn.pipeline import Pipeline
  2. from sklearn.preprocessing import StandardScaler
  3. poly_reg = Pipeline({
  4. ("poly",PolynomialFeatures(degree=2)),
  5. ("std_scaler", StandardScaler()), # 归一化是为了让梯度下降时效率更高
  6. ("lin_reg", LinearRegression())
  7. })
  8. poly_reg.fit(X,y)
  9. y_predict = poly_reg.predict(X)