Scikit learn 如何计算所有褶皱的平均分类报告?

Scikit learn 如何计算所有褶皱的平均分类报告?,scikit-learn,classification,cross-validation,Scikit Learn,Classification,Cross Validation,我正在尝试做一个二元类分类。因为我有一个小数据集(275个样本),所以我没有交叉验证,希望得到所有褶皱的平均分类报告和AUROC/AUPRC 我一直在密切关注以获得结果,但我无法理解最后一行中的代码在做什么 for i in classifiers: print(i) originalclass = [] predictedclass = [] model=i loo = LeaveOneOut() print('Scores before fea

我正在尝试做一个二元类分类。因为我有一个小数据集(275个样本),所以我没有交叉验证,希望得到所有褶皱的平均分类报告和AUROC/AUPRC

我一直在密切关注以获得结果,但我无法理解最后一行中的代码在做什么

for i in classifiers:
    print(i)
    originalclass = []
    predictedclass = []
    model=i
    loo = LeaveOneOut()
    print('Scores before feature selection')
    scores = cross_val_score(model, subset, y,cv=loo,scoring=make_scorer(classification_report_with_accuracy_score))
    print("CV score",np.mean(cross_val_score(model,subset,y,cv=loo,scoring='roc_auc')))
    print(classification_report(originalclass, predictedclass))
    print('Scores after feature selection')
    X_reduced=feature_reduction_using_RFECV(model,subset,y)
    scores = cross_val_score(model, X_reduced, y,cv=loo,scoring=make_scorer(classification_report_with_accuracy_score))
    print("CV score",np.mean(cross_val_score(model,X_reduced,y,cv=loo,scoring='roc_auc')))
    print(classification_report(originalclass, predictedclass))
上述代码中的平均值具体发生在哪里?我正在计算平均简历分数并打印出来。但那之后的那句话最让我困惑。我在一开始初始化originalclass和predictedclass变量,但在最后一行打印之前,它在哪里使用

print(classification_report(originalclass, predictedclass))
编辑的代码

for i in classifiers:
    print(i)
    originalclass = y
    model=i
    loo = LeaveOneOut()
    print('Scores before feature selection')
    y_pred = cross_val_predict(model, subset, y, cv=loo)
    print(classification_report(originalclass, y_pred))
    print("CV score",np.mean(cross_val_score(model,subset,y,cv=loo,scoring='roc_auc')))
    print(classification_report(originalclass, y_pred))
    print('Scores after feature selection')
    X_reduced=feature_reduction_using_RFECV(model,subset,y)
    y_pred = cross_val_predict(model, X_reduced, y, cv=loo)
    classification_report(originalclass, y_pred)
    print("CV score",np.mean(cross_val_score(model,X_reduced,y,cv=loo,scoring='roc_auc')))
    print(classification_report(originalclass, y_pred))
当你使用

print("CV score",np.mean(cross_val_score(model,X_reduced,y,cv=loo,scoring='roc_auc'))) 
您可以在
cv
下打印模型的平均交叉验证
roc_auc
指标,即退出方案


下一个命令:

print(classification_report(originalclass, predictedclass))
用于打印完整的分类报告,而不仅仅是前一行中的平均
roc\u auc
指标

此命令将以下参数作为输入参数:

classification_report(y_true, y_pred)
y_-true
originalclass
对于您来说,基本事实和
y_-pred
应该是预测的交叉验证标签/类别


你应该有这样的东西:

y_pred = cross_val_predict(model, X_reduced, y, cv=loo)
classification_report(originalclass, y_pred)
from sklearn.metrics import classification_report

originalclass = [0, 1, 2, 2, 2]
y_pred = [0, 0, 2, 2, 1]
print(classification_report(originalclass, y_pred))

现在,
y_pred
已经对标签的预测进行了交叉验证,因此分类报告将根据分类度量打印交叉验证的结果


说明上述内容的玩具示例:

y_pred = cross_val_predict(model, X_reduced, y, cv=loo)
classification_report(originalclass, y_pred)
from sklearn.metrics import classification_report

originalclass = [0, 1, 2, 2, 2]
y_pred = [0, 0, 2, 2, 1]
print(classification_report(originalclass, y_pred))


谢谢你的回复。因此,为了澄清,我上面粘贴的代码并没有计算所有折叠的平均分类报告?您的初始代码根本无法工作。
originalclass,predictedclass
在哪里构造?他们是空的,现在看来没问题了
originalclass=y
当然可以在循环之外。考虑一下投票和接受我的答案。最后,我们预测我们的标签使用交叉验证模型并得到分类报告,对吗?code>cross\u val\u predict使用交叉验证预测标签。你的问题没有任何意义;您当然可以平均CV分数(此处为
np.mean
),但不能“平均”分类报告。请参阅,以准确了解在交叉验证中,分类报告实际上是什么,我们在每n-1倍上进行培训,并在第n倍上进行测试。作为每次运行的结果,我们会得到一个混淆矩阵,从而得到分类报告。我能不能对每一次折叠的敏感性/特异性等进行平均?