天天看點

|NO.Z.00007|——————————|BigDataEnd|——|Arithmetic&Machine.v07|——|Machine:監督學習算法.v06|

一、分類模型的評估名額:樣本不均勻問題

### --- 分類模型的評估名額

~~~     # 樣本不均勻問題
~~~     對于分類問題,永遠都逃不過的一個痛點就是樣本不均衡問題。      
~~~     樣本不均衡是指在一組資料集中,标簽的一類天生占有很大的比例,
~~~     但我們有着捕捉出某種特定的分類的需求的狀況。
~~~     比如,我們現在要對潛在犯罪者和普通人進行分類,潛在犯罪者占總人口的比例是相當低的,
~~~     也許隻有2%左右,98%的人都是普通人,而我們的目标是要捕獲出潛在犯罪者。
~~~     這樣的标簽分布會帶來許多問題。

~~~     首先,分類模型天生會傾向于多數的類,讓多數類更容易被判斷正确,少數類被犧牲掉。
~~~     因為對于模型而言,樣本量越大的标簽可以學習的資訊越多,
~~~     算法就會更加依賴于從多數類中學到的資訊來進行判斷。如果我們希望捕獲少數類,模型就會失敗。      
~~~     其次,模型評估名額會失去意義。這種分類狀況下,即便模型什麼也不做,
~~~     全把所有人都當成不會犯罪的人,準确率也能非常高,這使得模型評估名額 accuracy 變得毫無意義,
~~~     根本無法達到我們的“要識别出會犯罪的人”的模組化目的。 
~~~     是以現在,我們首先要讓算法意識到資料的标簽是不均衡的,
~~~     通過施加一些懲罰或者改變樣本本身,來讓模型向着捕獲少數類的方向模組化。

~~~     我們可以使用上采樣和下采樣來達成這個目的,所用的方法叫做 SMOTE,
~~~     這種方法通過将少數類的特征重新組合,創造出更多的少數類樣本。
~~~     但這些采樣方法會增加樣本的總數,對于決策樹這個樣本總是對計算速度影響巨大的算法來說,
~~~     我們完全不想輕易地增加樣本數量,
~~~     是以我們要尋求另一條路:改進我們的模型評估名額,使用更加針對于少數類的名額來優化模型。      
~~~     class_weight
~~~     在決策樹中,存在着調節樣本均衡的參數:class_weight 和接口 fit 中可以設定的 sample_weight。
~~~     在決策樹中,參數 class_weight 預設 None,此模式表示假設資料集中的所有标簽是均衡的,
~~~     即自動認為标簽的比例是 1:1。
~~~     是以當樣本不均衡的時候,
~~~     我們可以使用形如 {"标簽的值 1":權重 1,"标簽的值 2":權重 2} 的字典來輸入真實的樣本标簽比例,來讓算法意識到樣本是不平衡的。
~~~     或者使用”balanced“模式,
~~~     有了權重之後,樣本量就不再是單純地記錄數目,而是受輸入的權重影響了,
~~~     是以這時候剪枝,就需要搭配 min_ weight_fraction_leaf 這個基于權重的剪枝參數來使用。

~~~     另請注意,
~~~     基于權重的剪枝參數(例如 min_weight_ fraction_leaf)
~~~     将比不知道樣本權重的标準(比如min_samples_leaf)更少偏向主導類。
~~~     如果樣本是權重的,則使用基于權重的預修剪标準來更容易優化樹結構,
~~~     這確定葉節點至少包含樣本權重的總和的一小部分。      

二、混淆矩陣

### --- 混淆矩陣

~~~     從上一節的例子中可以看出,如果我們的目标是希望盡量捕獲少數類,
~~~     那準确率這個模型評估逐漸失效,是以我們需要新的模型評估名額來幫助我們。
~~~     如果簡單來看,其實我們隻需要檢視模型在少數類上的準确率就好了,
~~~     隻要能夠将少數類盡量捕捉出來,就能夠達到我們的目的。      
~~~     但此時,新問題又出現了,我們對多數類判斷錯誤後,
~~~     會需要人工甄别或者更多的業務上的措施來一一排除我們判斷錯誤的多數類,這種行為往往伴随着很高的成本。
~~~     比如銀行在判斷”一個申請信用卡的客戶是否會出現違約行為“的時候,
~~~     如果一個客戶被判斷為”會違約“,這個客戶的信用卡申請就會被駁回,
~~~     如果為了捕捉出”會違約“的人,大量地将”不會違約“的客戶判斷為”會違約“的客戶,
~~~     就會有許多無辜的客戶的申請被駁回。信用卡對銀行來說意味着利息收入,
~~~     而拒絕了許多本來不會違約的客戶,對銀行來說就是巨大的損失。
~~~     同理,大衆在召回不符合歐盟标準的汽車時,如果為了找到所有不符合标準的汽車,
~~~     而将一堆本來符合标準了的汽車召回,這個成本是不可估量的。      
~~~     也就是說,單純地追求捕捉出少數類,就會成本太高,而不顧及少數類,又會無法達成模型的效果。
~~~     是以在現實中,我們往往在尋找捕獲少數類的能力和将多數類判錯後需要付出的成本的平衡。
~~~     如果一個模型在能夠盡量捕獲少數類的情況下,還能夠盡量對多數類判斷正确,則這個模型就非常優秀了。
~~~     為了評估這樣的能力,我們将引入新的模型評估名額:混淆矩陣來幫助我們。      
~~~     混淆矩陣是二分類問題的多元衡量名額體系,在樣本不平衡時極其有用。
~~~     在混淆矩陣中,我們将少數類認為是正例,多數類認為是負例。
~~~     在決策樹,随機森林這些分類算法裡,即是說少數類是 1,多數類是 0。
~~~     在 SVM 裡,就是說少數類是 1,多數類是-1。      
~~~     普通的混淆矩陣,一般使用{0,1}來表示。
~~~     混淆矩陣陣如其名,十分容易讓人混淆,在許多教材中,
~~~     混淆矩陣中各種各樣的名稱和定義讓大家難以了解難以記憶。
~~~     我為大家找出了一種簡化的方式來顯示标準二分類的混淆矩陣,如圖所示:      
|NO.Z.00007|——————————|BigDataEnd|——|Arithmetic&Machine.v07|——|Machine:監督學習算法.v06|
### --- 其中:
~~~     行代表預測情況,列則表示實際情況。
~~~     預測值為 1,記為 P(Positive)
~~~     預測值為 0,記為 N(Negative)
~~~     預測值與真實值相同,記為 T(True)
~~~     預測值與真實值相反,記為 F(False)

### --- 是以矩陣中四個元素分别表示:
~~~     TP(True Positive): 真實為 1,預測作 1
~~~     FN(False Negative): 真實為 1,預測作 0
~~~     FP(False Positive): 真實為 0,預測作 1
~~~     TN(True Negative): 真實為 0,預測作 0      
~~~     基于混淆矩陣,我們有一系列不同的模型評估名額,這些評估名額的範圍都在[0,1]之間,
~~~     所有以 11 和00 為分子的名額都是越接近 1 越好,
~~~     是以以 01 和 10 為分子的名額都是越接近 0 越好。
~~~     對于所有的名額, 我們用橙色表示分母,用綠色表示分子,則我們有:
### --- 模型整體效果:準确率      
|NO.Z.00007|——————————|BigDataEnd|——|Arithmetic&Machine.v07|——|Machine:監督學習算法.v06|
~~~     # 準确率 Accuracy 就是所有預測正确的所有樣本除以總樣本,通常來說越接近 1 越好。
~~~     記住少數類是1,多數類是 0

### --- 精确度 Precision      
|NO.Z.00007|——————————|BigDataEnd|——|Arithmetic&Machine.v07|——|Machine:監督學習算法.v06|
~~~     精确度 Precision,又叫查準率,表示在所有預測結果為 1 的樣例數中,

~~~     實際為 1 的樣例數所占比重。精确度越低,意味着 01 比重很大,
~~~     則代表你的模型對多數類 0 誤判率越高,誤傷了過多的多數類。 
~~~     為了避免對多數類的誤傷,需要追求高精确度。

~~~     精确度是” 将多數類判錯後所需付出成本的衡量’’。      
#所有判斷正确并确實為 1 的樣本 / 所有被判斷為 1 的樣本
#對于沒有 class_weight 的決策樹來說:
Precision_1 = (Ytest[Ytest == clf_01.predict(Xtest)] ==
1).sum()/(clf_01.predict(Xtest) == 1).sum()
Precision_1
#對于有 class_weight 的決策樹來說:
Precision_2 = (Ytest[Ytest == clf_02.predict(Xtest)] ==
1).sum()/(clf_02.predict(Xtest) == 1).sum()
Precision_2

~~~     # 輸出參數
0.6363636363636364
0.68      
~~~     在現實的樣本不平衡例子中,
~~~     當每一次将多數類判斷錯誤的成本非常高昂的時候(比如大衆召回車輛的例子),我們會追求高精确度。
~~~     當然了,如果我們的目标是不計一切代價捕獲少數類,那我們并不在意精确度,而在意召回率。

### --- 召回率 Recall
~~~     召回率 Recall,又被稱為敏感度(sensitivity),真正率,查全率,
~~~     表示所有真實為 1 的樣本中,被我們預測正确的樣本所占的比例。
~~~     召回率越高,代表我們盡量捕捉出了越多的少數類。
~~~     召回率越低,代表我們沒有捕捉出足夠的少數類。      
|NO.Z.00007|——————————|BigDataEnd|——|Arithmetic&Machine.v07|——|Machine:監督學習算法.v06|
#所有 predict 為 1 并且正确的點 / 全部為 1 的點的比例
#對于沒有 class_weight 的決策樹來說:
(ytest[ytest == clf.predict(Xtest)] == 1).sum()/(ytest == 1).sum()
#對于有 class_weight 的決策樹來說:
(ytest[ytest == wclf.predict(Xtest)] == 1).sum()/(ytest == 1).sum()

~~~     # 輸出參數
0.4827586206896552
0.5862068965517241      
~~~     可以看出,做樣本平衡之前,我們隻成功捕獲了 48%左右的少數類點,而做了樣本平衡之後的模型,
~~~     捕捉出了 58%的少數類點。召回率可以幫助我們判斷,我們是否捕捉除了全部的少數類,
~~~     是以又叫做查全率。

~~~     如果我們希望不計一切代價,找出少數類(比如找出潛在犯罪者的例子),
~~~     那我們就會追求高召回率,相反如果我們的目标不是盡量捕獲少數類,那我們就不需要在意召回率。      
~~~     注意召回率和精确度的分子是相同的(都是 11),隻是分母不同。
~~~     而召回率和精确度是此消彼長的,
~~~     兩者之間的平衡代表了捕捉少數類的需求和盡量不要誤傷多數類的需求的平衡。

~~~     究竟要偏向于哪一方,取決于我們的業務需求:究竟是誤傷多數類的成本更高,
~~~     還是無法捕捉少數類的代價更高。      
### --- F1 measure

~~~     為了同時兼顧精确度和召回率,
~~~     我們創造了兩者的調和平均數作為考量兩者平衡的綜合性名額,稱之為F1 measure。
~~~     兩個數之間的調和平均傾向于靠近兩個數中比較小的那一個數,
~~~     是以我們追求盡量高的 F1 measure,能夠保證我們的精确度和召回率都比較高。
~~~     F1 measure 在[0,1]之間分布,越接近 1 越好。      
|NO.Z.00007|——————————|BigDataEnd|——|Arithmetic&Machine.v07|——|Machine:監督學習算法.v06|
### --- 假負率

~~~     從 Recall 延申出來的另一個評估名額叫做假負率(False Negative Rate),
~~~     它等于 1 - Recall,用于衡量
~~~     所有真實為 1 的樣本中,被我們錯誤判斷為 0 的,通常用得不多。      
|NO.Z.00007|——————————|BigDataEnd|——|Arithmetic&Machine.v07|——|Machine:監督學習算法.v06|
### --- ROC 曲線

~~~     ROC 的全稱是 Receiver Operating Characteristic Curve,其主要的分析方法就是畫這條特征曲線。      
|NO.Z.00007|——————————|BigDataEnd|——|Arithmetic&Machine.v07|——|Machine:監督學習算法.v06|
~~~     該曲線的橫坐标為假正率(False Positive Rate, FPR), N 是真實負樣本的個數, 
~~~     FP 是 N 個負樣本中被分類器器預測為正樣本的個數。      
|NO.Z.00007|——————————|BigDataEnd|——|Arithmetic&Machine.v07|——|Machine:監督學習算法.v06|
~~~     縱坐标為召回率,真正率(True Positive Rate, TPR):
~~~     P 是真實正樣本的個數,TP 是 P 個正樣本中被分類器器預測為正樣本的個數。      
|NO.Z.00007|——————————|BigDataEnd|——|Arithmetic&Machine.v07|——|Machine:監督學習算法.v06|
### --- sklearn 中的混淆矩陣      
含義
sklearn.metrics.confusion_matrix 混淆矩陣
sklearn.metrics.accuracy_score 準确率accuracy
sklearn.metrics.precision_score 精确度precision
sklearn.metrics.recall_score 召回率recall
sklearn.metrics.precision_recall_curve 精确度-召回率平衡曲線
sklearn.metrics.f1_score F1 measure
### --- 混淆矩陣
metrics.confusion_matrix(Ytest,clf_01.predict(Xtest))
metrics.confusion_matrix(Ytest,clf_02.predict(Xtest))

~~~     # 輸出參數
array([[183, 8], [ 15, 14]], dtype=int64)
array([[183, 8], [ 12, 17]], dtype=int64)      
### --- 準确率

~~~     # Precision
metrics.precision_score(Ytest,clf_01.predict(Xtest))
metrics.precision_score(Ytest,clf_02.predict(Xtest))
~~~     # 輸出參數
0.6363636363636364
0.68      
### --- 召回率

~~~     # Recall
metrics.recall_score(Ytest,clf_01.predict(Xtest))
metrics.recall_score(Ytest,clf_02.predict(Xtest))
~~~     # 輸出參數
0.4827586206896552
0.5862068965517241      
### --- F 值

~~~     # F-measure
metrics.f1_score(Ytest,clf_01.predict(Xtest))
metrics.f1_score(Ytest,clf_02.predict(Xtest))
~~~     # 輸出參數
0.5490196078431373
0.6296296296296295      

繼續閱讀