初探機器學習之線性回歸
機器學習是進行數據分析的一個數學工具,而線性回歸,是機器學習中比較簡單的一個數據建模。通過線性回歸的研究,了解機器學習的基本步驟,掌握核心的概念,如相關係數,協方差,決定係數,最佳擬和線,了解機器學習的工具包sklearn。
本文通過一個簡單案例,對線性回歸進行介紹,讓我們對線性回歸有更直觀和貼切的感受。按照五個步驟逐一展開。提出問題,理解數據,數據清洗,構建模型,模型評估。
提出問題
小明今年在上高三了,他把高二的時候,他們班的學霸,學草,還有學渣的學習時間和成績進行一個統計。他想從學習時間和學習成績上找到關係,為高三這一年學習制定學習策略。
他的數據樣本來自多名學生,具有抽樣的特性。提供的數據如下:
理解數據
面對一堆數據,首先我們自己應該也有一定認知。從常理上講,學習時間越久,成績越高。通過上圖的數據分析,大概可以看出這個趨勢。為了更直觀,先把數據在散點圖上現實出來。這樣更容易看到大體的趨勢了。
通過上圖,可以大致看到隨著學習時間加長,分數也在提高的趨勢。那是是不可以找到這樣的一個直線,直線描繪成績與學習時間之間的關係呢?答案是顯然的。
通過上圖,直線會很多條,那一條才是最優的呢?預測精度會更高呢?
需要用到線性回歸模型,根據現有的數據,求出最佳擬合曲線。在構建線性回歸模型時,通常會對數據集進行分割。學習數據集和測試數據集之間的分配比例是8:2或7:3。
數據清洗
從數據導入數據。需要把一些空的數據項提出,一些格式不滿足要求的數據,整理成符合要求的數據。
導入數據如下:
先調用OrederedDict 函數,把數據集變成有序的集合,然後再通過DataFrame,把它變成DataFrame 格式。並且調用dropna函數,把空的數據剔除。最終數據顯示的效果如圖1所示。
構建模型
進行線性擬合之前,需要評估一下兩個變數之間線性擬合度。線性擬合度,有一個專業的辭彙叫相關係數。相關係數是用來反映變數之間相關密切程度的統計指標。公式如下:
相關係數在-1~1之間。大於0,表示正相關,小於0,表示負相關。等於0,表示完全不相關。相關程度如下,相關係數的絕對值介於0.6~1之間,表示強相關。絕對值介於0.3~0.6,表示中等程度相關。絕對值介於0~0.3,表示弱相關。
為了對相關係數有更多的直觀認識,可以訪問
http://istics.net/Correlations/觀察不同的相關係數對應的散點圖。
為了計算相關係數,需要調用corr函數。它返回一個是相關係數矩陣。通過矩陣,可以獲取所有變數的相關。還可以發現在矩陣正對角線的位置上,它相關係數為1,這是因為同一個變數之間計算相關係數,當然是強相關。
學習時間和分數之間的相關係數為0.9240,屬於強相關。
為了得到最佳擬合線,將數據集進行劃分。80%的數據隨機劃分為訓練數據,20%的數據劃分為測試數據。如下:
from sklearn.cross_validation import train_test_splitX_train,X_test,y_train,y_test = train_test_split(exam_X,exam_y,train_size=0.8)
將數據集劃分之後,X_train,y_train,分別為訓練數據的特徵和標籤,通過訓練數據集,得到最佳擬合線。X_test,y_test,分別為測試數據,對最佳擬合線進行評估,算得決定係數R。
sklearn為機器學習的一個庫,裡面提供大量的機器學習函數。對於初學者來說,先不用弄懂這個演算法的具體實現,知道怎麼使用即可。等後續隨著學習的深入,可以逐一加深理解。
scikit-learn 可以通過google,找到相關的介紹。官方網站如下
scikit-learn: machine learning in Python最佳擬合線求解,需要調用sklearn中的LinearRegression 函數。這個函數會返回最佳擬合線的截距和斜率(也就是回歸係數)。過程如下:
from sklearn.linear_model import LinearRegression#使用線性回歸函數構建數據模型model = LinearRegression()model.fit(X_train.reshape(-1,1),y_train.reshape(-1,1))#計算截距a=model.intercept_ #計算回歸係數b=model.coef_
reshape(-1,1),函數是對一維數據進行整形,把一維數據變成N行一列的二維數組。
模型評估
對最佳的擬合線進行展示,觀察擬合效果
繪製最佳直線。參考如下代碼
#訓練值得到預測值,調用的函數是predict。y_train_pred = model.predict(X_train.reshape(-1,1))plt.scatter(X_train,y_train,color=b,label="train data")#繪製直線,調用plot函數plt.plot(X_train,y_train_pred,color=yellow,linewidth_=3,label=best line)plt.legend(loc=2)plt.xlabel(Hours)plt.ylabel(Score)plt.show()
再用測試集對最佳擬合線進行計算評估。評估的方法,使用決定係數R。它用來衡量回歸直線的擬合程度。R越大,表示擬合程度越高。其公式如下:
實際計算,有現成的函數直接調用,但是要知道這個函數的含義。
上述模型算得決定係數R值為:
可以判斷,採用擬合曲線進行擬合,擬合程度比較高。如果進行預測,大概率上符合預測預期。如果小明通過這個曲線,可以指定學習策略,在保證正常休息的情況下,投入更多時間學習,學習成績是可以提高的。
結論
本文主要講述使用簡單線性回歸,通過線性回歸,對未來的結果進行一個預測。為了保證保證預測效果,需要講數據集進行分類,分為訓練集和測試集。訓練集是用來獲取最佳擬合線,而測試集,是用來測試評估擬合的效果。通過上述案例,可以發現最佳曲線擬合程度比較高,通過它進行預測,大概率上能夠得到期望的結果。
推薦閱讀:
※集智:負基礎就能學會的機器學習(二) 無需任何編程基礎
※斯坦福CS231n項目實戰(三):Softmax線性分類
※機器學習入門之邏輯回歸分類
※Andrew Ng機器學習week 2(Linear Regression)編程作業詳解
※Zero-Shot Learning with Semantic Output Codes(NIPS2009)