【问题标题】:How to get average score of K-Fold cross validation with sklearn如何使用 sklearn 获得 K-Fold 交叉验证的平均分数
【发布时间】:2018-04-25 18:12:43
【问题描述】:

我使用 sklearn 应用具有 K-fold 的决策树,有人可以帮助我显示它的平均分数。以下是我的代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import KFold
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix,classification_report

dta=pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/blood-transfusion/transfusion.data")

X=dta.drop("whether he/she donated blood in March 2007",axis=1)

X=X.values # convert dataframe to numpy array

y=dta["whether he/she donated blood in March 2007"]

y=y.values # convert dataframe to numpy array

kf = KFold(n_splits=10)

KFold(n_splits=10, random_state=None, shuffle=False)

clf_tree=DecisionTreeClassifier()

for train_index, test_index in kf.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    clf=clf_tree.fit(X_train,y_train)
    print("classification_report_tree", 
           classification_report(y_test,clf_tree.predict(X_test)))

【问题讨论】:

  • average score 是什么意思?你只想要准确性吗?或者召回率、精度和 f1(当您打印分类报告时)。
  • 我想用 K 折运行决策树并显示整体准确度,k 折为 10 将运行 10 次,每次运行时给我们 10 的准确度。如何显示训练的整体准确性

标签: scikit-learn cross-validation


【解决方案1】:

如果你只想要准确,那么你可以简单地使用cross_val_score()

kf = KFold(n_splits=10)
clf_tree=DecisionTreeClassifier()
scores = cross_val_score(clf_tree, X, y, cv=kf)

avg_score = np.mean(score_array)
print(avg_score)

这里cross_val_score 将输入您的原始 X 和 y(不分为训练和测试)。 cross_val_score 将自动将它们拆分为训练和测试,在训练数据上拟合模型并在测试数据上评分。这些分数将在scores 变量中返回。

所以当你有 10 次折叠时,scores 变量中将返回 10 个分数。然后,您可以取其平均值。

【讨论】:

    【解决方案2】:

    您可以尝试使用 sklearn 中的 Precision_reacll_fscore_support 度量标准,然后获取每个类的每个折叠的平均结果。我在这里假设您需要每个班级的平均分数。

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.model_selection import KFold
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.metrics import precision_recall_fscore_support
    from sklearn.model_selection import GridSearchCV,cross_val_score
    
    dta=pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/blood-transfusion/transfusion.data")
    
    X=dta.drop("whether he/she donated blood in March 2007",axis=1)
    
    X=X.values # convert dataframe to numpy array
    
    y=dta["whether he/she donated blood in March 2007"]
    
    y=y.values # convert dataframe to numpy array
    
    kf = KFold(n_splits=10)
    
    KFold(n_splits=10, random_state=None, shuffle=False)
    
    clf_tree=DecisionTreeClassifier()
    
    score_array =[]
    for train_index, test_index in kf.split(X):
        X_train, X_test = X[train_index], X[test_index]
        y_train, y_test = y[train_index], y[test_index]
        clf=clf_tree.fit(X_train,y_train)
        y_pred = clf.predict(X_test)
        score_array.append(precision_recall_fscore_support(y_test, y_pred, average=None))
    
    avg_score = np.mean(score_array,axis=0)
    print(avg_score)
    
    #Output:
    #[[  0.77302466   0.30042282]
    # [  0.81755068   0.22192344]
    # [  0.79063779   0.24414489]
    # [ 57.          17.8       ]]
    

    现在要获得 0 类的精度,您可以使用avg_score[0][0]。召回可以通过第二行访问(即对于 0 类,它是avg_score[1][0]),而 fscore 和支持可以分别从第 3 行和第 4 行访问。

    【讨论】:

    • 虽然另一个答案在技术上是正确的,但这个答案也显示了如何实际训练模型! :)
    猜你喜欢
    • 1970-01-01
    • 2015-09-26
    • 2016-10-21
    • 2018-09-11
    • 2020-07-30
    • 2019-02-19
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多