首页 > 解决方案 > 从训练分数来看,如何使用 predict_proba 为多类目标变量计算预测结果

问题描述

我正在使用一个糖尿病数据集,它有 3 个类作为目标变量。我已经使用了决策树分类器,并使用RandomizedSearchCVsci-kit 学习包优化了超参数,并将模型拟合到训练数据中。现在,我找到了测试数据的概率值,它给出了将结果变量分配给 3 个类的概率。现在,我想计算截止值,以便我可以使用它来分配类。为此,我使用 F1 分数来找到合适的截止值。

现在,我不知道如何找到 F1 分数。F1 分数指标会帮助我找到它吗?

这是数据集

在对数据进行预处理后,我将数据吐到了训练和测试集中。

dtree = DecisionTreeClassifier()
params = {'class_weight':[None,'balanced'],
              'criterion':['entropy','gini'],
             'max_depth':[None,5,10,15,20,30,50,70],
             'min_samples_leaf':[1,2,5,10,15,20],
             'min_samples_split':[2,5,10,15,20]}
grid_search = RandomizedSearchCV(dtree,cv=10,n_jobs=-1,n_iter=10,scoring='roc_auc_ovr',verbose=20,param_distributions=params)
grid_search.fit(X_train,y_train)
mdl.fit(X_train,y_train)
test_score = mdl.predict_proba(X_test)

我为二元分类器的截止创建了以下公式 -

cutoffs = np.linspace(0.01,0.99,99)
true = y_train
train_score = mdl.predict_proba(X_train)[:,1]
F1_all = []
for cutoff in cutoffs:
    pred = (train_score>cutoff).astype(int)
    TP = ((pred==1)&(true==1)).sum()
    FP = ((pred==1)&(true==0)).sum()
    TN = ((pred==0)&(true==0)).sum()
    FN = ((pred==0)&(true==1)).sum()
    F1 = TP/(TP+0.5*(FP+FN))
    F1_all.append(F1)
my_cutoff = cutoffs[F1_all==max(F1_all)][0]
preds = (test_score1>my_cutoff).astype(int)

标签: pythonscikit-learnmulticlass-classification

解决方案


与二元分类器的截止值相同,多类分类器的 softmax 输出没有截止值。

当您的输出是多个类的归一化概率并且您想将其转换为类标签时,您只需获取分配概率最高的标签。

从技术上讲,您可以设计一些自定义架构,例如

  • 如果class1概率为 10% 或更多,则选择class1标签,否则选择分配概率最高的类别

这将是第 1 类的一个截止点,但这是相当随意的,我还没有看到有人在实践中这样做。如果您对您的问题有深入的了解,这表明这样的事情可能有用,那么请继续构建您自己的“截止”公式,否则您应该坚持使用一般方法(归一化概率的 argmax)。


推荐阅读