python - MLP Regressor 比 Kernel Ridge Regression 最差
问题描述
我正在研究回归问题。我有一个数据集,我在该数据集上完成了特征工程(估算缺失值、box cox 转换了偏斜变量等)。
我使用带有 5 个数据集拆分的 cross_val_score 训练和测试几个模型。首先,我尝试过 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 且与 KRR 相同的参数以尽可能接近 KRR 的 MLPRegressor,我的得分也是 0.4381。
你知道为什么会有这样的差异吗?
谢谢,
编辑:数据形状:(1460、81)
解决方案
如果通过应用一种预期显示更高估计方差的方法(例如神经网络),您得到的结果不如具有较高偏差的方法(例如核岭回归),您可能会怀疑以下两个原因之一:
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)
然后尝试通过扩展第一层或添加第二层来构建更复杂的架构。
推荐阅读
- python - 使用连续模式正则表达式时的多个结果
- javascript - 如何重定向/转发到具有可变内容的新 html 页面?
- calculated-columns - 计算列 if 语句“除法”
- linkedin - Linkedin - 共享实体无权执行此操作
- java - cucumber.runtime.CucumberException:java.lang.NoSuchMethodException
- java - 无法将对象从 Firebase 数据转换为 POJO
- c# - 如何生成五组随机数
- php - 年份日期 PHP 中 4 个期间之间的折扣文本
- java - Elasticsearch:将新元素附加到嵌套的对象数组
- racket - 我应该怎么做才能听这个列表?