免費Python機器學習課程三:多項式回歸
線性回歸的改進版本中的多項式回歸。如果您知道線性回歸,那么對您來說很簡單。如果沒有,我將在本文中解釋這些公式。還有其他先進且更有效的機器學習算法。但是,學習基于線性的回歸技術是一個好主意。因為它們簡單,快速并且可以使用眾所周知的公式。盡管它可能不適用于復雜的數據集。
多項式回歸公式
僅當輸入變量和輸出變量之間存在線性相關性時,線性回歸才能很好地執(zhí)行。如前所述,多項式回歸建立在線性回歸的基礎上。如果您需要線性回歸的基礎知識,請訪問線性回歸:
Python中的線性回歸算法
學習線性回歸的概念并從頭開始在python中開發(fā)完整的線性回歸算法
多項式回歸可以更好地找到輸入要素與輸出變量之間的關系,即使該關系不是線性的。它使用與線性回歸相同的公式:
Y = BX + C
我敢肯定,我們都在學校學過這個公式。對于線性回歸,我們使用如下符號:

在這里,我們從數據集中獲得X和Y。X是輸入要素,Y是輸出變量。Theta值是隨機初始化的。
對于多項式回歸,公式如下所示:

我們在這里添加更多術語。我們使用相同的輸入功能,并采用不同的指數以制作更多功能。這樣,我們的算法將能夠更好地了解數據。
冪不必為2、3或4。它們也可以為1 / 2、1 / 3或1/4。然后,公式將如下所示:

成本函數和梯度下降
成本函數給出了預測假設與值之間的距離的概念。公式為:

這個方程可能看起來很復雜。它正在做一個簡單的計算。首先,從原始輸出變量中減去假設。取平方消除負值。然后將該值除以訓練示例數量的2倍。
什么是梯度下降?它有助于微調我們隨機初始化的theta值。我不打算在這里進行微積分。如果對每個θ取成本函數的偏微分,則可以得出以下公式:

在這里,alpha是學習率。您選擇alpha的值。
多項式回歸的Python實現
這是多項式回歸的逐步實現。
(1) 在此示例中,我們將使用一個簡單的虛擬數據集,該數據集提供職位的薪水數據。導入數據集:
- import pandas as pd
- import numpy as np
- df = pd.read_csv('position_salaries.csv')
- df.head()

(2) 添加theta 0的偏差列。該偏差列將僅包含1。因為如果將1乘以數字,則它不會改變。
- df = pd.concat([pd.Series(1, index=df.index, name='00'), df], axis=1)
- df.head()

(3) 刪除"位置"列。由于"位置"列中包含字符串,并且算法無法理解字符串。我們有"級別"列來代表職位。
- dfdf = df.drop(columns='Position')
(4) 定義我們的輸入變量X和輸出變量y。在此示例中,"級別"是輸入功能,而"薪水"是輸出變量。我們要預測各個級別的薪水。
- y = df['Salary']X = df.drop(columns = 'Salary')
- X.head()

(5) 以"級別"列的指數為基礎,創(chuàng)建"級別1"和"級別2"列。
- X['Level1'] = X['Level']**2
- X['Level2'] = X['Level']**3
- X.head()

(6) 現在,標準化數據。用每一列除以該列的最大值。這樣,我們將獲得每列的值,范圍從0到1。即使沒有規(guī)范化,該算法也應該起作用。但這有助于收斂更快。同樣,計算m的值,它是數據集的長度。
- m = len(X)
- XX = X/X.max()
(7) 定義假設函數。這將使用X和theta來預測" y"。
- def hypothesis(X, theta):
- y1 = theta*X
- return np.sum(y1, axis=1)
(8) 使用上面的成本函數公式定義成本函數:
- def cost(X, y, theta):
- y1 = hypothesis(X, theta)
- return sum(np.sqrt((y1-y)**2))/(2*m)
(9) 編寫梯度下降函數。我們將不斷更新theta值,直到找到最佳成本。對于每次迭代,我們將計算成本以供將來分析。
- def gradientDescent(X, y, theta, alpha, epoch):
- J=[]
- k=0
- while k < epoch:
- y1 = hypothesis(X, theta)
- for c in range(0, len(X.columns)):
- theta[c] = theta[c] - alpha*sum((y1-y)* X.iloc[:, c])/m
- j = cost(X, y, theta)
- J.append(j)
- k += 1
- return J, theta
(10) 定義了所有功能。現在,初始化theta。我正在初始化零數組。您可以采用任何其他隨機值。我選擇alpha為0.05,我將迭代700個紀元的theta值。
- theta = np.array([0.0]*len(X.columns))
- J, theta = gradientDescent(X, y, theta, 0.05, 700)
(11) 我們還獲得了最終的theta值以及每次迭代的成本。讓我們使用最終theta查找薪水預測。
- y_hat = hypothesis(X, theta)
(12) 現在根據水平繪制原始薪水和我們的預期薪水。
- %matplotlib inline
- import matplotlib.pyplot as plt
- plt.figure()
- plt.scatter(x=X['Level'],yy= y)
- plt.scatter(x=X['Level'], y=y_hat)
- plt.show()

我們的預測并不完全符合薪資趨勢,但接近。線性回歸只能返回一條直線。但是在多項式回歸中,我們可以得到這樣的曲線。如果該線不是一條好曲線,則多項式回歸也可以學習一些更復雜的趨勢。
(13) 讓我們繪制我們在梯度下降函數中每個時期計算的成本。
- plt.figure()
- plt.scatter(x=list(range(0, 700)), y=J)
- plt.show()

成本從一開始就急劇下降,然后下降緩慢。在一個好的機器學習算法中,成本應該一直下降直到收斂。請隨意嘗試不同的時期和不同的學習率(alpha)。
- 這是數據集:salary_data https://github.com/rashida048/Machine-Learning-With-Python/blob/master/position_salaries.csv
- 請點擊以下鏈接獲取完整的工作代碼:多項式回歸 https://github.com/rashida048/Machine-Learning-With-Python/blob/master/polynomial%20regression.ipynb