【发布时间】: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)。
标签: scikit-learn cross-validation confusion-matrix precision-recall imblearn