我在回归分类问题上运行 xgboost,其中模型预测基因从 0 到 1 引起疾病的可能性的分数。
我试图以我能想到的所有方式避免过度拟合,嵌套交叉验证的平均输出为 r2 0.88,我不确定我是否可以相信这一点,或者是否有其他方法可以查看这是否过度拟合。仅训练和测试非嵌套的输出 r2 是:训练 r2:0.971 测试 r2:0.868。
到目前为止我:
- 删除相关性 >0.9 的特征,并删除任何 >50% 缺失数据的特征(这很难加强,很多遗传特征只是缺少生物学中大量研究基因的缺失数据)
- 没有插补以避免插补偏差,并且由于 xgboost 接受缺失数据。
- 在 scikit-learn 中缩放特征
MinMaxScaler()
- 推荐作为一个很好的起点,大多数特征没有正态分布 - 比较 2 种特征选择方法(一种使用 xgboost 从 SHAP 值中认为重要的特征,另一种使用 Boruta,在 10 个嵌套 CV k 折叠中均给出 0.87-0.88 r2,并且仅删除 57 个特征中的 3-4 个)
- 使用 10 kfolds 的嵌套 kfold 交叉验证
我知道我还没有真正探索过的唯一其他领域是投影技术。我不确定哪种方法最适合这个(我的特征都是数字但混合的连续或离散数据类型),例如在 UMAP、PCA 或偏最小二乘法之间。
还有其他方法可以调查过度拟合吗?我有生物学背景,所以这方面的任何资源都会很有用,任何帮助都会受到赞赏。
我还在训练之前更多地手动删除了一些少数示例基因(例如,删除了得分为 0.9 的训练基因,仅占训练数据集的 1/8 左右),以使训练后的模型能够预测和查看模型如何推广到这个新的'难以预测的基因 - 当它们实际上是 0.9 时,给它们一个 0.6-0.7 的分数:
y_pred =[0.69412696, 0.709764, 0.6366122]
y_true = [0.9, 0.9, 0.9]
r2_score(y_true, y_pred) #outputs 0.0
每折叠 10 倍嵌套 cv r2 结果:
'test_r2': array([0.8484691 , 0.86808136, 0.91821645, 0.93616375, 0.94435934,
0.82065733, 0.84856025, 0.8267642 , 0.84561417, 0.89567455]
编辑:
我尝试过的其他一些事情:
我想我在这里误用了分类(并相应地删除了标签),我使用回归模型,我没有标签,只有连续分数,所以我没有得到真阳性、假阳性等来进行 ROC。对于我可以使用的回归,我不确定还有哪些指标比 R2 更好或更好。
我尝试应用插补来比较其他模型(随机森林、SVM 和逻辑回归与弹性网络或套索),所有模型的性能都明显低于梯度提升(随机森林中平均嵌套 r2 为 0.59 是最高的)——但我最初担心对于来自插补的有偏见的数据,是否值得进行插补来抵消过度拟合?
我在 scikit-learn 中对所有具有嵌套交叉验证的模型使用 GridSearch,我最初应该包含这些信息,因为我一直在尝试这样做。
我有生物学背景,所以不确定机器学习的最佳实践,但我怀疑随机森林更好,我应该尝试做比目前更好的参数调整,并相信该模型的结果在嵌套 CV 上。这是最好的方法吗?
也不确定我如何调整我的随机森林是否合理,目前我使用:
rfr = RandomForestRegressor(random_state=seed)
rfr_params={'n_estimators':[100, 500, 1000],
'min_samples_split': [50, 100],
'min_samples_leaf': [50, 100],}