我是神经网络新手所以请原谅任何愚蠢的问题。 我正在使用天气数据集。在这里,我使用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错误。我在这里缺少什么?
请帮忙!
答案 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))