天天看點

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

機器學習有兩個非常重要的問題:

1.How well is my model doing?

如果我們已經訓練好了模型,該模型效果如何,用什麼方式來檢為測?

2.How do we improve the model based on these metrics?

如何根據這些檢測名額改善模型。

如何合理,科學,有效的評估和改善模型,是所有機器學習算法通用問題,是以單獨總結以下

1.分離資料:

将資料分為訓練集和測試集

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

注意: 永 遠 不 要 讓 測 試 集 進 入 訓 練 環 境 ‾ \underline{永遠不要讓測試集進入訓練環境} 永遠不要讓測試集進入訓練環境​;

# Import statements 
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np

# Import the train test split
# http://scikit-learn.org/0.16/modules/generated/sklearn.cross_validation.train_test_split.html

# USE from sklearn.model_selection import train_test_split to avoid seeing deprecation warning.
from sklearn.model_selection import train_test_split
#from sklearn.cross_validation import train_test_split

# Read in the data.
data = np.asarray(pd.read_csv('data.csv', header=None))
# Assign the features to the variable X, and the labels to the variable y. 
X = data[:,0:2]
y = data[:,2]

# Use train test split to split your data 
# Use a test size of 25% and a random state of 42
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
# Instantiate your decision tree model
model = DecisionTreeClassifier()

# TODO: Fit the model to the training data.
model.fit(X_train, y_train)
# TODO: Make predictions on the test data
y_pred = model.predict(X_test)

# TODO: Calculate the accuracy and assign it to the variable acc on the test data.
acc = accuracy_score(y_test, y_pred)

print(acc)
           
0.9583333333333334
           

2.混淆矩陣(evaluation matrix)

比如醫療模型,檢測結果可以分為四種境況;

真陽性:就診者患病,模型檢測為陽性,認為患病需要進一步檢測或治療;

真陰性:就診者未患病,模型檢測為陰性,認為患者健康,可以直接回家;

假陽性:就診者未患病,模型檢測為陽性,認為患病需要進一步檢測或治療;

注意此情況屬于誤診,進一步檢測會浪費醫療資源,但是可確定病人得到醫治;

假陰性:就診者患病,模型檢測為陰性,認為患者健康,可以直接回家;此情況屬于誤診,并且會讓患者失去治療機會;

類型1和類型2錯誤

有時在一些文檔中,你會看到把假陽性和假陰性稱為類型1和類型2錯誤。這是定義:

類型1錯誤(第一類錯誤或假陽性):在醫學診斷例子中,這是我們誤診一個健康人為病人

類型2錯誤(第二類錯誤或假陰性):在醫學診斷例子中,這是我們漏診一個病人為健康人

畫成矩陣圖如下:

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

而對于垃圾郵件分類模型:

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

3.分類模型評估

3.1 準确率(accuracy)

評估模型效果的第一個名額,是準确率

a c c u r a c y = # 正 确 分 類 數 量 # 總 分 類 數 量 accuracy = \frac{\#正确分類數量}{\#總分類數量} accuracy=#總分類數量#正确分類數量​

比如上述醫療模型:

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

垃圾郵件分類模型:

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

用sklearn庫的模型可友善計算:

from sklearn.metrics import accuracy_score

accuracy_score(y_true, y_pred)
           

準确率不适用的情形

假設一個檢測信用卡欺詐模型,有大量真實交易資料,

有284335筆正常交易,472筆欺詐交易,現在嘗試設計一個準确率超過99%的模型。

假設所有交易都是正常的,其準确率:

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

這個模型準确率非常高,但實際上沒有檢測出一例欺詐交易。而模型設計主要目标就是檢測出欺詐交易。

是以,不同類别的樣本比例非常不均衡時,占比大的類别往往稱為影響準确率的最主要因素。

對于以上誤檢的兩種情況,假陽性和假陰性,哪種更糟糕呢:

醫療模型:

假陽性,即将健康人誤診為病人,進一步檢測或治療,會浪費醫療資源;

假陰性,将病人誤診為健康,這讓病人直接回家,錯過了治療機會;

這個模型的目标是找到所有病人,可以容忍部分将健康人誤診為病人。相比,假陰性更嚴重。

垃圾郵件分類模型:

假陽性,将正常郵件誤檢為垃圾郵件,會漏過一些重要郵件;

假陰性,即垃圾郵件誤檢為正常郵件,這會浪費一定資源;

這個模型的目标是,删除掉垃圾郵件,但是不能容忍誤删,假陰性隻會浪費點時間,但假陽性可能會錯過很重要郵件。

相比,假陽性更嚴重。

從醫療模型和垃圾郵件分類模型,可以看到不同模型,設計目标不同,對誤檢的容忍也不一樣。

3.2 精确率和召回率

精确率定義:

精 确 率 = # 真 陽 性 # 所 有 檢 測 陽 性 樣 本 ( # 真 陽 性 + # 假 陽 性 ) 精确率 = \frac{\#真陽性}{\#所有檢測陽性樣本(\#真陽性+\#假陽性)} 精确率=#所有檢測陽性樣本(#真陽性+#假陽性)#真陽性​

按以上定義,醫療模型準确率:

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

垃圾郵件檢測模型:

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

召回率定義:

召 回 率 = # 真 陽 性 # 所 有 實 際 陽 性 樣 本 ( # 真 陽 性 + # 假 陰 性 ) 召回率 = \frac{\#真陽性}{\#所有實際陽性樣本(\#真陽性 + \#假陰性)} 召回率=#所有實際陽性樣本(#真陽性+#假陰性)#真陽性​

按以上定義,醫療模型召回率:

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

垃圾郵件檢測模型:

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

醫療模型,要盡量排除假陰性,需要更高的召回率,盡可能多的檢測出所有病人。

垃圾郵件模型,更在意的是避免假陽性,即删除正常的郵件,需要更高的精确率。

3.3 F1得分

綜合精确率和召回率,統一成一個名額來表述模型效率,精确率的和召回率的調和平均值

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

也叫F1 scroe

F 1 S c o r e = 2 ⋅ P r e c i s i o n ∗ R e c a l l P r e c i s i o n + R e c a l l F1_{Score}=2⋅ \frac{Precision*Recall}{Precision+Recall} F1Score​=2⋅Precision+RecallPrecision∗Recall​

調和平均值,總是處于Precision,Recall之間,偏向較小值,

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

3.4 F-Beta得分

F1分數是将精确率和召回率取相同權重,假如需求要偏向某一方,精确率或召回率,可以用F-Beta得分

F β = ( 1 + β 2 ) ⋅ P r e c i s i o n ∗ R e c a l l β 2 ∗ P r e c i s i o n + R e c a l l F_{\beta}=(1+\beta^2)⋅ \frac{Precision*Recall}{\beta^2*Precision+Recall} Fβ​=(1+β2)⋅β2∗Precision+RecallPrecision∗Recall​

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

F-β 得分的界限

β \beta β越小,越偏重于精确率,反之偏向召回率, β \beta β=1, 權重相同,也就是F1 分數。

當 β \beta β=0

F 0 = ( 1 + 0 2 ) ⋅ P r e c i s i o n ⋅ R e c a l l 0 ⋅ P r e c i s i o n + R e c a l l = P r e c i s i o n ⋅ R e c a l l R e c a l l = P r e c i s i o n F_0=(1+0 ^2)⋅\frac{Precision⋅Recall}{0⋅Precision+Recall} = \frac{Precision⋅Recall}{Recall}=Precision F0​=(1+02)⋅0⋅Precision+RecallPrecision⋅Recall​=RecallPrecision⋅Recall​=Precision

如果 β \beta β非常大,

F β = ( 1 + β 2 ) ⋅ P r e c i s i o n ∗ R e c a l l β 2 ∗ P r e c i s i o n + R e c a l l F_{\beta}=(1+\beta^2)⋅ \frac{Precision*Recall}{\beta^2*Precision+Recall} Fβ​=(1+β2)⋅β2∗Precision+RecallPrecision∗Recall​

F β = P r e c i s i o n ∗ R e c a l l β 2 ( 1 + β 2 ) ∗ P r e c i s i o n + R e c a l l ( 1 + β 2 ) F_{\beta}=\frac{Precision*Recall}{\frac{\beta^2}{(1+\beta^2)}*Precision+\frac{Recall}{(1+\beta^2)}} Fβ​=(1+β2)β2​∗Precision+(1+β2)Recall​Precision∗Recall​

随着 β \beta β變成無窮大,可以看出 1 1 + β 2 \frac{1}{1+\beta^2} 1+β21​ 變成 0,并且 β 2 1 + β 2 \frac{\beta^2}{1+\beta^2} 1+β2β2​ 變成1.

取極限,

l i m β → ∞ F β = P r e c i s i o n ⋅ R e c a l l 1 ⋅ P r e c i s i o n + 0 ⋅ R e c a l l = R e c a l l lim_{\beta→∞}F_{\beta}= \frac{Precision⋅Recall}{1⋅Precision+0⋅Recall}=Recall limβ→∞​Fβ​=1⋅Precision+0⋅RecallPrecision⋅Recall​=Recall

是以,測出結論: β \beta β界限是0和∞之間。

如果 β = 0 \beta=0 β=0,得到精确率;

如果 β = ∞ \beta=∞ β=∞,得出召回率;

如果 β = 1 \beta=1 β=1,則得出精确率和召回率的調和平均值。

3.5 ROC曲線

受試者工作特性曲線(receiver operating characteristic),簡稱ROC曲線。

ROC曲線的橫坐标為假陽性率(False Positive Rate, FPR);縱軸為真陽性率(True Positive Rate, TPR),FPR和TPR的計算方法為

F P R = F P N FPR = \frac{FP}{N} FPR=NFP​

T P R = T P P TPR = \frac{TP}{P} TPR=PTP​

上式中,P是真實正樣本數量,N是真實負樣本數量,TP是P個樣本中分類器預測正樣本數量,FP是N個負樣本中,分類器預測為負樣本個數。

如何繪制ROC曲線

通過不斷移動分類器的"截斷點"來生成曲線上的一組關鍵點。

所謂截斷點,就是設定一個門檻值,每個樣本預測為陽性的機率,超過這個門檻值,即判為陽性,否則為陰性。

每個截斷點,求相對應的FPR和TPR,以FPR為橫軸,TPR為縱軸,描出所有點,連成曲線。

如何計算AUC

AUC就是ROC曲線下的面積大小,該值可以量化的反映基于ROC曲線衡量出的模型性能。計算AUC,沿着橫軸求ROC曲線積分即可。

AUC越大,說明分類器可能把真正的正陽本排在前面,分類性能越好。

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

AUC一般在0.5~1之間,如果小于0.5,隻要把模型預測的機率反轉成1-p就可以得到一個更好的分類器。

ROC曲線相比P-R曲線有什麼特點

P-R曲線,是以召回率為橫軸,精确率為縱軸的曲線。

當正負樣本比例出現較大改變時,P-R曲線變化較大,而ROC曲線形狀基本不變。

t201.png(圖檔在手機,後面補上)

這個特點讓ROC曲線能夠盡量降低不同測試集帶來的幹擾,更加客觀地衡量模型本身的性能。

繪制roc代碼實作

def build_roc_auc(model, X_train, X_test, y_train, y_test):
    '''
    INPUT:
    model - an sklearn instantiated model
    X_train - the training data
    y_train - the training response values (must be categorical)
    X_test - the test data
    y_test - the test response values (must be categorical)
    OUTPUT:
    auc - returns auc as a float
    prints the roc curve
    '''
    import numpy as np
    import matplotlib.pyplot as plt
    from itertools import cycle
    from sklearn.metrics import roc_curve, auc, roc_auc_score
    from scipy import interp
    
    y_preds = model.fit(X_train, y_train).predict_proba(X_test)
    # Compute ROC curve and ROC area for each class
    fpr = dict()
    tpr = dict()
    roc_auc = dict()
    for i in range(len(y_test)):
        fpr[i], tpr[i], _ = roc_curve(y_test, y_preds[:, 1])
        roc_auc[i] = auc(fpr[i], tpr[i])

    # Compute micro-average ROC curve and ROC area
    fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_preds[:, 1].ravel())
    roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])
    
    plt.plot(fpr[2], tpr[2], color='darkorange',
             lw=2, label='ROC curve (area = %0.2f)' % roc_auc[2])
    plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver operating characteristic example')
    plt.show()
    
    return roc_auc_score(y_test, np.round(y_preds[:, 1]))
    
    
# Finding roc and auc for the random forest model    
build_roc_auc(rf_mod, training_data, testing_data, y_train, y_test) 
           

4 回歸模型評估

4.1平均絕對誤差

就是将樣本點到直線的距離絕對值的和;

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

平均絕對誤差有個問題,絕對值函數是不可微分的,這不利于使用如梯度下降等方法。

為解決這個問題,一般用均方誤差。

4.2均方誤差

在sklearn也很容易實作

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

4.3 R2分數

通過将模型與最簡單的可能模型相比得出

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

在sklearn的實作:

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

5 小結

訓練和測試資料

首先, 每次都要把你的資料劃分為訓練集和測試集,這很重要。先把模型在訓練集資料上拟合好,然後你就可以用測試集資料來評估模型性能。

評估分類

如果你正在訓練模型來預測分類(是否是垃圾郵件),比起預測具體數值(例如房價),有很多不同的評估方法來評估你的模型的性能。

當我們看分類名額時,這個主題的維基百科頁面非常精彩,但也有點難度。我經常用它來記憶各個名額做什麼。

具體來說,你看到了如何計算:

準确度

準确度通常用來比較模型,因為它告訴我們正确分類的比例。

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

通常準确度不應是你要優化的唯一名額。尤其是當你的資料存在類别不平衡情況時,隻優化準确度可能會誤導你對模型真實性能的評估。考慮到這一點,我們介紹了一些其他名額。

精度

精度主要關注的是資料集中預測 為“陽性”的資料。通過基于精度的優化,你将能确定與誤報假陽性相比,你是否在預測正例的工作上做的很好(減少誤報假陽性)。

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

召回率

召回率主要關注資料集中的實際 “陽性”的資料。通過基于召回率的優化,你将能确定你是否在預測正例的工作上做的很好(減少漏報假陰性),而不必太考慮誤報假陽性。如果你想在實際 ‘負例’上執行類似召回率的計算,這叫做特異性(specificity)。

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

F-Beta 分數

為同時考察兩個名額(精度和召回率)的組合,有一些常用技術,如 F-Beta 分數(其中經常使用 F1 分數),以及 ROC 和 AUC。你可以看到 \betaβ 參數控制了精度在 F 分數中的權重,它允許同時考慮精度和召回率。最常見的 beta 值是1, 因為這是精度和召回率的調和平均

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

ROC 曲線 和 AUC

通過為我們的分類名額設定不同的門檻值,我們可以測量曲線下的面積(曲線稱為 ROC 曲線)。與上面的其他名額類似,當 AUC 比較高(接近1)時,這表明我們的模型比名額接近 0 時要好。

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

你可能最終會選擇基于這些名額中的任何一項進行優化。在實踐,我通常中使用 AUC 或 F1 分數。然而,要根據你的具體情況來選擇評估方法。

評估回歸

你想評估你的模型在預測數值時的性能嗎?這種情況下,有三個常用的主要名額:平均絕對誤差,均方誤差,和 r2 值。

一個重要的注意事項:與優化均方誤差相比,優化平均絕對誤差可能會導緻不同的“最優模型”。然而,與優化 R2 值相同,優化均方誤差将總是導緻相同的“最優”模型。

同樣,如果你選擇具有最佳 R2 分數(最高)的模型,它也将是具有最低均方誤差(MSE)的模型。具體選擇哪個,要根據你覺的在給别人解釋時,哪個最友善。

平均絕對誤差 (MAE)

你看到的第一個名額是平均絕對誤差。當你要預測的資料遵循偏斜分布時,這是一個很有用的名額。在這些情況下,對絕對值做優化特别有用,因為與使用均方誤差一樣,異常值不會對試圖優化這個名額的模型有影響。這個技術的最佳值是中位值。當優化均方誤差的 R2 分數時,最佳值實際上是平均數。

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

均方誤差 (MSE)

均方誤差是回歸問題中最常用的優化名額。與 MAE 類似,你希望找到一個最小化此值的模型。這個名額可能會受到偏斜分布和異常值的極大影響。當一個模型考慮用 MAE 而不是 MSE 做優化時,記住這一點很有用。在很多情況下,在 MSE 上進行優化更容易,因為二次項可微。而絕對值是不可微的。這一因素使得該名額 (MSE) 更适合用于基于梯度的優化算法。

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

R2 分數

最後,在檢視回歸值時,R2 分數是另一個常用名額。優化一個模型,最小化 MSE 也将導緻最高的 R2 分數。這是這個名額的一個友善特性。R2 分數通常被解釋為模型捕獲的“變化量”。是以,你可以把 MSE 看作是所有點的平均值,而把 R2 分數看作是用模型捕獲的所有點的變化量。

當模型很好時,R2分數接近1;

當模型很差時,R2分數接近0;

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結
from sklearn.metrics import r2_score
y_true = [ 1, 2, 4]
y_pred = [ 1.3, 2.5, 3.7]
r2_score(y_true, y_pred)
           

看待機器學習問題,類似與解決機器故障,需要一系列檢修工具,也需要一系列評估工具,經過評估選擇最适合的工具,修好故障車;

機器學習1:機器學習的模型評估方法1.分離資料:2.混淆矩陣(evaluation matrix)3.分類模型評估4 回歸模型評估5 小結

對應到機器學習問題,檢修工具是各類算法比如邏輯回歸,決策樹,神經網絡,随機森林等,

評估工具對應模型複雜度、準确率、精确率、召回率、F1分數、學習曲線等。

我們要做的是,用這些名額來測試自己設計的模型,根據表現,選擇最優的模型來拟合資料;

繼續閱讀