不平衡数据集问题的随机森林堆叠实验

数据挖掘 scikit-学习 随机森林 助推 装袋
2022-03-02 00:57:34

为了解决不平衡的数据集问题,我以给定的方式对随机森林进行了实验(受深度学习的启发)

训练了一个随机森林,它将接收输入数据,训练模型的标签的预测概率将用作训练另一个随机森林的输入。

伪代码:

train_X, test_X, train_y, test_y = train_test_split(X,y, test_size = 0.2)
rf_model = RandomForestClassifier()
rf_model.fit(train_X, train_y)
pred = rf_model.predict(test_X)
print('******************RANDOM FOREST CM*******************************')
print(confusion_matrix(test_y, pred))
print('******************************************************************')
predict_prob = rf_model.predict_proba(X)


X['first_level_0'] = predict_prob[:, :1].reshape(1,-1)[0]
X['first_level_1'] = predict_prob[:, 1:].reshape(1,-1)[0]

train_X, test_X, train_y, test_y = train_test_split(X,y, test_size = 0.2)
rf_model = RandomForestClassifier()
rf_model.fit(train_X, train_y)
pred = rf_model.predict(test_X)

print('******************RANDOM FOREST 2 CM*******************************')
print(confusion_matrix(test_y, pred))
print('******************************************************************')

我能够看到召回的显着改善。这种方法在数学上是否合理。我使用了随机森林的第二层,这样它就能够纠正第一层的错误。只是想将提升的原理与随机森林套袋技术结合起来。寻找想法。

1个回答

基本思想很好,但是您陷入了常见的数据泄漏陷阱。通过重新组合数据然后重新拆分,您的第二个模型的测试集包括第一个模型的一些训练集。第一个模型知道这些数据点上的标签,尤其是在过度拟合的情况下,它会在其预测中传递该信息。所以你看到的合奏分数可能是乐观的。

解决此问题的最常见方法是使用 k 折交叉验证来对第二个模型的整个训练数据集产生非折叠预测。

请注意,sklearn 现在内置了这样的堆叠集成:
https ://scikit-learn.org/stable/modules/generated/sklearn.ensemble.StackingClassifier.html