我正在构建一个二元分类模型来预测 R 中出现呼吸问题的患者入院。我的数据集中的每一行都是一个患者记录。因变量是承认与否(1或0),特征包括年龄、性别、天气信息和空气质量信息。所有变量都是数字类型。该数据集包含 70,000 条记录,录取率约为 3%。
我在网上搜索了处理罕见事件问题的可能技术。就像使用 xgboost,或者重新采样数据集并与 ML 算法相结合。
我正在使用三种算法来比较结果。1.xgboost。我的代码是:
pos_weight <- sum(training_df$resp_admit==0)/sum(training_df$resp_admit==1)
xgb_mod <- xgboost(data = dtrain,
eta = 0.01,
max_depth = 9, nround=3000, nthread = 2,
subsample = 0.9, colsample_bytree = 0.9,
eval_metric = "error", eval_metric = "auc",
objective = "binary:logistic",
max_delta_step = 6,
scale_pos_weight = pos_weight,
verbose = 1)
2.逻辑回归和决策树与重采样方法(ovun.sample带method = both)
但是,使用参数调整和重采样方法,分类器性能对我来说仍然很糟糕。
metric logistic regression xgboost
Sensitivity 0.0240480962 0.34482759
Specificity 0.9703949693 0.61143868
Pos Pred Value 0.0278422274 0.02945508
Neg Pred Value 0.9657548696 0.96465116
Precision 0.0278422274 0.02945508
Recall 0.0240480962 0.34482759
F1 0.0258064516 0.05427408
Balanced Accuracy 0.4972215327 0.47813313
AUC 0.4901495211 0.45190509
我是罕见事件问题的新手。我的问题是:
- 我知道不同问题的性能标准是不同的。但有一个整体标准吗?至少召回率或精度应该高于0.5?
- 我可以尝试哪些其他技术来提高性能?
- 我在构建模型时是否遗漏了任何需要注意的事项?
- 我随机挑选了一些我认为对构建简单模型很重要的基本特征。我还应该做特征工程吗?这一步对模型性能有很大影响吗?
以下是我构建数据集的方式。
- 从所有患者入院记录中,挑选出因呼吸系统问题入院的患者。这些记录与录取日期相关联。一名患者可能在不同入院日期有多个记录。(多次入院的患者占所有患者的 15%。)这些记录的因变量标记为 1。
- 按年月对上述记录进行分组。对于一个月中的每一天,如果患者当天没有入院,则复制患者信息,并标记为0。对当月的所有患者执行此操作,并针对每个不同的年月重复该过程。我没有在整个时间段内生成 0 条记录的原因是,如果我这样做了,那么罕见事件发生率将在 0.1% 左右。
- 结合所有 1 和 0 记录,按日期左加入天气和空气质量信息。
我还担心我构建数据集的方式。欢迎对此进行讨论。
该模型的最终目标是根据患者信息以及当前天气和空气质量信息,对患者名单进行呼吸入院风险预测。