以前的文章中已經學習過多元線性迴歸,如今來說講多項式迴歸。首先說說多項式線性迴歸,表達式能夠表示爲:python
$$ y = b_0 + b_1x_1 + b_2x_1^2 + ... + b_nx_1^n $$學習
這個表達式和多元線性迴歸很是像,惟一的區別就是多項式線性迴歸中存在不少次方項,而多元線性迴歸中是多個變量。實際上這裏能夠把多元線性迴歸中的多個變量理解成多項式中的$x_n^2$。所謂線性看的是$b_0$一直到$b_n$這些參數的一個線性組合,跟自變量是否線性其實沒什麼關係,所以這種狀況依然是線性的。固然也存在非線性的多項式迴歸,好比這裏假設公式是$y = b_0/b_2 + b_3x_3$,這個時候就不是關於$b_0$一直到$b_n$這些參數的線性表達式了。那麼何時使用多項式迴歸呢,下面有一個例子:測試
圖像中的點表示數據集,若是用簡單或者多元線性迴歸顯然擬合效果不會很好,這個時候就可使用多項式迴歸來擬合,這裏擬合的圖像會變成一條曲線,更加符合當前數據集的實際狀況。優化
多項式迴歸的代碼實現和線性迴歸很接近,前幾個步驟仍是同樣的,這裏首先給出數據集:編碼
Position | Level | Salary |
---|---|---|
Business Analyst | 1 | 45000 |
Junior Consultant | 2 | 50000 |
Senior Consultant | 3 | 60000 |
Manager | 4 | 80000 |
Country Manager | 5 | 110000 |
Region Manager | 6 | 150000 |
Partner | 7 | 200000 |
Senior Partner | 8 | 300000 |
C-level | 9 | 500000 |
CEO | 10 | 1000000 |
這組數據集是某公司各個級別的職位對應的薪資,假設這個時候來了一個新人,咱們須要根據這份薪資表來決定要給他多少的薪水。第一步依然是導入數據集,因爲這裏沒有分類的變量,因此不須要進行虛擬編碼。再者因爲咱們須要根據這份數據來決定新人的薪資,所以這份數據其實就是訓練集,而新人的資料和薪資纔是測試集,這裏就不須要再將當前數據集拆分紅訓練集和測試集。spa
import pandas as pd from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures data_path = '../data/Position_Salaries.csv' dataset = pd.read_csv(data_path) X = dataset.iloc[:, 1:2].values y = dataset.iloc[:, 2].values
導入數據後咱們先進行線性迴歸的擬合,以後咱們會將擬合出的模型和多項式迴歸的模型進行比對。code
# Fitting Linear Regression to the Training set lin_reg = LinearRegression() lin_reg.fit(X, y)
接下來再進行多項式迴歸的擬合,這裏用的是sklearn.preprocessing中的PolynomialFeatures,這裏咱們根據數據假設最高此項爲2。orm
# Fitting Ploynomial Regression to the Training set poly_reg = PolynomialFeatures(degree=2) X_poly = poly_reg.fit_transform(X) lin_reg2 = LinearRegression() lin_reg2.fit(X_poly, y)
而後咱們看看兩種方式擬合的模型的效果:rem
# Visualising the Linear Regression results plt.scatter(X, y, c='r') plt.plot(X, lin_reg.predict(X), c='b') plt.title('Truth or Bluff (Linear Regression)') plt.xlabel('Position Level') plt.ylabel('Salary') plt.show() # Visualising the Polynomial Regression results plt.scatter(X, y, c='r') plt.plot(X, lin_reg.predict(X), c='b') plt.plot(X, lin_reg2.predict(poly_reg.fit_transform(X)), c='b') plt.title('Truth or Bluff (Polynomial Regression)') plt.xlabel('Position Level') plt.ylabel('Salary') plt.show()
下圖分別是線性迴歸模型和多項式迴歸模型結果:pandas
咱們發現多項式迴歸的確比線性迴歸更合適一點,但這裏的模型和實際數據依然有着不小的差距,那麼這裏就須要對擬合的方式進行一些調整,把最高次數調整成4試試看,獲得結果後發現此次獲得的結果更加貼近與實際數據。因爲圖像中的線看起來是一段段的折線,而不是一個平滑的曲線,這裏咱們能夠對其進行優化一下從而獲得一條平滑的曲線。實際上就是讓其又更多的間距小的點來畫這個曲線,圖像和代碼以下:
X_grid = np.arange(min(X), max(X), 0.1) X_grid = X_grid.reshape(len(X_grid), 1) plt.scatter(X, y, c='r') plt.plot(X_grid, lin_reg2.predict(poly_reg.fit_transform(X_grid)), c='b') plt.title('Truth or Bluff (Polynomial Regression)') plt.xlabel('Position Level') plt.ylabel('Salary') plt.show()
接下來,咱們要利用擬合好的模型來預測新人應當匹配的薪水,這裏也分別用線性迴歸和多項式迴歸模型來預測。假設新人在6-7等級之間,設置其等級爲6.5.
# Predicting a new result with Linear Regression lin_reg.predict(6.5) # Predicting a new result with Polynomial Regression lin_reg2.predict(poly_reg.fit_transform(6.5))
獲得的結果分別爲:330378.78787879和158862.45265153,很明顯後者更符合實際狀況,所以這裏多項式迴歸模型時更好的選擇。