python - 从训练分数来看,如何使用 predict_proba 为多类目标变量计算预测结果
问题描述
我正在使用一个糖尿病数据集,它有 3 个类作为目标变量。我已经使用了决策树分类器,并使用RandomizedSearchCV
sci-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)
解决方案
与二元分类器的截止值相同,多类分类器的 softmax 输出没有截止值。
当您的输出是多个类的归一化概率并且您想将其转换为类标签时,您只需获取分配概率最高的标签。
从技术上讲,您可以设计一些自定义架构,例如
- 如果
class1
概率为 10% 或更多,则选择class1
标签,否则选择分配概率最高的类别
这将是第 1 类的一个截止点,但这是相当随意的,我还没有看到有人在实践中这样做。如果您对您的问题有深入的了解,这表明这样的事情可能有用,那么请继续构建您自己的“截止”公式,否则您应该坚持使用一般方法(归一化概率的 argmax)。
推荐阅读
- android - Android导航架构组件-系统的后退按钮退出应用
- performance - Java 中 SimpleDateFormat 的错误处理
- javascript - 不使用本地时区偏移量的 iso 8601 字符串到可用的 d3 日期
- django - 一个列表和一个表单放到同一个django模板中
- python - xgboost 文档有误吗?(早期停止轮次以及最佳和最后一次迭代)
- mysql - XAMPP 访问被拒绝
- unity3d - AR 核心以统一方式动态加载预制件
- php - 在 Laravel 5.7 中加密并在 Codeigniter 3.1 中解密
- java - 当前值/单元格 POI 的 Excel 公式
- graalvm - nashorn CompiledScript graalvm 等效