【问题标题】:MLP Regressor worst than Kernel Ridge RegressionMLP Regressor 比 Kernel Ridge Regression 最差
【发布时间】:2018-10-26 09:14:38
【问题描述】:

我正在研究回归问题。我有一个数据集,我在该数据集上完成了特征工程(输入缺失值、box cox 转换了偏斜变量等)。

我使用 cross_val_score 训练和测试了几个模型,其中包含 5 个数据集拆分。首先,我尝试过 Kernel Ridge Regression、Lasso、Elastic Net、Gradient Boosting 等模型。然后我尝试了 scikit learn 的 MLPRegressor。 然而,使用均方根误差,“简单”模型的结果比 MLP Regressor 的结果要好得多(例如,Kernel Ridge 的平均分数是 0.1153,而 MLPRegressor (hidden_​​layer_sizes=(256,)*25) 是 0.1461,它是最好的,我发现运行不同的架构)。

示例代码:

KRR = KernelRidge(alpha=0.6, kernel='polynomial', degree=2, coef0=2.5)

mlpreg = MLPRegressor(hidden_layer_sizes=(256,)*25,activation='relu',solver='adam',
                      verbose=0)

还有我用来评分的函数:

def rmsle_crossval(model, train: pd.DataFrame, y_train: List[float]):
    kf = KFold(n_folds, shuffle=True, 
               random_state=42).get_n_splits(train.values)
    rmse= np.sqrt(-cross_val_score(model, train.values, y_train, 
                  scoring="neg_mean_squared_error", cv = kf))
    return(rmse)

即使我尝试使用单个隐藏层为 1 的 MLPRegressor 以及与 KRR 相同的参数以尽可能接近 KRR,我的得分也是 0.4381。

你知道为什么会有这样的差异吗?

谢谢,

编辑: 数据形状:(1460, 81)

【问题讨论】:

  • 在不知道数据集大小的情况下,很难评论正在发生的事情。你能分享一下数据集的大小吗?
  • 数据的形状是(1460, 81)

标签: python scikit-learn neural-network


【解决方案1】:

如果通过应用一种预期会显示较高估计方差的方法(例如神经网络),您得到的结果不如具有较高偏差的方法(例如核岭回归),您可能会怀疑其中之一两个原因:

1) 你的问题不适合神经网络,它更适合其他模型,如没有免费午餐定理 (http://no-free-lunch.org/) 所述

2) 您在训练高方差估计器时过度拟合

鉴于您使用的神经网络和数据的小规模(1460、81),在您的情况下,我认为这是第二个原因。

事实上,如果你检查你的神经网络模型:

>>> mlpreg
MLPRegressor(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9,
       beta_2=0.999, early_stopping=False, epsilon=1e-08,
       hidden_layer_sizes=(256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256
, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256),
       learning_rate='constant', learning_rate_init=0.001, max_iter=200,
       momentum=0.9, nesterovs_momentum=True, power_t=0.5,
       random_state=None, shuffle=True, solver='adam', tol=0.0001,
       validation_fraction=0.1, verbose=0, warm_start=False)

您似乎使用了 25 层,每层 256 个节点,这导致要估计的参数数量如此之多,以至于数十万个示例都不够,而不仅仅是您可用的少数示例。

我建议你先尝试一个较小的网络,例如:

mlpreg = MLPRegressor(hidden_layer_sizes=(8,), activation='relu', solver='adam',
                      verbose=0)

然后尝试通过扩展第一层或添加第二层来构建更复杂的架构。

【讨论】:

  • 感谢卢卡的回答。我尝试了许多较小的网络,但我仍然在 RMSE 上获得了高分。 (只有两层,我设法用 (99,31) 的层得到 0.1761)另一件真正让我吃惊的是,当我尝试使用单个隐藏层 1 和与 KRR 相同的参数的 MLPRegressor 时( activation='identity') 尽可能接近 KRR,我得到了 0.4381 的分数。但是,MLP Regressor 会类似于 Kernel Ridge Regressor,不是吗?
  • 嗯,不完全是,核岭回归更类似于 SVR,而不是神经网络。作为我唯一的进一步建议,我建议放弃 MLPRegressor,毕竟它只是一个玩具函数,并使用 Keras 构建一个神经网络回归器(网上有一些教程,只是复制其中一个)。
猜你喜欢
  • 2016-06-13
  • 2019-09-13
  • 1970-01-01
  • 2018-05-19
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多