我們已經知道機器學習方式大體上分爲兩種類別:監督學習和非監督學習。
監督學習指的是人類給機器一大堆標示(label)過的數據,通常指機器通過學習一系列(, )數據,X代表輸入數據(特徵Feature),Y代表輸出數據,然後自我推導到X -> Y的公式,用於未來其他數據的預測判斷使用。監督學習根據輸出數據又分爲迴歸問題(Regression)和分類問題(Classfication)。迴歸問題通常輸出是一個連續的數值,分類問題的輸出是幾個特定的數值。
舉例如下:
(a) 迴歸問題 - 給定一張人臉照片,估計出這個人的年齡(年齡輸出是一個連續的數值)
(b) 分類問題 - 假定一個人患有腫瘤,判斷是爲惡性還是良性(惡性和良性的輸出是幾個特定的數值)
這裏我們先來看下回歸問題裏的線性迴歸模型。
線性迴歸
線性迴歸模型是:利用線性函數對一個或多個自變量 (x 或 (
))和因變量(y)之間的關係進行擬合的模型。即:
向量形式爲:
,其中
。
將訓練樣本的 x 逐個帶入後,得出的預測年薪 f(x)'與真實f(x)的差異越小越接近線性迴歸模型。怎麼衡量這個整體差距呢?我們用下面這個公式,我們把它叫做爲損失函數,
形式如下:
那麼模型的優化目標爲最小化損失函數。要最小化損失函數,需要沿下降速度最快的方向走,使目標函數最小化。這就用到了上一節講過的算法:梯度下降法,來對其進行求解。
梯度下降法求解目標函數
舉例線性迴歸的目標函數爲:
對於 J(a,b) 而言,有兩個參數 a 和 b,函數 J 分別對自變量 a 和 b 取偏微分的結果是:
所以我們要做得是:
Step 1:任意給定 a 和 b 的初值,a = 0; b = 0;
Step 2:用梯度下降法求解 a 和 b,僞代碼如下:
當下降的高度小於某個指定的閾值(近似收斂至最優結果),則停止下降。
將上面展開的式子帶入上面代碼,就是:
所以梯度下降的通用形式爲:
編寫線性迴歸訓練/預測程序
如果我們要用代碼實現線性迴歸程序應該怎樣做呢?當然,你可以按照上面的描述,自己從頭用代碼實現一遍。
不過,其實不必。因爲我們已經有很多現成的方法庫,可以直接調用了。最常見的是 sklearn 庫。
下面的舉個例子,表格中列舉了美國紐約若干程序員職位的年薪。
我們用前6個數據作爲訓練集,後面5個作爲測試集,來看看結果:
import matplotlib.pyplot as plt import numpy as np from sklearn import datasets, linear_model from sklearn.metrics import mean_squared_error, r2_score experiences = np.array([0,1,2,3,4,5,6,7,8,9,10]) salaries = np.array([103100, 104900, 106800, 108700, 110400, 112300, 114200, 116100, 117800, 119700, 121600]) # 將特徵數據集分爲訓練集和測試集,除了最後5個作爲測試用例,其他都用於訓練 X_train = experiences[:7] X_train = X_train.reshape(-1,1) X_test = experiences[7:] X_test = X_test.reshape(-1,1) # 把目標數據(特徵對應的真實值)也分爲訓練集和測試集 y_train = salaries[:7] y_test = salaries[7:] # 創建線性迴歸模型 regr = linear_model.LinearRegression() # 用訓練集訓練模型——看就這麼簡單,一行搞定訓練過程 regr.fit(X_train, y_train) # 用訓練得出的模型進行預測 diabetes_y_pred = regr.predict(X_test) # 將測試結果以圖標的方式顯示出來 plt.scatter(X_test, y_test, color='black') plt.plot(X_test, diabetes_y_pred, color='blue', linewidth=3) plt.xticks(()) plt.yticks(()) plt.show()
最終結果是這個樣子的: