2016-03-08 31 views
12

Tôi đang cố gắng đánh giá nhiều thuật toán học máy với sklearn cho một vài số liệu (độ chính xác, nhớ lại, độ chính xác và có thể nhiều hơn).Đánh giá nhiều điểm số trên sklearn cross_val_score

Đối với những gì tôi hiểu từ tài liệu here và từ mã nguồn (Tôi đang sử dụng sklearn 0,17), chức năng cross_val_score chỉ nhận được một trình ghi điểm cho mỗi lần thực thi. Vì vậy, để tính nhiều điểm, tôi phải:

  1. Execute nhiều lần
  2. Thực hiện của tôi (tốn thời gian và dễ bị lỗi) ghi bàn

    tôi đã thực hiện nhiều lần với mã này:

    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 
    
    iris = load_iris() 
    
    models = [GaussianNB(), DecisionTreeClassifier(), SVC()] 
    names = ["Naive Bayes", "Decision Tree", "SVM"] 
    for model, name in zip(models, names): 
        print name 
        start = time.time() 
        for score in ["accuracy", "precision", "recall"]: 
         print score, 
         print " : ", 
         print cross_val_score(model, iris.data, iris.target,scoring=score, cv=10).mean() 
        print time.time() - start 
    

Và tôi nhận ra điều này:

Naive Bayes 
accuracy : 0.953333333333 
precision : 0.962698412698 
recall : 0.953333333333 
0.0383198261261 
Decision Tree 
accuracy : 0.953333333333 
precision : 0.958888888889 
recall : 0.953333333333 
0.0494720935822 
SVM 
accuracy : 0.98 
precision : 0.983333333333 
recall : 0.98 
0.063080072403 

Điều đó là ổn, nhưng dữ liệu của tôi rất chậm. Làm cách nào tôi có thể đo lường tất cả điểm số?

+0

Tôi sẽ cố gắng triển khai nội dung 'cross_val_score' đang thực hiện thủ công – Ryan

+0

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ể? –

+0

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? –

Trả lời

14

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.  ] 
10

Tôi đã chạy trên cùng một vấn đề và tôi đã tạo mô-đun có thể hỗ trợ nhiều chỉ số trong cross_val_score.
Để thực hiện những gì bạn muốn với mô-đun này, bạn có thể viết:

from multiscorer import MultiScorer 
import numpy as np 

scorer = MultiScorer({ 
    'Accuracy' : (accuracy_score, {}), 
    'Precision' : (precision_score, {'pos_label': 3, 'average':'macro'}), 
    'Recall' : (recall_score, {'pos_label': 3, 'average':'macro'}) 
}) 

for model, name in zip(models, names): 
    print name 
    start = time.time() 

    cross_val_score(model, iris.data, iris.target,scoring=scorer, cv=10) 
    results = scorer.get_results() 

    for metric_name in results.keys(): 
     average_score = np.average(results[metric_name]) 
     print('%s : %f' % (metric_name, average_score)) 

    print 'time', time.time() - start, '\n\n' 

Bạn có thể kiểm tra và tải về module này từ GitHub. Hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan