如何在不降低不平衡数据集中的召回率的情况下提高精度?



我必须使用决策树对不平衡数据集(50000:0,1000:1)进行二元分类。为了获得良好的召回率 (0.92),我使用了模块 Imblearn 中的随机过采样函数,并使用max_depth参数进行修剪。 问题是精度非常低(0.44),我的误报太多了。

我尝试训练一个特定的分类器来处理产生误报的边缘实例。 首先,我将数据集拆分为训练集和测试集(80%-20%)。 然后我把训练分成训练2组和测试2组(66%,33%)。 我使用 dtc 来预测 test2,并且我只将预测的实例视为真实。 然后,我在所有这些数据上训练了一个dtc,目的是建立一个能够区分边界情况的分类器。 我使用在第一个过采样训练集上训练的 dtc 来预测官方测试集,并得到 Recall=0.92 和 Precision=0.44。 最后,我只在 dtc 预测为真实的数据上使用 dtc,希望将 TP 与 FP 区分开来,但它的效果不太好。我得到 Rec=0.79 和 Prec=0.69。

x_train, X_test, y_train, Y_test =train_test_split(df2.drop('k',axis=1), df2['k'], test_size=test_size, random_state=0.2)
x_res, y_res=ros.fit_resample(x_train,y_train)
df_to_trick=df2.iloc[x_train.index.tolist(),:]
#....split in 0.33-0.66, trained and tested
confusion_matrix(y_test,predicted1) #dtc1
array([[13282,   266],
[   18,   289]])
#training #dtc2 only on (266+289) datas
confusion_matrix(Y_test,predicted3) #dtc3 on official test set
array([[9950,  294],
[  20,  232]])
confusion_matrix(true,predicted4)#here i used dtc2 on (294+232) datas
array([[204,  90],
[ 34, 198]])

我必须在dtc3(Recall=0.92,Prec=0.44)或整个cervellotic过程(Recall=0.79,Prec=0.69)之间进行选择。 您有什么想法来改进这些指标吗?我的目标是(0.8/0.9)。

请记住,精度和召回率基于您选择的阈值(即在sklearn中,默认阈值为0.5 - 任何预测概率为0.5>类都被归类为正数),并且在偏爱精度而不是召回率之间总是会有一个权衡。

我认为在您描述的情况下(根据模型的性能限制尝试微调分类器),您可以选择更高或更低的阈值来截止,这具有更有利的精度召回权衡......

以下代码可以帮助您直观地了解精度和召回率在移动决策阈值时的变化情况:

def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):
plt.figure(figsize=(8, 8))
plt.title("Precision and Recall Scores as a function of the decision threshold")
plt.plot(thresholds, precisions[:-1], "b--", label="Precision")
plt.plot(thresholds, recalls[:-1], "g-", label="Recall")
plt.ylabel("Score")
plt.xlabel("Decision Threshold")
plt.legend(loc='best')

提高模型性能的其他建议是使用替代预处理方法 - SMOTE 而不是随机过采样,或者选择更复杂的分类器(随机 forrest/集合树或提升方法 ADA 提升或基于梯度的提升)

最新更新