95

不均衡なクラス (5% 1) の分類問題に取り組んでいます。確率ではなくクラスを予測したい。

バイナリ分類の問題では、scikit はデフォルトでclassifier.predict()使用されていますか? 0.5そうでない場合、デフォルトの方法は何ですか? もしそうなら、どうすれば変更できますか?

scikit では、一部の分類子にはclass_weight='auto'オプションがありますが、すべての分類子にはありません。ではclass_weight='auto'.predict()実際の人口比率をしきい値として使用しますか?

MultinomialNBサポートしていないような分類器でこれを行う方法は何でしょうclass_weightか? predict_proba()自分でクラスを使用して計算する以外。

4

5 に答える 5

47

scikit Learn のしきい値は、バイナリ分類の場合は 0.5 で、マルチクラス分類の確率が最も高いクラスはどれでもあります。多くの問題では、しきい値を調整することで、より良い結果が得られる場合があります。ただし、これは慎重に行う必要があり、ホールドアウト テスト データではなく、トレーニング データの相互検証によって行う必要があります。テスト データのしきい値を調整すると、テスト データが過学習になります。

しきい値を調整するほとんどの方法は、受信者動作特性 (ROC)Youden の J 統計に基づいていますが、遺伝的アルゴリズムを使用した検索など、他の方法で行うこともできます。

これは、医学でこれを行うことを説明する査読ジャーナルの記事です。

http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2515362/

私が知る限り、Python でそれを行うためのパッケージはありませんが、Python でブルート フォース検索を使用して見つけるのは比較的簡単です (ただし非効率的です)。

これは、それを行うRコードです。

## load data
DD73OP <- read.table("/my_probabilites.txt", header=T, quote="\"")

library("pROC")
# No smoothing
roc_OP <- roc(DD73OP$tc, DD73OP$prob)
auc_OP <- auc(roc_OP)
auc_OP
Area under the curve: 0.8909
plot(roc_OP)

# Best threshold
# Method: Youden
#Youden's J statistic (Youden, 1950) is employed. The optimal cut-off is the threshold that maximizes the distance to the identity (diagonal) line. Can be shortened to "y".
#The optimality criterion is:
#max(sensitivities + specificities)
coords(roc_OP, "best", ret=c("threshold", "specificity", "sensitivity"), best.method="youden")
#threshold specificity sensitivity 
#0.7276835   0.9092466   0.7559022
于 2016-02-09T19:32:18.897 に答える
8

ここで概念を混乱させているようです。しきい値は「一般的な分類子」の概念ではありません。最も基本的なアプローチは、調整可能なしきい値に基づいていますが、既存の方法のほとんどは、しきい値処理と見なすことができない (または少なくともすべきではない) 分類のための複雑なルールを作成します。

最初に、scikit の分類器のデフォルトのしきい値に関する質問に答えることはできません。そのようなものはないからです。

第二に、クラスの重み付けはしきい値ではなく、不均衡なクラスを処理する分類子の能力に関するものであり、特定の分類子に依存するものです。たとえば、SVM の場合、最適化問題でスラック変数を重み付けする方法、または必要に応じて、特定のクラスに関連付けられたラグランジュ乗数値の上限です。これを「auto」に設定するということは、デフォルトのヒューリスティックを使用することを意味しますが、繰り返しになりますが、単純にしきい値に変換することはできません。

一方、単純ベイズは、トレーニング セットからクラスの確率を直接推定します。これは「クラス プライオリティー」と呼ばれ、「class_prior」変数を使用してコンストラクターで設定できます。

ドキュメントから:

クラスの事前確率。指定された場合、事前分布はデータに従って調整されません。

于 2013-11-14T21:47:20.323 に答える