web-dev-qa-db-ja.com

Scikit:cross_val_score関数を使用して適合率と再現率を計算します

Scikitを使用して、スパム/ハムデータのロジスティック回帰を実行しています。 X_trainは私のトレーニングデータであり、y_trainはラベル(「スパム」または「ハム」)であり、ロジスティック回帰を次のようにトレーニングしました。

classifier = LogisticRegression()
classifier.fit(X_train, y_train)

10分割交差検定の精度を取得したい場合は、次のように記述します。

 accuracy = cross_val_score(classifier, X_train, y_train, cv=10)

このように1つのパラメーターを追加するだけで、精度とリコールも計算できると思いました。

precision = cross_val_score(classifier, X_train, y_train, cv=10, scoring='precision')
recall = cross_val_score(classifier, X_train, y_train, cv=10, scoring='recall')

ただし、結果はValueErrorになります。

ValueError: pos_label=1 is not a valid label: array(['ham', 'spam'], dtype='|S4') 

それはデータに関連していますか(ラベルを2値化する必要がありますか?)、それともcross_val_score関数を変更しますか?

前もって感謝します !

14

再現率と適合率を計算するには、次のようにデータを実際に2値化する必要があります。

from sklearn import preprocessing
lb = preprocessing.LabelBinarizer()
lb.fit(y_train)

さらに進んで、精度を計算したいときにデータを2値化する必要がなかったことに驚きました。

accuracy = cross_val_score(classifier, X_train, y_train, cv=10)

これは、適合率の式が、どのクラスが正または負と見なされるかについての情報を実際に必要としないためです:(TP + TN)/(TP + TN + FN + FP))。 TPとTNは交換可能ですが、再現率、適合率、およびf1には当てはまりません。

13

私はここで同じ問題に遭遇しました、そして私はそれを解決しました

# precision, recall and F1
from sklearn.preprocessing import LabelBinarizer

lb = LabelBinarizer()
y_train = np.array([number[0] for number in lb.fit_transform(y_train)])

recall = cross_val_score(classifier, X_train, y_train, cv=5, scoring='recall')
print('Recall', np.mean(recall), recall)
precision = cross_val_score(classifier, X_train, y_train, cv=5, scoring='precision')
print('Precision', np.mean(precision), precision)
f1 = cross_val_score(classifier, X_train, y_train, cv=5, scoring='f1')
print('F1', np.mean(f1), f1)
5
Xiangru Lian

上に示した構文は正しいです。使用しているデータに問題があるようです。ラベルは、連続した数値でない限り、2値化する必要はありません。

異なるデータセットで同じ構文を証明できます。

iris = sklearn.dataset.load_iris()
X_train = iris['data']
y_train = iris['target']

classifier = LogisticRegression()
classifier.fit(X_train, y_train)

print cross_val_score(classifier, X_train, y_train, cv=10, scoring='precision')
print cross_val_score(classifier, X_train, y_train, cv=10, scoring='recall')
3
Jeff G

このような相互検証を使用して、f1スコアを取得し、思い出すことができます。

print('10-fold cross validation:\n')
start_time = time()
scores = cross_validation.cross_val_score(clf, X,y, cv=10, scoring ='f1')
recall_score=cross_validation.cross_val_score(clf, X,y, cv=10, scoring ='recall')
print(label+" f1: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), 'DecisionTreeClassifier'))
print("---Classifier %s use %s seconds ---" %('DecisionTreeClassifier', (time() - start_time)))

スコアリングパラメータの詳細については、 ページ を参照してください。

1
Zero