如何使用均方根误差来优化Scikit-Learn中的神经网络



我是神经网络的新手,所以请原谅任何愚蠢的问题。我正在使用天气数据集。在这里,我使用露点,湿度,风速,风速来预测温度。我已经阅读了几篇论文,所以我很感兴趣自己进行研究。首先,我正在用4000个观察训练该模型,然后尝试预测下一个50个温度点。

这里是我的整个代码。

from sklearn.neural_network import MLPRegressor
from sklearn.metrics import mean_squared_error
from sklearn import preprocessing
import numpy as np
import pandas as pd
df = pd.read_csv('WeatherData.csv', sep=',', index_col=0)
X = np.array(df[['DewPoint', 'Humidity', 'WindDirection', 'WindSpeed']])
y = np.array(df[['Temperature']])
# nan_array = pd.isnull(df).any(1).nonzero()[0]
neural_net = MLPRegressor(
    activation='logistic',
    learning_rate_init=0.001,
    solver='sgd',
    learning_rate='invscaling',
    hidden_layer_sizes=(200,),
    verbose=True,
    max_iter=2000,
    tol=1e-6
)
# Scaling the data
max_min_scaler = preprocessing.MinMaxScaler()
X_scaled = max_min_scaler.fit_transform(X)
y_scaled = max_min_scaler.fit_transform(y)

neural_net.fit(X_scaled[0:4001], y_scaled[0:4001].ravel())
predicted = neural_net.predict(X_scaled[5001:5051])
# Scale back to actual scale
max_min_scaler = preprocessing.MinMaxScaler(feature_range=(y[5001:5051].min(), y[5001:5051].max()))
predicted_scaled = max_min_scaler.fit_transform(predicted.reshape(-1, 1))
print("Root Mean Square Error ", mean_squared_error(y[5001:5051], predicted_scaled))

第一个对我来说,混淆是,同一程序在不同运行时给出了不同的RMS错误。为什么?我没有得到它。

运行1:

Iteration 1, loss = 0.01046558
Iteration 2, loss = 0.00888995
Iteration 3, loss = 0.01226633
Iteration 4, loss = 0.01148097
Iteration 5, loss = 0.01047128
Training loss did not improve more than tol=0.000001 for two consecutive epochs. Stopping.
Root Mean Square Error  22.8201171703

运行2(重大改进):

Iteration 1, loss = 0.03108813
Iteration 2, loss = 0.00776097
Iteration 3, loss = 0.01084675
Iteration 4, loss = 0.01023382
Iteration 5, loss = 0.00937209
Training loss did not improve more than tol=0.000001 for two consecutive epochs. Stopping.
Root Mean Square Error  2.29407183124

在MLPRegressor的文档中,我找不到直接达到RMS错误并保持网络运行的方法,直到我达到所需的RMS错误。我在这里缺少什么?

请帮助!

首先让我感到困惑的是,同一程序在不同运行时给出了不同的RMS错误。为什么?我没有得到它。

神经网络容易本地Optima 。永远没有保证您会学到任何体面的东西,也不会(因此)多次运行会导致相同的解决方案。学习过程是 heavily 随机,取决于初始化,采样顺序等。因此,这种行为是预期

在MLPRegressor的文档中,我找不到直接达到RMS错误并保持网络运行的方法,直到我达到所需的RMS错误。

Sklearn中的神经网络非常基本,它们没有提供这种灵活性。如果您需要使用更复杂的设置,您只需要更加面向NN的图书馆,例如Keras,TF等。Scikit-Learn社区在" IN"中努力使此NN实现很大,而且似乎并不是他们似乎不会去在不久的将来增加灵活性。

作为次要的事情 - 使用" minmaxscaler"似乎有些奇怪。您不应该每次" fit_transform",只能适合一次,然后使用 - 使用转换(或inverse_transform)。特别是,应该是

y_max_min_scaler = preprocessing.MinMaxScaler()
y_scaled = y_max_min_scaler.fit_transform(y)
...
predicted_scaled = y_max_min_scaler.inverse_transform(predicted.reshape(-1, 1))

最新更新