Kể từ thời điểm viết bài này scikit-Learn đã được cập nhật và làm cho câu trả lời của tôi trở nên lỗi thời, xem giải pháp sạch hơn nhiều so
Bạn có thể viết chức năng ghi bàn của riêng bạn để nắm bắt tất cả ba mảnh thông tin, tuy nhiên chức năng chấm điểm để xác thực chéo chỉ phải trả về một số duy nhất trong
scikit-learn
(điều này có thể là vì lý do tương thích). Dưới đây là ví dụ trong đó mỗi điểm cho mỗi lát xác thực chéo sẽ in ra bảng điều khiển và giá trị trả về chỉ là tổng của ba số liệu. Nếu bạn muốn trả lại tất cả các giá trị này, bạn sẽ phải thực hiện một số thay đổi đối với
cross_val_score
(dòng 1351 của cross_validation.py) và
_score
(dòng 1601 hoặc cùng một tệp).
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier
from sklearn.cross_validation import cross_val_score
import time
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score, precision_score, recall_score
iris = load_iris()
models = [GaussianNB(), DecisionTreeClassifier(), SVC()]
names = ["Naive Bayes", "Decision Tree", "SVM"]
def getScores(estimator, x, y):
yPred = estimator.predict(x)
return (accuracy_score(y, yPred),
precision_score(y, yPred, pos_label=3, average='macro'),
recall_score(y, yPred, pos_label=3, average='macro'))
def my_scorer(estimator, x, y):
a, p, r = getScores(estimator, x, y)
print a, p, r
return a+p+r
for model, name in zip(models, names):
print name
start = time.time()
m = cross_val_score(model, iris.data, iris.target,scoring=my_scorer, cv=10).mean()
print '\nSum:',m, '\n\n'
print 'time', time.time() - start, '\n\n'
Mà cho:
Naive Bayes
0.933333333333 0.944444444444 0.933333333333
0.933333333333 0.944444444444 0.933333333333
1.0 1.0 1.0
0.933333333333 0.944444444444 0.933333333333
0.933333333333 0.944444444444 0.933333333333
0.933333333333 0.944444444444 0.933333333333
0.866666666667 0.904761904762 0.866666666667
1.0 1.0 1.0
1.0 1.0 1.0
1.0 1.0 1.0
Sum: 2.86936507937
time 0.0249638557434
Decision Tree
1.0 1.0 1.0
0.933333333333 0.944444444444 0.933333333333
1.0 1.0 1.0
0.933333333333 0.944444444444 0.933333333333
0.933333333333 0.944444444444 0.933333333333
0.866666666667 0.866666666667 0.866666666667
0.933333333333 0.944444444444 0.933333333333
0.933333333333 0.944444444444 0.933333333333
1.0 1.0 1.0
1.0 1.0 1.0
Sum: 2.86555555556
time 0.0237860679626
SVM
1.0 1.0 1.0
0.933333333333 0.944444444444 0.933333333333
1.0 1.0 1.0
1.0 1.0 1.0
1.0 1.0 1.0
0.933333333333 0.944444444444 0.933333333333
0.933333333333 0.944444444444 0.933333333333
1.0 1.0 1.0
1.0 1.0 1.0
1.0 1.0 1.0
Sum: 2.94333333333
time 0.043044090271
Tính đến scikit-học 0.19.0 giải pháp trở nên nhiều dễ dàng hơn
from sklearn.model_selection import cross_validate
from sklearn.datasets import load_iris
from sklearn.svm import SVC
iris = load_iris()
clf = SVC()
scoring = {'acc': 'accuracy',
'prec_macro': 'precision_macro',
'rec_micro': 'recall_macro'}
scores = cross_validate(clf, iris.data, iris.target, scoring=scoring,
cv=5, return_train_score=True)
print(scores.keys())
print(scores['test_acc'])
Mà cho:
01.
['test_acc', 'score_time', 'train_acc', 'fit_time', 'test_rec_micro', 'train_rec_micro', 'train_prec_macro', 'test_prec_macro']
[ 0.96666667 1. 0.96666667 0.96666667 1. ]
Tôi sẽ cố gắng triển khai nội dung 'cross_val_score' đang thực hiện thủ công – Ryan
Sử dụng Python 3.6 ví dụ này không hoạt động vì dữ liệu đích là đa giác nhưng trung bình của cross_val_score được đặt thành 'nhị phân'. Bạn nhận được lỗi sau: "ValueError: Mục tiêu là đa lớp nhưng trung bình = 'nhị phân'. Vui lòng chọn một cài đặt trung bình khác." Tôi sẽ giải quyết vấn đề này như thế nào? Không thể thực sự binarize nó, tôi có thể? –
Tôi đã sử dụng Python 2.7. và sklearn 0,17. Tôi nghĩ rằng lỗi này xảy ra trong 0,18. Bạn đang sử dụng phiên bản sklearn nào? –