web-dev-qa-db-ja.com

エラー:分類メトリクスは、マルチクラスマルチ出力とマルチラベルインジケーターのターゲットの混合を処理できません

私は一般に機械学習の初心者です。

マルチラベルのテキスト分類を試みています。これらのドキュメントの元のラベルと、1つのホットエンコーディング(19000ドキュメントx 200ラベル)として表された分類の結果(使用されたmlknn分類子)があります。現在、f1_scoreマイクロとマクロで分類を評価しようとしていますが、このエラー(3行目)ValueError: Classification metrics can't handle a mix of multiclass-multioutput and multilabel-indicator targetsが発生し、解決方法がわかりません。これは私のコードです:

1. y_true = np.loadtxt("target_matrix.txt")
2. y_pred = np.loadtxt("classification_results.txt")

3. print (f1_score(y_true, y_pred, average='macro'))
4. print (f1_score(y_true, y_pred, average='micro'))

また、分類にcross_val_scoreを使用して評価をすぐに取得しようとしましたが、別のエラーが発生しました(cross_val_score行から):

File "_csparsetools.pyx", line 20, in scipy.sparse._csparsetools.lil_get1
File "_csparsetools.pyx", line 48, in scipy.sparse._csparsetools.lil_get1
IndexError: column index (11) out of bounds

これは私のコードです:

X = np.loadtxt("docvecs.txt", delimiter=",")
y = np.loadtxt("target_matrix.txt", dtype='int')

cv_scores = []
mlknn = MLkNN(k=10)  
scores = cross_val_score(mlknn, X, y, cv=5, scoring='f1_micro')
cv_scores.append(scores)

エラーのいずれかで何か助けていただければ幸いです。

6
Lossan

私は手動でy配列を作成していましたが、それは私の間違いだったようです。次の例のように、MultiLabelBinarizerを使用して作成しました。

train_foo = [['sci-fi', 'thriller'],['comedy'],['sci-fi', 'thriller'],['comedy']]
mlb = MultiLabelBinarizer()
mlb_label_train = mlb.fit_transform(train_foo)

X = np.loadtxt("docvecs.txt", delimiter=",")
cv_scores = []
mlknn = MLkNN(k=3) 
scores = cross_val_score(mlknn, X, mlb_label_train, cv=5, scoring='f1_macro')
cv_scores.append(scores)

MultiLabelBinarizerhere のドキュメントを見つけることができます。

1
Lossan

Yの最初の2つの要素を表示できますか? scikit-multilearnを使用していますか?また、scikit-multilearnの0.1.0リリース候補を使用できる場合は、2番目のエラーがマスターで修正されたバグである可能性が高く、新しいバージョンが数日以内にリリースされる予定です。

あなたはpip経由でマスターを取得できます:pip uninstall -y scikit-multilearn pip install https://github.com/scikit-multilearn/scikit-multilearn/archive/master.Zip

1
niedakh