機器學習A-Z~多項式迴歸

以前的文章中已經學習過多元線性迴歸,如今來說講多項式迴歸。首先說說多項式線性迴歸,表達式能夠表示爲: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試試看,獲得結果後發現此次獲得的結果更加貼近與實際數據。因爲圖像中的線看起來是一段段的折線,而不是一個平滑的曲線,這裏咱們能夠對其進行優化一下從而獲得一條平滑的曲線。實際上就是讓其又更多的間距小的點來畫這個曲線,圖像和代碼以下:

最高次數爲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,很明顯後者更符合實際狀況,所以這裏多項式迴歸模型時更好的選擇。

相關文章
相關標籤/搜索