如何调整 MLPRegressor?

Posted

技术标签:

【中文标题】如何调整 MLPRegressor?【英文标题】:How to tune a MLPRegressor? 【发布时间】:2017-05-09 14:03:04 【问题描述】:

我目前有一个包含变量和观察值的数据集。我想预测一个变量(需求),它是一个连续变量,因此我需要使用回归模型。我尝试使用Linear Regression,并使用R2 指标对其进行评估,该指标约为0.85。我想用其他模型评估它的性能,其中之一是NNs。我相信神经网络更适合分类等其他任务,但我想尝试一下。

我决定使用scikit-learn 主要是因为它提供了两种模型(线性回归和多层感知器),问题是R2 指标与线性回归的指标相比太过分和糟糕。因此,我得出结论,我错过了许多重要的配置。您可以在下面看到我的代码以及数据的来源。

我的数据有以下列,只有demand(这是我的标签)、populationgdpdayyear是数字连续的,其余的都是分类的。

['demand','holy','gdp','population', 'day','year', 'f0', 'f1', 'f2', 'f3', 'f4','f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f20', 'f21', 'f22', 'f23', 'g0', 'g1', 'g2', 'g3', 'g4', 'g5', 'g6', 'g7', 'g8', 'g9', 'g10', 'g11']

这是我实际做的,我删除了一些输出。

import pandas as pd
import numpy as np
import math as math

from sklearn.linear_model import LinearRegression
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import r2_score



training_data, validation_data = np.split(data.sample(frac=1), [int(.8*len(data))])

linear_model = LinearRegression().fit(training_data[[c for c in data.columns if c != "demand"]], training_data[["demand"]])

validation_data_predictions = linear_model.predict(validation_data[[c for c in training_data.columns if c != "demand"]])

validation_predictions_pd = pd.DataFrame(data=validation_data_predictions, 
                                         index=validation_data.index.values,
                                         columns=["prediction"])

# join both pandas
result_df = validation_data.join(validation_predictions_pd, how="inner")

r2_error = r2_score(y_true=result_df[["demand"]], y_pred=result_df[["prediction"]], multioutput="uniform_average")

print(r2_error) # outputs 0.85


# NN section
clf = MLPRegressor(hidden_layer_sizes=(10,), max_iter=100000)

neural_model = clf.fit(training_data[[c for c in training_data.columns if c != "demand"]], training_data[["demand"]])

validation_data_predictions = neural_model.predict(validation_data[[c for c in training_data.columns if c != "demand"]])

validation_predictions_pd = pd.DataFrame(data=validation_data_predictions, 
                                     index=validation_data.index.values,
                                     columns=["prediction"])

result_df = validation_data.join(validation_predictions_pd, how="inner")

r2_error = r2_score(y_true=result_df[["demand"]], y_pred=result_df[["prediction"]], multioutput="uniform_average")
print(r2_error) # outputs 0.23

因此,您可以看到 NN 的性能非常差。而且我认为它的性能可以提高,有什么提示吗?

【问题讨论】:

Alberto,您能否让您的示例可重现?定义data 变量,以便其他人可以为您提供切实的帮助。干杯! 【参考方案1】:

    MLP 对特征缩放很敏感。您是否对数据进行了标准化?

    修改您的网络结构:添加更多隐藏层并更改每层的感知器数量

    将激活函数更改为 sigmod/tanh/relu 等。

【讨论】:

4.改变学习率:learning_ratelearning_rate_init。 5. 切换early_stopping【参考方案2】:

也许不是 NN 的性能不好,也许您只是在比较它们时使用了错误的指标。通常,在评估具有许多回归变量的线性回归模型时,信任 R2 分数并不是一个好主意:事实上,您在模型中放入的回归变量越多,您的 R 平方就越高 (see this video for a quick explanation)。

反正我觉得这个问题更适合https://stats.stackexchange.com/

【讨论】:

以上是关于如何调整 MLPRegressor?的主要内容,如果未能解决你的问题,请参考以下文章

使用 MLPRegressor 拟合简单数据时遇到问题

Python:使用 MLPRegressor 拟合 3D 函数

sklearn MLPRegressor 的 TensorFlow 副本产生其他结果

MLPRegressor 给出非常负的分数

starUML如何调整用例大小

如何在以下代码中停止调整大小和裁剪?