3

ここからのフォローアップ: Converting a 1D array into a 2D class-based matrix in python

46 のクラスごとに ROC 曲線を描画したいと考えています。予測を行うために分類器を実行した 300 個のテスト サンプルがあります。

y_testは真のクラスであり、y_pred私の分類子が予測したものです。

これが私のコードです:

    from sklearn.metrics import confusion_matrix, roc_curve, auc
    from sklearn.preprocessing import label_binarize
    import numpy as np

    y_test_bi = label_binarize(y_test, classes=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18, 19,20,21,2,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,3,40,41,42,43,44,45])
    y_pred_bi = label_binarize(y_pred, classes=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18, 19,20,21,2,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,3,40,41,42,43,44,45])
    # Compute ROC curve and ROC area for each class
    fpr = dict()
    tpr = dict()
    roc_auc = dict()
    for i in range(2):
        fpr[i], tpr[i], _ = roc_curve(y_test_bi, y_pred_bi)
        roc_auc[i] = auc(fpr[i], tpr[i])

ただし、現在、次のエラーが発生しています。

Traceback (most recent call last):
  File "C:\Users\app\Documents\Python Scripts\gbc_classifier_test.py", line 152, in <module>
    fpr[i], tpr[i], _ = roc_curve(y_test_bi, y_pred_bi)
  File "C:\Users\app\Anaconda\lib\site-packages\sklearn\metrics\metrics.py", line 672, in roc_curve
    fps, tps, thresholds = _binary_clf_curve(y_true, y_score, pos_label)
  File "C:\Users\app\Anaconda\lib\site-packages\sklearn\metrics\metrics.py", line 505, in _binary_clf_curve
    y_true = column_or_1d(y_true)
  File "C:\Users\app\Anaconda\lib\site-packages\sklearn\utils\validation.py", line 265, in column_or_1d
    raise ValueError("bad input shape {0}".format(shape))
ValueError: bad input shape (300L, 46L)
4

2 に答える 2

3

roc_curve[n_samples]は shape ( link ) のパラメーターを取り、入力 (y_test_biまたはy_pred_bi) は shape(300, 46)です。最初に注意してください

y_pred_bi問題は、呼び出しによって作成された確率の配列だと思いますclf.predict_proba(X)(これを確認してください)。分類器は 46 クラスすべてでトレーニングされているため、データ ポイントごとに 46 次元のベクトルを出力しますが、それについては何もlabel_binarizeできません。

私はこれを回避する2つの方法を知っています:

  1. 前に呼び出すことによって46のバイナリ分類器をトレーニングし、ROC 曲線を計算します。label_binarizeclf.fit()
  2. 300 行 46 列の出力配列の各列をスライスし、それを 2 番目のパラメーターとして に渡しますroc_curvey_pred_biこれは、確率が含まれていると仮定して、私の好みのアプローチです
于 2014-08-05T08:06:51.377 に答える