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

时间:2016-12-21 19:41:22

标签: python python-3.x scikit-learn neural-network

我是神经网络新手所以请原谅任何愚蠢的问题。 我正在使用天气数据集。在这里,我使用Dewpoint,Humidity,WindDirection,WindSpeed来预测温度。我已经阅读了几篇关于此的论文,所以我觉得自己很感兴趣。我首先用4000次观察训练模型,然后尝试预测接下来的50个温度点。

这是我的整个代码。

func mailOpen(alertAction: UIAlertAction) {
    if MFMailComposeViewController.canSendMail() {
        let mailcontroller = MFMailComposeViewController()
        mailcontroller.mailComposeDelegate = self;
        mailcontroller.setSubject("Subject")
        let completeImage = newImage! as UIImage
        mailcontroller.addAttachmentData(UIImageJPEGRepresentation(completeImage, CGFloat(1.0))!, mimeType: "image/jpeg", fileName: "Image")
        mailcontroller.setMessageBody("<html><body><p>Message</p></body></html>", isHTML: true)

        self.present(mailcontroller, animated: true, completion: nil)
    } else {
        let sendMailErrorAlert = UIAlertView(title: "Could Not Send Email", message: "Your device could not send the e-mail. Please check e-mail configuration and try again.", delegate: self, cancelButtonTitle: "Got it!")
        sendMailErrorAlert.show()
    }

    func mailComposeController(_ controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
        self.dismiss(animated: true, completion: nil)
    }
}//end of mail

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

运行1:

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))

运行2(重大改进):

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

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

请帮忙!

1 个答案:

答案 0 :(得分:2)

  

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

神经网络容易出现局部最优。从来没有保证你会学到任何体面的东西,也不会(因此)多次运行会导致相同的解决方案。学习过程严重随机,取决于初始化,抽样顺序等因此这种行为预期

  

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

sklearn中的神经网络非常基础,并且它们不提供这种灵活性。如果你需要处理更复杂的设置,你只需要更多面向NN的库,比如Keras,TF等.scikit-learn社区很难做出很多努力来实现这个NN的实现&#34;在&#34;中它看起来并不像就像他们将在不久的将来增加更多的灵活性。

作为一件小事 - 使用&#34; minmaxscaler&#34;看起来有些奇怪。你不应该&#34; fit_transform&#34;每次,你应该只适合一次,然后使用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))