我在sklearn中有一个带有以下参数的RandomForestClassifier:
clf = RandomForestClassifier(n_estimators=1,
min_impurity_decrease=0,
max_features=3,
bootstrap=False,
random_state=j,
criterion='entropy',
warm_start=False)
功能和标签:
- 我的特征矩阵 X (pd.数据帧)具有形状(100,110),即110个特征。
- 标签是长度为 10 的向量,即我试图预测 10 个目标。
特征矩阵包含一个 i=1,...,10 的特征x_i,我从中构建标签:
y_i = np.sign(X['x_i'].diff(1).shift(-1))
标签位于 {-1,1} 中(标签值可能为 0),它们是 i=1,...,10 时特征x_i的提前一步更改。然后,每个时间 t 的标签向量作为时间 t 处所有标签的集合给出:
y[t] = {y_i[t] | i=1,...,10}
在训练分类器时,我注意到min_impurity_decrease=0
的训练准确率为 100%,测试准确率在 50-60% 之间。即使在n_estimators=1
的极端情况下也会发生这种情况,而只是一棵树。
当我增加min_impurity_decrease>0
时,训练精度会降低,而测试精度大致保持不变。
在我看来,在训练过程中发生了某种泄漏,因此分类器实现了如此高的训练精度和过拟合。
奇怪的是,即使我从特征矩阵中完全删除x_i的特征,并仅使用它们来构建标签,高训练精度仍然存在。最后,即使我只预测单个目标x_i的标签,即y_i,训练准确率仍然是 100%。我也检查了几次我的数据集,应该没问题。我无法解释。
为什么即使使用一棵树也能实现如此高的精度?这对我来说似乎非常不合逻辑。
将 max_depth 参数设置为默认值 None 以外的其他参数。它会扩展树,直到您获得 100% 的准确性,这就是原因。它显然过于合适。使用 max_depth=2、4、8 等。