免費(fèi)Python機(jī)器學(xué)習(xí)課程三:多項(xiàng)式回歸
線(xiàn)性回歸的改進(jìn)版本中的多項(xiàng)式回歸。如果您知道線(xiàn)性回歸,那么對(duì)您來(lái)說(shuō)很簡(jiǎn)單。如果沒(méi)有,我將在本文中解釋這些公式。還有其他先進(jìn)且更有效的機(jī)器學(xué)習(xí)算法。但是,學(xué)習(xí)基于線(xiàn)性的回歸技術(shù)是一個(gè)好主意。因?yàn)樗鼈兒?jiǎn)單,快速并且可以使用眾所周知的公式。盡管它可能不適用于復(fù)雜的數(shù)據(jù)集。
多項(xiàng)式回歸公式
僅當(dāng)輸入變量和輸出變量之間存在線(xiàn)性相關(guān)性時(shí),線(xiàn)性回歸才能很好地執(zhí)行。如前所述,多項(xiàng)式回歸建立在線(xiàn)性回歸的基礎(chǔ)上。如果您需要線(xiàn)性回歸的基礎(chǔ)知識(shí),請(qǐng)?jiān)L問(wèn)線(xiàn)性回歸:
Python中的線(xiàn)性回歸算法
學(xué)習(xí)線(xiàn)性回歸的概念并從頭開(kāi)始在python中開(kāi)發(fā)完整的線(xiàn)性回歸算法
多項(xiàng)式回歸可以更好地找到輸入要素與輸出變量之間的關(guān)系,即使該關(guān)系不是線(xiàn)性的。它使用與線(xiàn)性回歸相同的公式:
Y = BX + C
我敢肯定,我們都在學(xué)校學(xué)過(guò)這個(gè)公式。對(duì)于線(xiàn)性回歸,我們使用如下符號(hào):

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

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

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

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

在這里,alpha是學(xué)習(xí)率。您選擇alpha的值。
多項(xiàng)式回歸的Python實(shí)現(xiàn)
這是多項(xiàng)式回歸的逐步實(shí)現(xiàn)。
(1) 在此示例中,我們將使用一個(gè)簡(jiǎn)單的虛擬數(shù)據(jù)集,該數(shù)據(jù)集提供職位的薪水?dāng)?shù)據(jù)。導(dǎo)入數(shù)據(jù)集:
- import pandas as pd
- import numpy as np
- df = pd.read_csv('position_salaries.csv')
- df.head()

(2) 添加theta 0的偏差列。該偏差列將僅包含1。因?yàn)槿绻麑?乘以數(shù)字,則它不會(huì)改變。
- df = pd.concat([pd.Series(1, index=df.index, name='00'), df], axis=1)
- df.head()

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

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

(6) 現(xiàn)在,標(biāo)準(zhǔn)化數(shù)據(jù)。用每一列除以該列的最大值。這樣,我們將獲得每列的值,范圍從0到1。即使沒(méi)有規(guī)范化,該算法也應(yīng)該起作用。但這有助于收斂更快。同樣,計(jì)算m的值,它是數(shù)據(jù)集的長(zhǎng)度。
- m = len(X)
- XX = X/X.max()
(7) 定義假設(shè)函數(shù)。這將使用X和theta來(lái)預(yù)測(cè)" y"。
- def hypothesis(X, theta):
- y1 = theta*X
- return np.sum(y1, axis=1)
(8) 使用上面的成本函數(shù)公式定義成本函數(shù):
- def cost(X, y, theta):
- y1 = hypothesis(X, theta)
- return sum(np.sqrt((y1-y)**2))/(2*m)
(9) 編寫(xiě)梯度下降函數(shù)。我們將不斷更新theta值,直到找到最佳成本。對(duì)于每次迭代,我們將計(jì)算成本以供將來(lái)分析。
- 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) 定義了所有功能?,F(xiàn)在,初始化theta。我正在初始化零數(shù)組。您可以采用任何其他隨機(jī)值。我選擇alpha為0.05,我將迭代700個(gè)紀(jì)元的theta值。
- theta = np.array([0.0]*len(X.columns))
- J, theta = gradientDescent(X, y, theta, 0.05, 700)
(11) 我們還獲得了最終的theta值以及每次迭代的成本。讓我們使用最終theta查找薪水預(yù)測(cè)。
- y_hat = hypothesis(X, theta)
(12) 現(xiàn)在根據(jù)水平繪制原始薪水和我們的預(yù)期薪水。
- %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()

我們的預(yù)測(cè)并不完全符合薪資趨勢(shì),但接近。線(xiàn)性回歸只能返回一條直線(xiàn)。但是在多項(xiàng)式回歸中,我們可以得到這樣的曲線(xiàn)。如果該線(xiàn)不是一條好曲線(xiàn),則多項(xiàng)式回歸也可以學(xué)習(xí)一些更復(fù)雜的趨勢(shì)。
(13) 讓我們繪制我們?cè)谔荻认陆岛瘮?shù)中每個(gè)時(shí)期計(jì)算的成本。
- plt.figure()
- plt.scatter(x=list(range(0, 700)), y=J)
- plt.show()

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