性能評価

1、精度

cross_val_score(sgd_clf、X_train、y_train_5、CV = 3、スコア= " 精度" 
アレイ([ 0.909、0.90715、0.9128])

  特に、より頻繁に類似の他のクラスの一部として、データセットの偏差を処理す​​る場合、精度が良好なパフォーマンスメトリックではありません。

2、混同行列

  分類のために、性能評価は、はるかに優れ混同行列です。一般的な考え方は次のとおりです。クラスAの出力は、クラスBの時間に分類されています。

  混同行列を計算するには、あなたの最初の必要性は、真の値の予測値を比較するように、予測値のシリーズを持っています。あなたは(テストセットに予測を作りたいかもしれませんが、それを使用しないでください(あなたが分類器のラインにしているの準備ができて、あなただけのテスト・セットを使用する必要がある場合、プロジェクトが終わりにあるときにのみ、覚えておいてください)、逆に、あなたがcross_val_predictを使用する必要があります)機能

sklearn.model_selectionのインポートcross_val_predict 
y_train_pred = cross_val_predict(sgd_clf、X_train、y_train_5、CV = 3)
sklearn.metrics 輸入confusion_matrix 
confusion_matrix(y_train_5、y_train_pred)

)(cross_val_scoreように、cross_val_predict()は、K倍クロスバリデーションを使用することです。代わりに評価スコアを返すが、行われた各試験を倍予測に基づいて戻ります。各トレーニングサンプルセットのために、あなたは予測のラッシュを取得することを、この手段は、(「クリーン」モデルのテストデータセットはトレーニングプロセスで使用されていないということです)

その後confusion_matirx()関数を使用するには、混同行列を取得します。

y_train_perfect_prediction = y_train_5 
confusion_matrix(y_train_5、y_train_perfect_prediction)

しかしcross_val_predict()とcross_val_score()のために、更に別の説明が必要とされた:(参考違います。https://zhuanlan.zhihu.com/p/90451347)

  cross_val_scoreのcross_val_predictとスライスと同じようものの、それcross_val_predictの戻り値が異なるが、直接標準スコアを計算するために使用することはできません!公式サイトは述べています

   、オフK cross_val_scoreこの手段は、クロスバリデーションの平均値をとることで、単に返さcross_val_predictタグまたはいくつかの異なる確率モデルは、従って、適切なcross_val_predict適切なメトリック汎化誤差はありません。

  ソースを表示cross_val_predict:

  

   これらtest_yを見てみましょうと、何の問題を予測しませんが、評価に一緒得点、不適切なまとめ

  なぜ?

  コントラストcross_val_scoreは、理由は非常に単純であることがわかりました。

  我々はcross_val_predict時間を使用してスコアを計算するとき、我々はすなわち、cross_val_score異なるコンピューティング戦略を使用します。

  最初のスライスは、平均のスコアを計算するcross_val_score。

スコア= np.mean(cross_val_score(推定、データ_x、Y、CV = 5))

  すべてのユニファイドコンピューティングのためのcross_val_predict:

predict_y = cross_val_predict(推定、データ_x、Y、CV = 5 
スコア = r2_score(true_y、predict_y)

  このように平均cross_val_score断片を算出した後、それは、異なるモデルの結果の平均値と考えることができます

  まったく意味をなさないスコアを計算cross_val_predict。

  また、非常に異なるので、公式サイトの警告に従って少量のデータではこれら2つの結果が、スコアを計算cross_val_predict使用に減少しました。

身近に、完璧な分類器は、唯一の真の例と実際の例はその対角線(右下に左上)内の非ゼロ値の混同行列ので、逆転う

多くの情報を提供することができる混同行列は、それはまた、分類器の精度(精度)として知られている正例の予測の精度の興味深い指標であります

3、精度と再現率分類器

  式:精度

   

   TPは、実際の例数である場合、FPは偽陽性例数は、

  通常の方法は、予測を構築し、この予測の単一の正例が正しい(精度= 1/1 = 100%)であることを確認することである完全正解率を、望みます。分類精度は、一般的に他のインジケータを使用して添付されて正例こと、このインジケータはまた、感受性(感度)として知られているリコール(想起)、又は患者の実速度(真の陽性と呼ばれている以外は、すべてのサンプルを無視するため率、TPR)。これは陽性症例の割合が正しく分類器を検出されたです。

  式を思い出します。

    

 FNは偽反例の数であります

あなたは混同行列について混乱している場合は、次のように混同行列図です。

 sklearnは、分類器の計算精度と再現率を含むため、いくつかのインデックス機能を提供します

from sklearn.metrics import precision_score,recall_score
precision_score(y_train_5,y_train_pred),recall_score(y_train_5,y_train_pred)

 当你去观察精度的时候,你的“数字5探测器”看起来还不够好,当它声明某张图片是5的时候,它只有89%的可能是正确的,而且,它也只检测出“是5”类图片当中的69%。

4、F1 Score

  通常结合准确率和召回率会更加方便,这个指标就是“F1 值”,特别是当你需要一个简单的方法去比较两个分类器的优劣的时候。F1 值是准确率和召回率的调和平均。普通的平均值平等的看待所有的值,而调和平均会给小的值更大的权重,所以,想要分类器得到一个高的F1值,需要召回率和准确度同时高。

  F1值公式:

  

 为计算F1值,可简单调用f1_score()

from sklearn.metrics import f1_score
f1_score(y_train_5,y_train_pred)

   F1支持那些有着相近准确率和召回率的分类器。这不会总是你想要的。有的场景你会绝大程度地关心准确率,而另外一些场景你会更关心召回率。举例子,如果你训练一个分类器去检测视频是否适合儿童观看,你会倾向选择那种即便拒绝了很多好视频、但保证所保留的视频都是好(高准确率)的分类器,而不是那种高召回率、但让坏视频混入的分类器(这种情况下你或许想增加人工去检测分类器选择出来的视频)。另一方面,加入你训练一个分类器去检测监控图像当中的窃贼,有着 30% 准确率、99% 召回率的分类器或许是合适的(当然,警卫会得到一些错误的报警,但是几乎所有的窃贼都会被抓到)。

  不幸的是,你不能同时拥有两者。增加准确率会降低召回率,反之亦然。这叫做准确率与召回率之间的折衷。

 5、准确率/召回率之间的折衷

  为了弄懂这个折衷,先看下SGDCLassifier是如何做分类决策的。对于每个样例,它根据决策函数计算分数,如果这个分数大于一个阈值,它会将样例分配给正例,否则它将分配给反例。sklearn不让你直接设置阈值,但是它给你提供了设置决策分数的方法,这个决策分数用来产生预测。它不是调用分类器的predict()方法,而是调用decision_function()方法。这个方法返回每一个样例的分数值,然后基于这个分数值,使用你想要的任何阈值做出预测。

y_scores = sgd_clf.decision_function([some_digit])
y_scores

 这是对数字5分类器产生的阈值,当超过5220.5时就会将结果分为非5行列

threshold = 0
y_some_digit_pred = (y_scores > threshold)
y_some_digit_pred

threshold = 5220
y_some_digit_pred = (y_scores > threshold)
y_some_digit_pred

当分类器大于5220.5时,分类器就不能探测到这是数字5

那么,应该如何使用哪个阈值呢?首先,需要再次使用cross_val_predict()得到每一个样例的分数值,但是这一次指定返回一个决策分数,而不是预测值。

y_scores = cross_val_predict(sgd_clf,X_train,y_train_5,cv = 3,method = 'decision_function')

现在有了这些分数值,对于任何可能的阈值,使用precision_recall_curve(),都可以计算准确率和召回率:

from sklearn.metrics import precision_recall_curve
precisions,recalls,thresholds = precision_recall_curve(y_train_5,y_scores)

最后,可以使用matplotlib画出准确率和召回率,这里将准确率和召回率当做阈值的一个函数

def plot_precision_recall_vs_threshold(precisions,recalls,thresholds):
    plt.plot(thresholds,precisions[:-1],"b--",label=  "Precision",linewidth = 2)
    plt.plot(thresholds,recalls[:-1],'g-',label = 'Recall',linewidth = 2)
    plt.xlabel('Threshold',fontsize = 16)
    plt.legend(loc = 'upper left',fontsize = 16)
    plt.ylim([0,1])
plot_precision_recall_vs_threshold(precisions,recalls,thresholds)
plt.show()

 现在你可以选择适合你任务的最佳阈值。

  另一个选出好的准确率/召回率这种的方法是直接画出准确率对召回率的曲线

def plot_precision_vs_recall(precisions,recalls):
    plt.plot(recalls,precisions,'b-',linewidth = 2)
    plt.xlabel("recall")
    plt.ylabel('precision')
    plt.axis([0,1,0,1])
plt.figure(figsize=(8,8))
plot_precision_vs_recall(precisions,recalls)
save_fig("precision_vs_recall_plot")
plt.show()

 可以看到,在召回率在80%左右的时候,准确率急剧下降。你可能会想选择在急剧下降之前选择出一个准确率/召回率折衷点。比如说,在召回率 60% 左右的点。当然,这取决于你的项目需求。

 6、ROC曲线

  受试者工作特征(ROC)曲线是另一个分类器使用的常用工具。它非常类似于准确率/召回率曲线,但不是画出准确率对召回率的曲线,ROC曲线是真正例率(true positive rate,另一个名字叫做召回率)对假正例率(false positive rate,FPR)的曲线。FPR是反例被错误分成正例的比例。它等于1减去真反例率(true positive rate,TNP)。TNP是反例被正确分类的比率。TNR也叫作特异性。所以ROC曲线画出召回率对(1减特异性)的曲线。

  为了画出ROC曲线,需要首先计算下各种不同阈值下的TPR、FPR,使用roc_curve()函数:

from sklearn.metrics import roc_curve
fpr,tpr,threshold =roc_curve(y_train_5,y_scores)

用matplotlib话FPR对TPR的曲线

def plot_roc_curve(fpr,tpr,label = None):
    plt.plot(fpr,tpr,linewidth = 2,label= label)
    plt.plot([0,1],[0,1],'k--')
    plt.axis([0,1,0,1])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
plot_roc_curve(fpr,tpr)
plt.show()

   这里同样存在折衷的问题:召回率(TPR)越高,分类器就会产生越多的假正例(FPR)。图中的点线是一个完全随机的分类器生成的ROC曲线;一个好的分类器的ROC曲线应该尽可能远离这条线(即向左上角靠拢)

  一个比较分类器之间优劣之间优劣的方法是:测量ROC曲线下的面积(AUC)。一个完美的分类器的ROC AUC等于1,而一个纯随机分类器的ROC AUC等于0.5.Sklearn提供了一个函数用来计算ROC AUC:

from sklearn.metrics import roc_auc_score
roc_auc_score(y_train_5,y_scores)

   因为 ROC 曲线跟准确率/召回率曲线(或者叫 PR)很类似,你或许会好奇如何决定使用哪一个曲线呢?一个笨拙的规则是,优先使用 PR 曲线当正例很少,或者当你关注假正例多于假反例的时候。其他情况使用 ROC 曲线。举例子,回顾前面的 ROC 曲线和 ROC AUC 数值,你或许认为这个分类器很棒。但是这几乎全是因为只有少数正例(“是 5”),而大部分是反例(“非 5”)。相反,PR 曲线清楚显示出这个分类器还有很大的改善空间(PR 曲线应该尽可能地靠近右上角)。

  现在来训练一个RandomForestClassifier,然后拿它的ROC曲线和ROC AUC数值与SGDClassifier进行比较

from sklearn.ensemble import RandomForestClassifier
forest_clf = RandomForestClassifier(random_state=42)
y_probas_forest = cross_val_predict(forest_clf,X_train,y_train_5,cv = 3,method='predict_proba')

  RandomForestClassifier 不提供 decision_function() 方法。相反,它提供了 predict_proba() 方法。Skikit-Learn分类器通常二者中的一个。 predict_proba() 方法返回一个数组,数组的每一行代表一个样例,每一列代表一个类。数组当中的值的意思是:给定一个样例属于给定类的概率,比如70%的概率这幅图是数字5

y_scores_forest = y_probas_forest[:,1]
fpr_forest,tpr_forest,threshold_forest =roc_curve(y_train_5,y_scores_forest)
plt.plot(fpr,tpr,'b:',label= "SGD")
plot_roc_curve(fpr_forest,tpr_forest,'Random Forest')
plt.legend(loc = 'bottom right')
plt.show()

如你所见,RandomForestClassifier的ROC曲线比SGDClassifier好得多:它更靠近左上角,所以,它的ROC AUC也会更大

roc_auc_score(y_train_5,y_scores_forest)

 计算下它的准确率好召回率:98.5%的准确率,82.8的召回率。

 

おすすめ

転載: www.cnblogs.com/whiteBear/p/12362986.html