使用 10 折交叉验证获取分类报告,说明多项式朴素贝叶斯的分类精度和召回率

Posted

技术标签:

【中文标题】使用 10 折交叉验证获取分类报告,说明多项式朴素贝叶斯的分类精度和召回率【英文标题】:Get a classification report stating the class wise precision and recall for multinomial Naive Bayes using 10 fold cross validation 【发布时间】:2015-09-19 10:13:42 【问题描述】:

我有以下一段代码,它使用 NB 分类器来解决多类分类问题。该函数通过存储准确度并稍后打印平均值来执行交叉验证。相反,我想要的是一份分类报告,指定类别的精确度和召回率,而不是最终的平均准确度得分。

   import random
   from sklearn import cross_validation
   from sklearn.naive_bayes import MultinomialNB

   def multinomial_nb_with_cv(x_train, y_train):
        random.shuffle(X)
        kf = cross_validation.KFold(len(X), n_folds=10)
        acc = []
        for train_index, test_index in kf:
            y_true = y_train[test_index]
            clf = MultinomialNB().fit(x_train[train_index],         
            y_train[train_index])
            y_pred = clf.predict(x_train[test_index])
            acc.append(accuracy_score(y_true, y_pred))

如果我不执行交叉验证,我所要做的就是:

    from sklearn.metrics import classification_report
    from sklearn.naive_bayes import MultinomialNB

    def multinomial_nb(x_train, y_train, x_test, y_test):
        clf = MultinomialNB().fit(x_train, y_train)
        y_pred = clf.predict(x_test)
        y_true = y_test
        print classification_report(y_true, y_pred)

它给了我这样的报告:

        precision    recall  f1-score   support

      0       0.50      0.24      0.33       221
      1       0.00      0.00      0.00        18
      2       0.00      0.00      0.00        27
      3       0.00      0.00      0.00        28
      4       0.00      0.00      0.00        32
      5       0.04      0.02      0.02        57
      6       0.00      0.00      0.00        26
      7       0.00      0.00      0.00        25
      8       0.00      0.00      0.00        43
      9       0.00      0.00      0.00        99
     10       0.63      0.98      0.76       716

    avg / total       0.44      0.59      0.48      1292

即使在交叉验证的情况下,我如何才能获得类似的报告?

【问题讨论】:

【参考方案1】:

您可以使用cross_val_predict 生成交叉验证预测,然后使用classification_report

from sklearn.datasets import make_classification
from sklearn.cross_validation import cross_val_predict
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import classification_report

# generate some artificial data with 11 classes
X, y = make_classification(n_samples=2000, n_features=20, n_informative=10, n_classes=11, random_state=0)

# your classifier, assume GaussianNB here for non-integer data X
estimator = GaussianNB()
# generate your cross-validation prediction with 10 fold Stratified sampling
y_pred = cross_val_predict(estimator, X, y, cv=10)
y_pred.shape

Out[91]: (2000,)

# generate report
print(classification_report(y, y_pred))

             precision    recall  f1-score   support

          0       0.47      0.36      0.41       181
          1       0.38      0.46      0.41       181
          2       0.45      0.53      0.48       182
          3       0.29      0.45      0.35       183
          4       0.37      0.33      0.35       183
          5       0.40      0.44      0.42       182
          6       0.27      0.13      0.17       183
          7       0.47      0.44      0.45       182
          8       0.34      0.27      0.30       182
          9       0.41      0.44      0.42       179
         10       0.42      0.41      0.41       182

avg / total       0.39      0.39      0.38      2000

【讨论】:

这很棒。 cross_val_predict 内部也是如此,只是为每个折叠连接 y_true 和 y_pred 并最终输出。后来才发现,我能做的和我之前的代码一样。 @CuriousCat 是的,所以首先我们将整个样本分成 10 份。然后我们使用每个折叠作为测试样本进行交叉验证,并存储相应的预测。最后,cross_val_pred 连接这些非重叠预测并返回与我们的完整训练样本长度相同的结果。

以上是关于使用 10 折交叉验证获取分类报告,说明多项式朴素贝叶斯的分类精度和召回率的主要内容,如果未能解决你的问题,请参考以下文章

如何在朴素贝叶斯分类器中使用 k 折交叉验证?

MATLAB 中神经网络分类的 10 折交叉验证示例

使用交叉验证提高准确性,不使用交叉验证降低准确性

在 KFold 交叉验证的情况下如何显示平均分类报告和混淆矩阵

如何交叉验证朴素贝叶斯分类器?

应用分层10折交叉验证时如何在python中获取所有混淆矩阵的聚合