Python MLPREGESSOR未给出准确的结果

Python MLPREGESSOR未给出准确的结果,python,machine-learning,scikit-learn,neural-network,Python,Machine Learning,Scikit Learn,Neural Network,我得到了几年的臭氧、NO、NO2和CO的数据来研究。任务是利用这些数据预测臭氧的价值。假设我有201520162018和2019年的数据。我需要使用随身携带的201520162018数据预测2019年的臭氧值 数据格式每小时记录一次,以月份的形式呈现。因此,在这种格式中,数据是存在的 我所做的:首先,在一个excel文件中保存所有年份的数据,该文件包含4列NO、NO2、CO、O3。并逐月添加所有数据。这就是已经使用过的主文件 我用过python。首先,必须清除数据。让我解释一下。No、No2和C

我得到了几年的臭氧、NO、NO2和CO的数据来研究。任务是利用这些数据预测臭氧的价值。假设我有201520162018和2019年的数据。我需要使用随身携带的201520162018数据预测2019年的臭氧值

数据格式每小时记录一次,以月份的形式呈现。因此,在这种格式中,数据是存在的

我所做的:首先,在一个excel文件中保存所有年份的数据,该文件包含4列NO、NO2、CO、O3。并逐月添加所有数据。这就是已经使用过的主文件

我用过python。首先,必须清除数据。让我解释一下。No、No2和CO是臭氧的前身,这意味着臭氧气体的产生取决于这些气体,必须事先清理数据,限制条件是删除任何负值,并删除整行(包括其他列),因此如果臭氧的任何值,NO2和CO是无效的,我们必须删除整行,而不是计数。数据中包含一些字符串格式,也必须删除。一切都完成了。然后我从sk应用MLP回归器,在这里学习我所做的代码

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import explained_variance_score
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import mean_absolute_error
import pandas as pd

import matplotlib.pyplot as plt

bugs = ['NOx', '* 43.3', '* 312', '11/19', '11/28', '06:00', '09/30', '09/04', '14:00', '06/25', '07:00', '06/02',
        '17:00', '04/10', '04/17', '18:00', '02/26', '02/03', '01:00', '11/23', '15:00', '11/12', '24:00', '09/02',
        '16:00', '09/28', '* 16.8', '* 121', '12:00', '06/24', '13:00', '06/26', 'Span', 'NoData', 'ppb', 'Zero',
        'Samp<', 'RS232']
dataset = pd.read_excel("Testing.xlsx")

dataset = pd.DataFrame(dataset).replace(bugs, 0)
dataset.dropna(subset=["O3"], inplace=True)
dataset.dropna(subset=["NO"], inplace=True)
dataset.dropna(subset=["NO2"], inplace=True)
dataset.dropna(subset=["CO"], inplace=True)

dataset.drop(dataset[dataset['O3'] < 1].index, inplace=True)
dataset.drop(dataset[dataset['O3'] > 160].index, inplace=True)
dataset.drop(dataset[dataset['O3'] == 0].index, inplace=True)

dataset.drop(dataset[dataset['NO'] < 1].index, inplace=True)
dataset.drop(dataset[dataset['NO'] > 160].index, inplace=True)
dataset.drop(dataset[dataset['NO'] == 0].index, inplace=True)

dataset.drop(dataset[dataset['NO2'] < 1].index, inplace=True)
dataset.drop(dataset[dataset['NO2'] > 160].index, inplace=True)
dataset.drop(dataset[dataset['NO2'] == 0].index, inplace=True)

dataset.drop(dataset[dataset['CO'] < 1].index, inplace=True)
dataset.drop(dataset[dataset['CO'] > 4000].index, inplace=True)
dataset.drop(dataset[dataset['CO'] == 0].index, inplace=True)
dataset = dataset.reset_index()
dataset = dataset.drop(['index'], axis=1)

X = dataset[["NO", "NO2", "CO"]].astype(int)
Y = dataset[["O3"]].astype(int)

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.05, random_state=27)
sc_x = StandardScaler()
X_train = sc_x.fit_transform(X_train)
X_test = sc_x.fit_transform(X_test)
clf = MLPRegressor(hidden_layer_sizes=(100,100,100), max_iter=10000,verbose=True,random_state=8)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(explained_variance_score(y_test, y_pred))
print(mean_absolute_error(y_test, y_pred))
y_test = pd.DataFrame(y_test)
y_test = y_test.reset_index(0)
y_test = y_test.drop(['index'], axis=1)
# y_test = y_test.drop([19,20],axis=0)
y_pred = pd.DataFrame(y_pred)
y_pred = y_pred.shift(-1)
# y_pred = y_pred.drop([19,20],axis=0)
plt.figure(figsize=(10, 5))
plt.plot(y_pred, color='r', label='PredictedO3')
plt.plot(y_test, color='g', label='OriginalO3')
plt.legend()
plt.show()
这是最后的情节 如果我做错了什么,纠正我。
关于

这些问题实际上很难准确回答,因为答案主要取决于我们没有的数据集

然而,由于您的目标变量似乎有一个相当高的动态范围,您应该尝试使用一个单独的定标器来缩放它;在计算误差或绘图之前,应注意将预测反变换回其原始比例:

sc_y = StandardScaler()
y_train = sc_y.fit_transform(y_train.reshape(-1, 1))
y_test = sc_y.transform(y_test.reshape(-1, 1))

# model definition and fitting...

y_pred_scaled = clf.predict(X_test) # get scaled predictions
y_pred = sc_y.inverse_transform(y_pred_scaled) # transform back to original scale
从这一点开始,您应该能够像在代码中那样继续使用y_pred

此外,与您的问题无关,但您的应用程序正在以错误的方式扩展您的功能。我们从不在测试数据上使用fit_变换;正确的方法是:

sc_x = StandardScaler()
X_train = sc_x.fit_transform(X_train)
X_test = sc_x.transform(X_test) # transform here
如前所述,这只是一个提示;这里的关键词是用不同的层数、每层不同的单元数、不同的定标器等进行实验

sc_x = StandardScaler()
X_train = sc_x.fit_transform(X_train)
X_test = sc_x.transform(X_test) # transform here