輕鬆玩轉 Scikit-Learn 系列 —— 線性迴歸及 ML 相關評價標準
線性迴歸可能是機器學習中最簡單、最基礎的演算法了。但一定不要因為它簡單就輕視它的存在,因為它也是很多更高階機器學習演算法的基礎,比如多項式迴歸、嶺迴歸、 LASSO 迴歸等。線性迴歸的核心歸結為求解正規方程(由樣本特徵x所得預測值y'和實際值y差的平方和,對x求偏導並使其為0所得的方程組),也就是利用最小二乘法求解方程係數。當x為一個n維向量時,方程的物理意義也被擴充套件為求解一個n維超平面前的係數。在介紹線性迴歸之前,讓我們先了解下衡量線性迴歸預測結果好壞的指標。
1、相關評價標準
1)均方誤差 MSE (Mean Squared Error) :
2)均方根誤差 RMSE (Root Mean Squared Error) :
3)平均絕對誤差 MAE (Mean Absolute Error) :
4)R方誤差 ( R Squared ) :
應根據不同的應用場景和需求來選擇不同的評價指標,沒有其中一個平白無故的比另一個更好。具體來說,RMSE就是MSE的平方根,但它的量綱與要預測的y值的量綱相同,更有意義,MAE 因為帶有絕對值而不方便求導,而 R Squared 因為無量化而更具有通用的比較性。我們可以通過向量化計算在 Python 中很容易的實現這4中指標的計算。同時,你也可以直接在 scikit-learn 中的 metrics 中直接呼叫 mean_squared_error,mean_absolute_error,r2_score 方法直接計算得到 MSE、MAE、R Squared。
2、線性迴歸
1)小引—— kNN 迴歸
首先我們先回顧下上次的 kNN ,其實 kNN 不僅可以用於分類,還可以用來解決迴歸問題。以此來引入迴歸問題的鼻祖——線性迴歸。
Talk is cheap, let's see the code!
結果如下:
MAE: 3.651057, MSE: 25.966010, R2 Accuracy: 0.464484
0.602674505081
準確率並不是太高呢!比我拋硬幣好不了多少,是不是因為我們使用的是 kNN 迴歸預設的模型,而沒有調整任何超引數的原因的。那我們接下來先介紹下 kNN 迴歸的各個超引數,再用網格搜尋的方式搜尋 kNN 迴歸的最佳超引數。
● n_neighbors ——即 k 值,預設n_neighbors=5;weights:表示是否為距離加權重,預設 weights=’uniform’;
● algorithm —— 用於計算距離的演算法,預設algorithm=’auto’,即根據 fit 方法傳入值選擇合適演算法;
● p ——明可夫斯基距離的指數,預設p=2(歐氏距離),p=1 為曼哈頓距離;
● n_jobs ——呼叫CPU的核心數,預設 n_jobs=None;
上次我們學習kNN分類器的時候,用到了2層 for 迴圈搜尋最佳超引數,這次我們直接呼叫 scikit-learn 中的方法搜尋 kNN 迴歸的最佳超引數。實現如下:
結果如下:
{'n_neighbors': 6, 'p': 1, 'weights': 'distance'}
0.735424490609
好像準確度還不是很高呢!?是不是 kNN 這個演算法太簡單,已經落伍了呢?
其實,我們在選擇一種機器學習方法的時候是受領域限制的,不同的領域,不同種類的資料可能就適合不同的機器學習方法,沒有一種機器學習方法面對各種問題而無往不利,總是得到最佳結果(暫且不談深度學習),而且模型準確率的高低還受到資料質量的影響。那麼我接下來看看線性迴歸在波斯頓房價資料集上表現怎樣。
2)Linear Regression
結果為 0.800891619952 。
80% 好像還不錯,畢竟是預設模型嘛。讓我們看下線性迴歸都有哪些超引數呢!
● fit_intercept ——預設 fit_intercept=True,決定是否計算模型截距;
● normalize ——預設 normalize=False,如果fit_intercept=True,X 會在被減去均值併除以 L2 正則項之前正則化;
● n_jobs ——計算時所使用的CPU核心數;
結果為:
array([ -1.14235739e-01, 3.12783163e-02, -4.30926281e-02,
-9.16425531e-02, -1.09940036e+01, 3.49155727e+00,
-1.40778005e-02, -1.06270960e+00, 2.45307516e-01,
-1.23179738e-02, -8.80618320e-01, 8.43243544e-03,
-3.99667727e-01])
線性迴歸的特徵係數是具有實際意義的,係數為負說明 y 值與該特徵負相關,係數為正說明該特徵與 y 值正相關,且值越大,相關度越高。我們拿波斯頓房價資料集舉例說明,通過查詢官方文件,我們得到這13個特徵(按順序排列)的實際意義:
Attribute Information (in order)
● CRIM——per capita crime rate by town
● ZN——proportion of residential land zoned for lots over 25,000 sq.ft.
● INDUS——proportion of non-retail business acres per town
● CHAS——Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
● NOX——nitric oxides concentration (parts per 10 million)
● RM——average number of rooms per dwelling
● AGE——proportion of owner-occupied units built prior to 1940
● DIS——weighted distances to five Boston employment centres
● RAD——index of accessibility to radial highways
● TAX——full-value property-tax rate per $10,000
● PTRATIO——pupil-teacher ratio by town
● B——1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town
● LSTAT——% lower status of the population
● MEDV——Median value of owner-occupied homes in $1000's
為方便對應,我們將這13個特徵的名字按其係數大小排下序:
結果為
array(['NOX', 'DIS', 'PTRATIO', 'LSTAT', 'CRIM', 'CHAS', 'INDUS', 'AGE',
'TAX', 'B', 'ZN', 'RAD', 'RM'],
由此可知特徵 'NOX' 與房價的負相關度最高,檢視官方文件說明可知,其代表———房子附近的氮氧化物的濃度,我們根據常識就知道,氮氧化物有毒,房子附近氮氧化物濃度高的,價錢肯定便宜。特徵 'RM' 代表房子的平均房間數,同樣的,根據我們的生活經驗,房間數越多的房子一般也越貴,大家想想是不是。
今天的分享就到這裡了,關於 Linear Regression 還有很多超引數的調整,請小夥伴們自己在下面親手操作下,會收穫更多哦。還是那句話,如果你們中有大神路過,還請高抬貴腳,勿踩勿噴,嘻嘻。期待與小夥伴們共同進步!
原文釋出時間為:2018-11-22
本文作者:蜉蝣扶幽
本文來自雲棲社群合作伙伴“ ofollow,noindex">小詹學Python ”,瞭解相關資訊可以關注“ 小詹學Python ”。