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
関数を変更しますか?
前もって感謝します !
再現率と適合率を計算するには、次のようにデータを実際に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には当てはまりません。
私はここで同じ問題に遭遇しました、そして私はそれを解決しました
# 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)
上に示した構文は正しいです。使用しているデータに問題があるようです。ラベルは、連続した数値でない限り、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')
このような相互検証を使用して、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)))
スコアリングパラメータの詳細については、 ページ を参照してください。