MLPRegressor 工作但结果没有任何意义
MLPRegressor working but results don't make any sense
我正在通过两种方式用我的研究数据构建神经网络:使用统计程序 (SPSS) 和 python。
我正在使用 scikit 学习 MLPRegressor。我遇到的问题是,虽然我的代码显然写得很好(因为它可以运行),但结果没有意义。 r2score 应该在 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()
嗯,我发现了一个错误:
您在未归一化的样本上训练模型:
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-learn 不会自行更改值。如果 X 不在您需要的范围内,则意味着您已经以某种方式更改了它。或者,也许您对 X 值的看法不正确。
你有几个问题。首先,重要的是使用正确的缩放器或规范化来处理 MLP。 NN 在 0 和 1 之间效果最好,因此请考虑使用 sklearn
的 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.
的例子
我正在通过两种方式用我的研究数据构建神经网络:使用统计程序 (SPSS) 和 python。 我正在使用 scikit 学习 MLPRegressor。我遇到的问题是,虽然我的代码显然写得很好(因为它可以运行),但结果没有意义。 r2score 应该在 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()
嗯,我发现了一个错误:
您在未归一化的样本上训练模型:
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-learn 不会自行更改值。如果 X 不在您需要的范围内,则意味着您已经以某种方式更改了它。或者,也许您对 X 值的看法不正确。
你有几个问题。首先,重要的是使用正确的缩放器或规范化来处理 MLP。 NN 在 0 和 1 之间效果最好,因此请考虑使用 sklearn
的 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. 的例子