Как вычислить средние значения в отчете о классификации для всех сгибов в перекрестной проверке по K-кратному критерию? - PullRequest
0 голосов
/ 20 апреля 2020

Моя цель состоит в том, чтобы иметь отчет о классификации для всех сгибов в перекрестной проверке с K-сгибами.

Я адаптировал свой сценарий в соответствии с решением, предложенным в этом посте . Вот мой код:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn import metrics
from sklearn.metrics import classification_report, accuracy_score, make_scorer
from sklearn.model_selection._validation import cross_val_score
from sklearn.model_selection import KFold
from scipy.stats import sem


r_filenameTSV = 'TSV/A19784.tsv'

tsv_read = pd.read_csv(r_filenameTSV, sep='\t',names=["vector"])

df = pd.DataFrame(tsv_read)

df = pd.DataFrame(df.vector.str.split(' ',1).tolist(),
                                   columns = ['label','vector'])

print(df)


y = pd.DataFrame([df.label]).astype(int).to_numpy().reshape(-1,1).ravel()
print(y.shape)
#exit()

X = pd.DataFrame([dict(y.split(':') for y in x.split()) for x in df['vector']])
print(X.astype(float).to_numpy())
print(X)
#exit()

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,random_state=0)


clf = svm.SVC(kernel='rbf',
              C=100,
              gamma=0.001,
              )
#scores = cross_val_score(clf, X, y, cv=10)

print ("K-Folds scores:")
#print (scores) 

def classification_report_with_accuracy_score(y_true, y_pred):

    print (classification_report(y_true, y_pred)) # print classification report
    return accuracy_score(y_true, y_pred) # return accuracy score
    # Nested CV with parameter optimization
scores = cross_val_score(clf, X, y, cv=10, \
               scoring=make_scorer(classification_report_with_accuracy_score))
print (scores)   

У меня есть отчет о классификации для каждого сгиба, подобный следующему:

       precision    recall  f1-score   support

           0       1.00      0.48      0.65       702
           1       0.78      1.00      0.88      1276

    accuracy                           0.82      1978
   macro avg       0.89      0.74      0.76      1978
weighted avg       0.86      0.82      0.80      1978

Чтобы получить такой же отчет об общем вычислении 10 сгибов, что Я должен изменить?

С уважением

1 Ответ

0 голосов
/ 21 апреля 2020

может быть полезно. Вот как я решил проблему:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn import metrics
from sklearn.metrics import classification_report, accuracy_score, make_scorer
from sklearn.model_selection._validation import cross_val_score
from sklearn.model_selection import GridSearchCV, KFold, StratifiedKFold
from scipy.stats import sem


r_filenameTSV = 'TSV/A19784.tsv'

tsv_read = pd.read_csv(r_filenameTSV, sep='\t',names=["vector"])

df = pd.DataFrame(tsv_read)

df = pd.DataFrame(df.vector.str.split(' ',1).tolist(),
                                   columns = ['label','vector'])

print(df)


y = pd.DataFrame([df.label]).astype(int).to_numpy().reshape(-1,1).ravel()
print(y.shape)
#exit()

X = pd.DataFrame([dict(y.split(':') for y in x.split()) for x in df['vector']])
print(X.astype(float).to_numpy())
print(X)
#exit()

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,random_state=0)


clf = svm.SVC(kernel='rbf',
              C=3,
              gamma=3,
              )
#scores = cross_val_score(clf, X, y, cv=10)

print ("K-Folds scores:")
#print (scores) 

'''
def classification_report_with_accuracy_score(y_true, y_pred):

    print (classification_report(y_true, y_pred)) # print classification report
    return accuracy_score(y_true, y_pred) # return accuracy score

scores = cross_val_score(clf, X, y, cv=10, \
    scoring=make_scorer(classification_report_with_accuracy_score))
print (scores)
'''
originalclass = []
predictedclass = []

def classification_report_with_accuracy_score(y_true, y_pred):
    originalclass.extend(y_true)
    predictedclass.extend(y_pred)
    return accuracy_score(y_true, y_pred) # return accuracy score

inner_cv = StratifiedKFold(n_splits=10)
outer_cv = StratifiedKFold(n_splits=10)

# Nested CV with parameter optimization
nested_score = cross_val_score(clf, X=X, y=y, cv=outer_cv, scoring=make_scorer(classification_report_with_accuracy_score))

# Average values in classification report for all folds in a K-fold Cross-validation  
print(classification_report(originalclass, predictedclass)) 

Результат

K-Folds scores:
              precision    recall  f1-score   support

           0       0.83      0.81      0.82      7023
           1       0.90      0.90      0.90     12761

    accuracy                           0.87     19784
   macro avg       0.86      0.86      0.86     19784
weighted avg       0.87      0.87      0.87     19784
...