scikit-learn 中常用的評估模型


一,scikit-learn中常用的評估模型

1.評估分類模型:

 

2.評估回歸模型:

 

二、常見模型評估解析:

•對於二分類問題,可將樣例根據其真實類別和分類器預測類別划分為:(T,F表示預測的正確與錯誤性,P,N表示預測的正類和負類)

•真正例(TruePositive,TP):真實類別為正例,預測類別為正例。

•假正例(FalsePositive,FP):真實類別為負例,預測類別為正例。

•假負例(FalseNegative,FN):真實類別為正例,預測類別為負例。

•真負例(TrueNegative,TN):真實類別為負例,預測類別為負例。

•構建混淆矩陣(ConfusionMatrix):

•識別精確度(accuracy)

•Accuracy=(TP+FN)/(TP+TN+FP+FN)×100%

 

•准確率(precision):

                                               

•召回率(recall):

                                       

•F1值:精確度和召回率的調和平均值

                                                                  

 

•precision 和 recall 都是越高越好。精確度和召回率都高時,F1 值也會高. F1 值在1時達到最佳值(完美的精確度和召回率),最差為0.在二元分類中,F1 是測試准確度的量度。

 

classification_report 的主要參數:

主要參數: 
y_true:1維數組,或標簽指示器數組/稀疏矩陣,目標值。 
y_pred:1維數組,或標簽指示器數組/稀疏矩陣,分類器返回的估計值。 
labels:array,shape = [n_labels],報表中包含的標簽索引的可選列表。 
target_names:字符串列表,與標簽匹配的可選顯示名稱(相同順序)。 
sample_weight:類似於shape = [n_samples]的數組,可選項,樣本權重。 
digits:int,輸出浮點值的位數.

 

 

from sklearn.metrics import classification_report y_true = [0,1,2,2,1,0] y_pred = [0,2,0,2,1,0] target_names= ['class0','class1','class2'] reports = classification_report(y_true, y_pred, target_names=target_names) #生成分類的指標的文本報告 print(reports) #輸出結果 # precision recall f1-score support # # class0 0.67 1.00 0.80 2    #support為真實label出現的次數 # class1 1.00 0.50 0.67 2 # class2 0.50 0.50 0.50 2 # # avg / total 0.72 0.67 0.66 6
真實值 預測值
0 0
1 2
2 0
2 2
1 1
0 0

先計算label 0:即reports的class0

計算precision准確率時,只看分類標簽是 0 的預測值,如圖有 3 個,再看其預測成功的個數 ,有2個,所以准確率為 0.67
計算recall召回率時:只看分類標簽是0 的真實值,如圖有2 個,再看其預測成功的個數, 有2 個,所以召回率為 1

結合p 和 r 計算 F1值

 

同理:計算label 1 和label 2  

1).回歸模型評估:

•1.均方根誤差(RootMean Squared Error,RMSE)

RMSE是一個衡量回歸模型誤差率的常用公式。然而,它僅能比較誤差是相同單位的模型

•由於對誤差E 進行平方,加強了數值大的誤差在指標中的作用,從而提高了指標的靈敏性。

 

•2.平均絕對誤差(Mean Absolute Error,MAE)

•3.平均絕對百分誤差(MeanAbsolute Percentage Error)

•一般認為MAPE小於10時,預測精度高。

 

•2)分類模型評估:

ROC-AUC曲線

 

•AUC值為ROC曲線所覆蓋的區域面積,顯然,AUC越大,分類器分類效果越好。

 

•AUC的物理意義

•假設分類器的輸出是樣本屬於正類的score(置信度),則AUC的物理意義為,任取一對(正、負)樣本,正樣本的score大於負樣本的score的概率。

 

1.ROC曲線:接受者操作特征(receiveroperating characteristic)曲線代表每個點反映着對同一個信號刺激的感受性。ROC曲線和AUC常被用來評價一個二值分類器(binaryclassifier)的優劣。

•橫軸FPR越大,代表預測正類中實際負類越多

•縱軸TPR越大,代表預測正類中實際正類也越多

•因此,曲線越靠近(0,1)點,越往對角線45度左上角偏,分類效果越好。

 

如何繪制ROC 曲線

 

    當我們將threshold設置為1和0時,分別可以得到ROC曲線上的(0,0)和(1,1)兩個點。將這些(FPR,TPR)對連接起來,就得到了ROC曲線。當threshold取值越多,ROC曲線越平滑。

  其實,我們並不一定要得到每個測試樣本是正樣本的概率值,只要得到這個分類器對該測試樣本的“評分值”即可(評分值並不一定在(0,1)區間)。評分越高,表示分類器越肯定地認為這個測試樣本是正樣本,而且同時使用各個評分值作為threshold。將評分值轉化為概率更易於理解一些。

2.AUC(Areaunder roc curve)在ROC曲線下的面積,度量分類模型的好壞。

 

•由於ROC曲線一般都處於y=x這條直線的上方,所以AUC的取值范圍在0.5和1之間。使用AUC值作為評價標准是因為很多時候ROC曲線並不能清晰的說明哪個分類器的效果更好,而作為一個數值,對應AUC更大的分類器效果更好。

•首先AUC值是一個概率值,當你隨機挑選一個正樣本以及一個負樣本,當前的分類算法根據計算得到的Score值將這個正樣本排在負樣本前面的概率就是AUC值。當然,AUC值越大,當前的分類算法越有可能將正樣本排在負樣本前面,即能夠更好的分類。

•判定AUC 曲線的優劣:

•.90-1= very good (A)

•.80-.90= good (B)

•.70-.80= not so good (C)

•.60-.70= poor (D)

•.50-.60= fail (F)

 

•3.精度-召回率曲線PRC(precisionrecall  curve):與ROC曲線不同的是:PRC曲線是往右上角靠攏效果較好。

•適用場景:

1. 地震的預測
對於地震的預測,我們希望的是RECALL非常高,也就是說每次地震我們都希望預測出來。這個時候我們可以犧牲PRECISION。情願發出1000次警報,把10次地震都預測正確了;也不要預測100次對了8次漏了兩次。
2. 嫌疑人定罪
基於不錯怪一個好人的原則,對於嫌疑人的定罪我們希望是非常准確的。及時有時候放過了一些罪犯(recall低),但也是值得的。

 

•4.如何避免過擬合:

•過擬合表現為在訓練數據上的誤差非常小,而在測試數據集上的誤差反而增大。其中原因一般是模型過於復雜,過分去擬合數據的噪聲和離群點,導致模型的泛化能力差,魯棒性差。

•常見的解決辦法:增大數據集,對模型進行正則化。

 

•5.交叉驗證:

•K-Folds交叉驗證:K層交叉驗證是將原始數據隨機分為K 個部分,在K 個部分中,選擇1 個作為測試集,K-1 個作為訓練集。將實驗重復K 次,每次實驗都從K 個部分選擇1 個不同的作為測試集,最后對得到的K 個實驗結果取平均。

#coding=gbk ''' Created on 2018年7月10日 @author: Administrator ''' #交叉驗證 #1.留出法:直接將原始的數據集變換成2類互斥的兩類,一部分為訓練集,另一部分為驗證集、 #在sklearn中使用 train_test_split函數 from sklearn.model_selection import train_test_split import numpy as np from sklearn import svm #支持向量機 from sklearn import datasets iris = datasets.load_iris() #加載鳶尾花數據集 print(iris.data.shape, iris.target.shape) #(150, 4) (150,) x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size = 0.2, random_state=666) #test_size 表示測試集所占的比例 print(x_train.shape, x_test.shape) #(120, 4) (30, 4) print(y_train.shape, y_test.shape) #(120,) (30,) svm_clf = svm.SVC(kernel='linear', C= 1).fit(x_train, y_train) print(svm_clf.score(x_test, y_test)) # 1.0 百分之百的預測成功率 #2.交叉驗證方法 from sklearn.model_selection import KFold import numpy as np x = np.array([[1,2],[3,4],[5,6],[7,8]]) y = np.array([1,2,3,4]) kf = KFold(n_splits=2,random_state=666) #n_splits 是指將數據輸出多少份 for train_index, test_index in kf.split(x): print('train_index:', train_index, 'test_index:',test_index) # train_index: [2 3] test_index: [0 1] # train_index: [0 1] test_index: [2 3] #當n_splits = 3 時,輸出如下: # train_index: [2 3] test_index: [0 1] # train_index: [0 1 3] test_index: [2] # train_index: [0 1 2] test_index: [3] x_train, y_train = x[train_index],y[train_index] x_test , y_test = x[test_index], y[test_index] print(x_train,' ',y_train) print(x_test,' ',y_test) #2.2 RepeatedKFold p次k折交叉驗證,RepeatedKFold方法可以控制交叉驗證的次數。n_repeats from sklearn.model_selection import RepeatedKFold x1 = np.array([[1,2],[3,4],[5,6],[7,8]]) y1 = np.array([1,2,3,4]) rk = RepeatedKFold(n_splits=2, n_repeats=2, random_state=666) for train_index, test_index in rk.split(x1): print('train_index:',train_index,'test_index:', test_index) # train_index: [0 2] test_index: [1 3] # train_index: [1 3] test_index: [0 2] # train_index: [2 3] test_index: [0 1] # train_index: [0 1] test_index: [2 3] #3 留一法 LeaveOneOut print('-----LeaveOneOut------') from sklearn.model_selection import LeaveOneOut x2 = np.array([1,2,3,4,5]) loo = LeaveOneOut() for train_index, test_index in loo.split(x2): print('train_index:',train_index, 'test_index:', test_index) # train_index: [1 2 3 4] test_index: [0] # train_index: [0 2 3 4] test_index: [1] # train_index: [0 1 3 4] test_index: [2] # train_index: [0 1 2 4] test_index: [3] # train_index: [0 1 2 3] test_index: [4] #3.2 LeavePOut 留p法 #基本原理和留一法是一樣的 from sklearn.model_selection import LeavePOut lpo = LeavePOut(p=2) for train_index, test_index in lpo.split(x2): print('train_index:',train_index, 'test_index:',test_index) # train_index: [2 3 4] test_index: [0 1] # train_index: [1 3 4] test_index: [0 2] # train_index: [1 2 4] test_index: [0 3] 有10中取法 # train_index: [1 2 3] test_index: [0 4] # train_index: [0 3 4] test_index: [1 2] # train_index: [0 2 4] test_index: [1 3] # train_index: [0 2 3] test_index: [1 4] # train_index: [0 1 4] test_index: [2 3] # train_index: [0 1 3] test_index: [2 4] # train_index: [0 1 2] test_index: [3 4] #4.shuffleSplit 隨機分配, 可以隨機把數據打亂,然后分為訓練集和測試集 print('------shufflesplit------') from sklearn.model_selection import ShuffleSplit ss = ShuffleSplit(n_splits=4, random_state = 666, test_size=0.4) for train_index, test_index in ss.split(x2): print('train_index:',train_index,'test_index:',test_index) # train_index: [1 2 4] test_index: [3 0] # train_index: [0 2 1] test_index: [3 4] # train_index: [0 2 3] test_index: [4 1] # train_index: [1 2 4] test_index: [0 3]

 

 

 

參考:柚子皮blog


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM