簡體   English   中英

Scikit:使用cross_val_score函數計算精度和召回率

[英]Scikit: calculate precision and recall using cross_val_score function

我正在使用scikit對垃圾郵件/火腿數據進行邏輯回歸。 X_train是我的訓練數據和y_train標簽('垃圾郵件'或'火腿'),我訓練我的LogisticRegression:

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

如果我想獲得10倍交叉驗證的准確度,我只想寫:

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

我認為通過這種方式簡單地添加一個參數也可以計算精度和召回率:

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') 

它與數據有關(我應該對標簽進行二值化嗎?)還是更改了cross_val_score函數?

先感謝您 !

要計算召回率和精度,數據必須確實是二值化的,這樣:

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

為了更進一步,當我想計算准確度時,我不必對數據進行二值化:

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)

您在上面顯示的語法是正確的。 看起來您正在使用的數據存在問題。 標簽不需要二值化,只要它們不是連續數字。

您可以使用不同的數據集證明相同的語法:

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)))

更多得分參數只需看到頁面

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM