交叉验证管道的分类报告

Posted

技术标签:

【中文标题】交叉验证管道的分类报告【英文标题】:Classification report for cross validation pipeline 【发布时间】:2017-11-16 12:03:40 【问题描述】:

我在与 SMOTE(imblearn 库)的交叉验证中使用 Pipelines 来检查欺诈和非欺诈客户的不平衡数据集

gbm0 = GradientBoostingClassifier(random_state=10)

    samplers = [['SMOTE', SMOTE(random_state=RANDOM_STATE, ratio=0.5, kind='borderline1')]]
    classifier = ['gbm', gbm0]
    pipelines = [
        ['-'.format(sampler[0], classifier[0]),
         make_pipeline(sampler[1], classifier[1])]
        for sampler in samplers
    ]
    stdsc = StandardScaler()
    cv = StratifiedKFold(n_splits=3)
    mean_tpr = 0.0
    mean_fpr = np.linspace(0, 1, 100)
    Xstd = stdsc.fit_transform(X)
    scores = []
    confusion = np.array([[0, 0], [0, 0]])
    for name, pipeline in pipelines:
        mean_tpr = 0.0
        mean_fpr = np.linspace(0, 1, 100)
        for tr,ts in cv.split(Xstd, y):
            xtrain = Xstd[tr]
            ytrain = y[tr]
            test = y[ts]
            xtest = Xstd[ts]
            pipeline.fit(xtrain, ytrain)
            probas_ = pipeline.predict_proba(xtest)
            fpr, tpr, thresholds = roc_curve(test, probas_[:, 1])
            mean_tpr += interp(mean_fpr, fpr, tpr)
            mean_tpr[0] = 0.0
            roc_auc = auc(fpr, tpr)

            predictions = pipeline.predict(xtest)
            confusion += confusion_matrix(test, predictions)
            score = f1_score(test, predictions)
            scores.append(score)

        mean_tpr /= cv.get_n_splits(Xstd, y)
        mean_tpr[-1] = 1.0

我可以得到混淆矩阵和ROC曲线,但我需要精确度和召回率,我应该怎么做?

编辑

我知道 scikit-learn 中有分类报告,但我如何将它用于 CV 中的预测?

【问题讨论】:

在scikit中其实有一个名为classification_report的方法。也许这会有所帮助。 我知道我已经尝试过了,但是如何让它在交叉验证中用于总预测? 我不确定我是否理解正确。您的意思是像计算 mean_tpr 和 mean_fpr 一样计算精度和召回率?然后你可以用你在这里计算 f1_score 的同样方法来做。 是的,我需要像我一样计算 f1 分数。语法方面的帮助表示赞赏 只需使用recall_score(test, predictions)precision_score(test, predictions) 【参考方案1】:

所以我最终使用了

 
 from sklearn.metrics import precision_recall_fscore_support as score
 scores = []
 recalls = []
 precisions = []

 precision, recall, fscore, support = score(test, predictions)
 recalls.append(recall)
 recalls.append(recall)
 precisions.append(precision)

紧随其后

print('Score:', sum(scores) / len(scores))
Recall:', sum(recalls) / len(recalls))
Precision:', sum(precisions) / len(precisions))

【讨论】:

以上是关于交叉验证管道的分类报告的主要内容,如果未能解决你的问题,请参考以下文章

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

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

使用 Imblearn 管道和 GridSearchCV 进行交叉验证

交叉验证

为啥交叉验证 RF 分类的性能比没有交叉验证的差?

KaggleIntermediate Machine Learning(管道+交叉验证)