首頁>技術>

線性迴歸的改進版本中的多項式迴歸。如果您知道線性迴歸,那麼對您來說很簡單。如果沒有,我將在本文中解釋這些公式。還有其他先進且更有效的機器學習演算法。但是,學習基於線性的迴歸技術是一個好主意。因為它們簡單,快速並且可以使用眾所周知的公式。儘管它可能不適用於複雜的資料集。

多項式迴歸公式

僅當輸入變數和輸出變數之間存線上性相關性時,線性迴歸才能很好地執行。如前所述,多項式迴歸建立線上性迴歸的基礎上。如果您需要線性迴歸的基礎知識,請訪問線性迴歸:

Python中的線性迴歸演算法學習線性迴歸的概念並從頭開始在python中開發完整的線性迴歸演算法

多項式迴歸可以更好地找到輸入要素與輸出變數之間的關係,即使該關係不是線性的。它使用與線性迴歸相同的公式:

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() 
dfdf = df.drop(columns='Position') 

(4) 定義我們的輸入變數X和輸出變數y。在此示例中,"級別"是輸入功能,而"薪水"是輸出變數。我們要預測各個級別的薪水。

y = df['Salary']X = df.drop(columns = 'Salary') X.head() 

(5) 以"級別"列的指數為基礎,建立"級別1"和"級別2"列。

X['Level1'] = X['Level']**2 X['Level2'] = X['Level']**3 X.head() 

(6) 現在,標準化資料。用每一列除以該列的最大值。這樣,我們將獲得每列的值,範圍從0到1。即使沒有規範化,該演算法也應該起作用。但這有助於收斂更快。同樣,計算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

13
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 史上最全:近萬字總結延遲任務實現方式!附程式碼(強烈推薦)