在線性回歸中诡渴,我們是尋找一條直線來(lái)盡可能的擬合數(shù)據(jù)。但是我們?cè)诖蟛糠智闆r下并不滿足簡(jiǎn)單的線性回歸的菲语。如下圖所示的這種特殊的線性回歸的情況妄辩,這種特殊的回歸方法被稱為多項(xiàng)式回歸(Polynomial regression)。
有以下數(shù)據(jù):
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (8,6)
x = np.random.uniform(-3, 3, size = 100)
y = 2 * x ** 2 + 3 * x + 3 + np.random.normal(0, 1, size = 100) # 加上一點(diǎn)噪聲
plt.scatter(x, y)
plt.show()
如果用普通的線性回歸的話:
from sklearn.linear_model import LinearRegression
X = x.reshape(-1,1)
lin_reg = LinearRegression()
lin_reg.fit(X, y)
y_pred = lin_reg.predict(X)
plt.scatter(x, y)
plt.scatter(x, y_pred, color = 'r')
plt.show()
可見(jiàn)用線性回歸去擬合明顯不好山上。為了解決這個(gè)問(wèn)題眼耀,可以增加一個(gè)X的平方的特征:
X2 = np.hstack([X, X**2])
lin_reg2 = LinearRegression()
lin_reg2.fit(X2, y)
y_pred2 = lin_reg2.predict(X2)
plt.scatter(x, y)
plt.scatter(x, y_pred2, color = 'r')
plt.show()
其實(shí)在sklearn中有封裝好的方法(sklearn.preprocessing.PolynomialFeatures
),我們不必自己去生成這個(gè)特征了:
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2) # 添加幾次方特征
poly.fit(X)
X2 = poly.transform(X)
# 訓(xùn)練
lin_reg = LinearRegression()
lin_reg.fit(X2, y)
y_pred = lin_reg.predict(X2)
plt.scatter(x, y)
plt.scatter(x, y_pred, color = 'r')
plt.show()
也可以寫(xiě)到pipeline中調(diào)用佩憾,會(huì)更方便:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
poly_reg = Pipeline([
("poly", PolynomialFeatures(degree=2)),
("std_scaler", StandardScaler()),
("lin_reg", LinearRegression())
])
poly_reg.fit(X,y)
y_pred = poly_reg.predict(X)