2016-09-25 24 views
6
için sklearn.roc_auc_score hesaplayın

Sınıflandırıcım için AUC, kesinlik, doğruluk hesaplamak istiyorum. Denetlenen öğrenme yapıyorum:Çok sınıflı

İşte benim çalışma kodum. Bu kod, ikili sınıf için iyi çalışıyor, ancak çok sınıf için çalışmıyor. Bu kod iyi çalışıyor ben ortalama AUC, hassasiyet elde etmek için elbette K sonuçları bölünmüş Sonunda

sample_features_dataframe = self._get_sample_features_dataframe() 
labeled_sample_features_dataframe = retrieve_labeled_sample_dataframe(sample_features_dataframe) 
labeled_sample_features_dataframe, binary_class_series, multi_class_series = self._prepare_dataframe_for_learning(labeled_sample_features_dataframe) 

k = 10 
k_folds = StratifiedKFold(binary_class_series, k) 
for train_indexes, test_indexes in k_folds: 
    train_set_dataframe = labeled_sample_features_dataframe.loc[train_indexes.tolist()] 
    test_set_dataframe = labeled_sample_features_dataframe.loc[test_indexes.tolist()] 

    train_class = binary_class_series[train_indexes] 
    test_class = binary_class_series[test_indexes] 
    selected_classifier = RandomForestClassifier(n_estimators=100) 
    selected_classifier.fit(train_set_dataframe, train_class) 
    predictions = selected_classifier.predict(test_set_dataframe) 
    predictions_proba = selected_classifier.predict_proba(test_set_dataframe) 

    roc += roc_auc_score(test_class, predictions_proba[:,1]) 
    accuracy += accuracy_score(test_class, predictions) 
    recall += recall_score(test_class, predictions) 
    precision += precision_score(test_class, predictions) 

vb : Eğer bir ikili sınıflarıyla dataframe olduğunu varsayalım ediniz. Ancak, çoklu sınıf için aynı hesaplayamaz:

train_class = multi_class_series[train_indexes] 
    test_class = multi_class_series[test_indexes] 

    selected_classifier = RandomForestClassifier(n_estimators=100) 
    selected_classifier.fit(train_set_dataframe, train_class) 

    predictions = selected_classifier.predict(test_set_dataframe) 
    predictions_proba = selected_classifier.predict_proba(test_set_dataframe) 

ben çok sınıf için ortalamanın için "ağırlıklı" parametresini eklemek zorunda olduğunu buldu. ValueError yükseltmek ("{0} biçimi desteklenmiyor" .format (y_type))

ValueError: çok sınıflı biçimi

cevap

4

Sen kullanamazsınız desteklenmez

roc += roc_auc_score(test_class, predictions_proba[:,1], average="weighted") 

bir hata aldım Çok katlı modeller için tek bir özet metrik olarak roc_auc. İsterseniz bunu bir çok sınıflı modelin performansını değerlendirmek için sklearn.metrics.confusion_matrix kullanmak daha olağandır Ancak,

roc = {label: [] for label in multi_class_series.unique()} 
for label in multi_class_series.unique(): 
    selected_classifier.fit(train_set_dataframe, train_class == label) 
    predictions_proba = selected_classifier.predict_proba(test_set_dataframe) 
    roc[label] += roc_auc_score(test_class, predictions_proba[:,1]) 

olarak, her bir sınıf roc_auc hesaplamak olabilir.

6

roc_auc_score'un average seçeneği yalnızca çok ilaveli sorunlar için tanımlanmıştır.

Sen çok sınıflı sorunları için mikro veya makro-ortalamalı puanları kendi tanımlamak için scikit-öğrenme belgelerinden aşağıdaki örnekte bir göz atabilirsiniz:

http://scikit-learn.org/stable/auto_examples/model_selection/plot_roc.html#multiclass-settings

Düzenleme: Bir yoktur Multiclass problemleri için ROC AUC uygulamak için scikit-öğrenme izleyicide sorun: https://github.com/scikit-learn/scikit-learn/issues/3298