web-dev-qa-db-ja.com

Scikit Learnのロジスティック回帰のしきい値の制御

非常に不均衡なデータセットで_scikit-learn_のLogisticRegression()メソッドを使用しています。 _class_weight_機能をautoに変更しました。

ロジスティック回帰では、特定のクラスのペアのしきい値を知ることができるはずです。

LogisticRegression()メソッドが設計するOne-vs-Allクラスのそれぞれのしきい値を知ることは可能ですか?

ドキュメントページには何も見つかりませんでした。

デフォルトでは、パラメーター値に関係なく、すべてのクラスのしきい値として_0.5_値を適用しますか?

20
London guy

はい、Sci-Kit学習では、P> 0.5のしきい値をバイナリ分類に使用しています。これを確認するために、すでに投稿されているいくつかの回答に基づいて、2つのオプションを追加します。

1つの簡単なオプションは、以下のコードのmodel.predict_proba(test_x)セグメントからの出力とクラス予測(以下のコードのmodel.predict(test_x)セグメントからの出力)を使用して、各分類の確率を抽出することです。次に、クラス予測とその確率をチェックとしてテストデータフレームに追加します。

別のオプションとして、次のコードを使用して、さまざまなしきい値で精度と再現率をグラフィカルに表示できます。

### Predict test_y values and probabilities based on fitted logistic 
regression model

pred_y=log.predict(test_x) 

probs_y=log.predict_proba(test_x) 
  # probs_y is a 2-D array of probability of being labeled as 0 (first 
  column of 
  array) vs 1 (2nd column in array)

from sklearn.metrics import precision_recall_curve
precision, recall, thresholds = precision_recall_curve(test_y, probs_y[:, 
1]) 
   #retrieve probability of being 1(in second column of probs_y)
pr_auc = metrics.auc(recall, precision)

plt.title("Precision-Recall vs Threshold Chart")
plt.plot(thresholds, precision[: -1], "b--", label="Precision")
plt.plot(thresholds, recall[: -1], "r--", label="Recall")
plt.ylabel("Precision, Recall")
plt.xlabel("Threshold")
plt.legend(loc="lower left")
plt.ylim([0,1])
7
sri bandhakavi

ロジスティック回帰は、最も確率が高いクラスを選択します。 2つのクラスの場合、しきい値は0.5です。P(Y = 0)> 0.5の場合、明らかにP(Y = 0)> P(Y = 1)です。同じことがマルチクラス設定を表します。ここでも、最も確率の高いクラスが選択されます(例: Ngの講義 、一番下の行を参照)。

特別なしきい値の導入は、偽陽性/偽陰性の比率にのみ影響する(したがって、精度/再現率のトレードオフに影響する)が、LRモデルのパラメーターではない。 同様の質問 も参照してください。

12

model.predict(test_data) use model.predict_proba(test_data)を使用する代わりに、私が使用する小さなトリックがあります。次に、しきい値の範囲を使用して、予測への影響を分析します。

pred_proba_df = pd.DataFrame(model.predict_proba(x_test))
threshold_list = [0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,.7,.75,.8,.85,.9,.95,.99]
for i in threshold_list:
    print ('\n******** For i = {} ******'.format(i))
    Y_test_pred = pred_proba_df.applymap(lambda x: 1 if x>i else 0)
    test_accuracy = metrics.accuracy_score(Y_test.as_matrix().reshape(Y_test.as_matrix().size,1),
                                           Y_test_pred.iloc[:,1].as_matrix().reshape(Y_test_pred.iloc[:,1].as_matrix().size,1))
    print('Our testing accuracy is {}'.format(test_accuracy))

    print(confusion_matrix(Y_test.as_matrix().reshape(Y_test.as_matrix().size,1),
                           Y_test_pred.iloc[:,1].as_matrix().reshape(Y_test_pred.iloc[:,1].as_matrix().size,1)))

ベスト!

8
jazib jamil