我正在研究二进制分类问题,我试图评估一些分类算法的性能(LR,分解树,随机森林.)。我使用交叉验证技术(避免过度拟合)和AUC ROC作为评分函数来比较算法的性能,但我得到了与随机森林算法和AdbBoost算法的一个奇怪的结果,尽管该算法的召回率和FPR分别不同于1和0,但有一个完美的AUC_ROC评分(即=1)。

def FPR(y_true, y_pred):
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
result = fp / (fp+tn)
return result
def FNR(y_true, y_pred):
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
result = fn / (tp+fn)
return result
FPR_scorer = make_scorer(FPR)
FNR_scorer = make_scorer(FNR)
def get_CrossValResults2(model,cv_rst,bestIndx):
best=pd.DataFrame.from_dict(cv_rst).iloc[bestIndx]
roc="{:.12f}".format(best['mean_test_roc_auc'])
acc ="{:.0%}".format(best['mean_test_accuracy'])
prec ="{:.0%}".format(best['mean_test_precision'])
rec ="{:.0%}".format( best['mean_test_recall'])
f1 ="{:.0%}".format(best['mean_test_f1'])
r2="{:.2f}".format(best['mean_test_r2'])
g_mean="{:.2f}".format(best['mean_test_gmean'])
pr_auc="{:.8f}".format(best['mean_test_pr'])
fnr="{:.0%}".format(best['mean_test_fnr'])
fpr="{:.0%}".format(best['mean_test_fpr'])
rst = pd.DataFrame([[ model, acc,prec,rec,fpr,fnr,f1,roc,pr_auc,g_mean,r2]],columns = ['Model', 'Accuracy', 'Precision', 'Recall','FPR','FNR', 'F1-Score','ROC_auc','PR_auc','gmean','r2'])
return rst
cross_val_rst = pd.DataFrame(columns = ['Model', 'Accuracy', 'Precision', 'Recall','FPR','FNR', 'F1-Score','ROC_auc','PR_auc','gmean','r2'])
scoring = {'accuracy':'accuracy','recall':'recall','precision':'precision','fpr':FPR_scorer,'fnr':FNR_scorer,'f1':'f1' ,'roc_auc':'roc_auc','pr':'average_precision','gmean':Gmean_scorer,'r2':'r2'}
param_grid = {'n_estimators': [200],
'max_depth': [80,90],
'min_samples_leaf': [2,3, 4],
'min_samples_split': [2,5,12],
'criterion': [ 'gini'],
'class_weight' : [class_weights], 'n_jobs' : [-1]}
clf = GridSearchCV(RandomForestClassifier(class_weight=class_weights), param_grid, cv=kfold,scoring=scoring,refit=refit)#Fit the model
bestmodel = clf.fit(X,Y)
cross_val_rst = cross_val_rst.append(get_CrossValResults2(model='Random Forrest',bestIndx=bestmodel.best_index_,cv_rst=bestmodel.cv_results_),ignore_index=True)发布于 2020-08-24 14:44:51
哦,我想我终于拿到了。这只是一个平均问题:对于k-折叠交叉验证中的每一次,您得到了完美的auROC,但在默认阈值为0.5时,您的硬分类器(每一次)有时有FPR=0和TPR<1,但有时还有FPR>0和TPR=1。然后平均,你就可以得到\operatorname{mean}(FPR)>0和\operatorname{mean}(TPR)<1。
要检查,请查看cv_results_表,特别是每个测试折叠分数(split<i>_test_<xyz>),而不仅仅是mean_test_<xyz>分数。
发布于 2020-07-20 15:14:55
我认为回忆和FPR是在scikit中计算的--使用0.5的阈值来学习。另一方面,ROC AUC是透明的模型阈值。我鼓励您探索雪橇脱粒机-乐高,在这个方向上进行检查。
AUC =1但FPR不好的一个例子是,如果你使用0.5作为阈值,你可以很好地分割你的样本,但是阳性样本的分数在0.2到0.4之间,而你的阴性样本的分数在0到0.2之间。
https://datascience.stackexchange.com/questions/78032
复制相似问题