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的召回率。