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

时间:2019-03-27 16:11:24

标签: python classification decision-tree precision-recall imblearn

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

我试图训练一个特定的分类器来处理产生误报的边界实例。 首先,我将数据集分为训练集和测试集(80%-20%)。 然后,我将火车分为2组和2组(66%,33%)。 我使用dtc(#1)来预测test2,而我只采用了预测为true的实例。 然后,我对所有这些数据进行了dtc(#2)训练,目的是建立能够区分边界情况的分类器。 我使用在第一个过采样火车集上训练的dtc(#3)来预测官方测试集,并得出Recall = 0.92和Precision = 0.44。 最后,我仅在dtc(#3)预测为true的数据上使用了dtc(#2),希望将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(召回率= 0.92,Prec = 0.44)或整个子宫颈过程中选择(召回率= 0.79,Prec = 0.69)。 您有任何改善这些指标的想法吗?我的目标是大约(0.8 / 0.9)。

1 个答案:

答案 0 :(得分:0)

请记住,准确性和召回率取决于您选择的阈值(即,在sklearn中,默认阈值为0.5-预测概率大于0.5的任何类别都归为肯定),并且始终存在交易-在偏爱精度而不是召回率之间偏离。 ...

我认为,在您描述的情况下(鉴于模型的性能限制,试图对分类器进行微调),您可以选择更高或更低的阈值进行截止,从而具有更有利的精度调用权衡... < / p>

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

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 Boost或基于梯度的Boosting方法)