RandomForest 收敛是否意味着我也可以用 NN 解决问题?

数据挖掘 神经网络 随机森林 模型选择
2022-03-10 04:06:57

我正在尝试对数据集执行回归,并且我一直在测试一些模型,主要是为了练习。

正如您在散点图中看到的那样,我能够使用 RandomForestRegression 模型获得良好的结果:

射频散点图

所以,我尝试用 NN 解决同样的问题(同样,我这样做主要是为了练习),但结果肯定很糟糕。正如您在下图的上半部分所看到的,训练集和测试集上的损失(分别为红线和绿线)似乎有些收敛,但它们的值仍然高于使用 RF 获得的值(水平蓝线)。此外,散点图也很糟糕,因为模型基本上总是在预测数据的平均值。

NN 的结果

该模型是一个简单的 MLP,具有一个隐藏层。我正在对隐藏的神经元使用 tanh 激活函数。由于损失似乎已经收敛,我不知道使用较小的学习率或训练模型进行更多时期是否会改善结果。

但是,我的问题更笼统,与这个特定结果无关。我普遍认为 NN 比 RandomForest 更灵活,所以我想知道我使用 RandomForest 获得了良好结果这一事实是否自动意味着应该存在一些 NN 配置至少可以提供同样好的结果作为用RF获得的。
这是真的吗,我只需要修复 NN 模型,直到找到正确的配置?或者这个问题是否可以通过 RF 正确建模,但不能通过 NN?

1个回答

对我来说,这些是不同的事情,因为两种模型都有不同的成本函数需要优化。

另一方面,您可以通过构建基于随机森林分割的嵌入,然后使用这些嵌入作为神经网络的输入来组合这些模型。

玩具示例表明,有一个神经网络的非平凡配置可以获得与随机森林获得的结果一样好的结果:

from sklearn.datasets import load_iris
from sklearn.neural_network import MLPClassifier
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import RandomTreesEmbedding


X, y = load_iris(return_X_y = True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 42, test_size = .2)


params = dict(n_estimators=100,
    max_depth=None,
    min_samples_split=2,
    min_samples_leaf=1,
    min_weight_fraction_leaf=0.0,
    max_leaf_nodes=None,
    min_impurity_decrease=0.0,
    min_impurity_split=None,
    random_state=42,
    verbose=0)

mlp = Pipeline([("embeddings", RandomTreesEmbedding(**params)),
                ("model", MLPClassifier(activation = "identity",hidden_layer_sizes=(1000,), max_iter = 10000, random_state = 42))]).fit(X_train, y_train)

rf = Pipeline([("model", RandomForestClassifier(**params))]).fit(X_train, y_train)

mlp.score(X_test, y_test)
rf.score(X_test, y_test)

在此处输入图像描述 在此处输入图像描述