Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在不平衡的数据集中,如何在不降低查全率的情况下提高查准率?_Python_Classification_Decision Tree_Precision Recall_Imblearn - Fatal编程技术网

Python 在不平衡的数据集中,如何在不降低查全率的情况下提高查准率?

Python 在不平衡的数据集中,如何在不降低查全率的情况下提高查准率?,python,classification,decision-tree,precision-recall,imblearn,Python,Classification,Decision Tree,Precision Recall,Imblearn,我必须使用决策树对不平衡数据集(50000:0,1000:1)进行二元分类。为了有一个好的回忆(0.92),我使用了模块IMBREAND中的随机过采样函数,并使用最大深度参数进行修剪。 问题是精度很低(0.44),我有太多的误报 我试图训练一个特定的分类器来处理产生误报的边界实例。 首先,我将数据集分为训练集和测试集(80%-20%)。 然后我将列车分为第2列和第2列(66%,33%)。 我使用了一个dtc(#1)来预测test2,并且只将预测的实例作为true。 然后我在所有这些数据上训练了一

我必须使用决策树对不平衡数据集(50000:0,1000:1)进行二元分类。为了有一个好的回忆(0.92),我使用了模块IMBREAND中的随机过采样函数,并使用最大深度参数进行修剪。 问题是精度很低(0.44),我有太多的误报

我试图训练一个特定的分类器来处理产生误报的边界实例。 首先,我将数据集分为训练集和测试集(80%-20%)。 然后我将列车分为第2列和第2列(66%,33%)。 我使用了一个dtc(#1)来预测test2,并且只将预测的实例作为true。 然后我在所有这些数据上训练了一个dtc(#2),目的是构建一个能够区分临界情况的分类器。 我使用在第一个过采样列车集上训练的dtc(#3)预测正式测试集,召回率=0.92,精度=0.44。 最后,我仅在dtc(#3)预测为真的数据上使用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)或整个Cervelotic过程(召回率=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 Boost或基于梯度的增强)

请记住,精度和召回率基于您选择的阈值(即,在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 Boost或基于梯度的增强)

使用GridSearchCV之类的东西和roc\u auc\u分数参数怎么样?那么使用像GridSearchCV这样带有roc_auc_分数参数的东西呢?和