MLPrepressor正在工作,但结果没有任何意义

2024-09-30 22:22:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用两种方法用我的研究数据构建一个神经网络:用统计程序(SPSS)和python。 我正在使用scikit学习MLPREGESSOR。我的问题是,虽然我的代码显然写得很好(因为它可以运行),但结果却毫无意义。R2分数应该在0.70左右(它是-4147.64),图中表示的相关性应该几乎是线性的。(它只是一条与X轴保持恒定距离的直线)。此外,x轴和y轴的值应在0到180之间,情况并非如此(x轴从20到100,y轴从-4100到-3500)

如果你们中有人能帮忙,我将非常感激。 谢谢你

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

from sklearn import neighbors, datasets, preprocessing 
from sklearn.model_selection import train_test_split
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import r2_score

vhdata = pd.read_csv('vhrawdata.csv')
vhdata.head()

X = vhdata[['PA NH4', 'PH NH4', 'PA K', 'PH K', 'PA NH4 + PA K', 'PH NH4 + PH K', 'PA IS', 'PH IS']]
y = vhdata['PMI']

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

from sklearn.preprocessing import Normalizer
scaler = Normalizer().fit(X_train)
X_train_norm = scaler.transform(X_train)
X_test_norm = scaler.transform(X_test)

nnref = MLPRegressor(hidden_layer_sizes = [4], activation = 'logistic', solver = 'sgd', alpha = 1, 
                     learning_rate= 'constant', learning_rate_init= 0.6, max_iter=40000, momentum= 
                     0.3).fit(X_train, y_train)

y_predictions= nnref.predict(X_test)

print('Accuracy of NN classifier on training set (R2 score): {:.2f}'.format(nnref.score(X_train_norm, y_train)))
print('Accuracy of NN classifier on test set (R2 score): {:.2f}'.format(nnref.score(X_test_norm, y_test)))

plt.figure()
plt.scatter(y_test,y_predictions, marker = 'o', color='red')
plt.xlabel('PMI expected (hrs)')
plt.ylabel('PMI predicted (hrs)')
plt.title('Correlation of PMI predicted by MLP regressor and the actual PMI')
plt.show()

Tags: fromtestimportnormtrainpltsklearnph
2条回答

你有几个问题。首先,使用正确的定标器或规范化来处理MLP非常重要。NNS在0到1之间工作得最好,所以请考虑使用{{CD1}} MinMaxScaler来实现这一点。

因此:

from sklearn.preprocessing import Normalizer
scaler = Normalizer().fit(X_train)
X_train_norm = scaler.transform(X_train)
X_test_norm = scaler.transform(X_test)

应该是:

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train_norm = scaler.fit_transform(X_train)
X_test_norm = scaler.fit_transform(X_test)

接下来,您将在无标度数据上进行训练和测试,然后在有标度数据上进行评分。意思是:

nnref = MLPRegressor(hidden_layer_sizes = [4], activation = 'logistic', solver = 'sgd', alpha = 1, 
                     learning_rate= 'constant', learning_rate_init= 0.6, max_iter=40000, momentum= 
                     0.3).fit(X_train, y_train)

应该是:

nnref = MLPRegressor(hidden_layer_sizes = [4], activation = 'logistic', solver = 'sgd', alpha = 1, 
                     learning_rate= 'constant', learning_rate_init= 0.6, max_iter=40000, momentum= 
                     0.3).fit(X_train_norm , y_train)

而且

y_predictions= nnref.predict(X_test)

应该是:

y_predictions= nnref.predict(X_test_norm)

附加说明

  • 根据你的训练数据进行预测没有任何意义。这没有任何价值,因为它正在测试从中学到的相同数据,并且应该100%预测。这是overfitting的一个例子

我发现了一个错误:

您在未规范化的样本上训练模型:
nnref = MLPRegressor(...).fit(X_train, y_train)
但稍后您将尝试从标准化样本中预测值:
nnref.score(X_train_norm, y_train)


x轴和y轴的值应在0到180之间,但情况并非如此(x轴从20到100,y轴从-4100到-3500)
Scikit学习不会自行更改值。如果X不在您需要的范围内,则意味着您已以某种方式更改了它。或者,也许你对X值的看法是错误的

相关问题 更多 >