我想用Keras来构建一个神经网络,它可以转换我的输入变量和输出变量(这样我就可以执行CV了)。我正在尝试使用TransformedTargetRegressor,但是我的均方错误对我来说没有意义。
这是我的代码,它改编自Sklearn的TransformedTargetRegressor示例,使用波士顿房屋数据集,并添加了一个简单的神经网络来扩展输入变量(X)。
设置(本节很好):
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import MinMaxScaler
from sklearn.datasets import load_boston
from sklearn.compose import TransformedTargetRegressor
from sklearn.model_selection import train_test_split
#load data
X, y = load_boston(return_X_y=True)
#define simple neural network
def simple_nn():
model = Sequential()
model.add(Dense(13, input_dim=13, activation='relu'))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer = 'adam')
return model
#create pipeline for input variables (X) preprocessing
estimators = []
estimators.append(('standardize', StandardScaler()))
estimators.append(('mlp', KerasRegressor(build_fn=simple_nn, epochs=100, batch_size=5, verbose=True)))
pipeline = Pipeline(estimators)我正在尝试执行以下操作(有问题的部分):
#Section in question
transformer = MinMaxScaler()
model = TransformedTargetRegressor(regressor=pipeline,
transformer=transformer)
results = cross_val_score(model, X, y, cv=KFold(n_splits=5))由此产生的交叉验证分数为:array([ 0.61321517, 0.35811762, -2.67674546, -0.30623006, -0.38187424])
中间数是我特别关心的,因为y目标应该从0缩放到1,所以-2.67的均方误差似乎是错误的。我在这里做错什么了?
发布于 2020-04-29 12:54:31
均方误差是平方的,因此不可能是负的。这意味着你的分数不是均方误差。
得分文档告诉我们,如果没有定义,scorer默认为估值器记分器:
“如果没有,则使用估计器的默认记分器(如果可用)。
在您的例子中,正在使用的是TransformedTargetRegressor回归器。TransformedTargetRegressor文档告诉我们它的默认分数:
返回预测的决定系数R^2。
所以你要显示的值是R2分数。如果你的模型表现不好,它可能是负面的。例如,请看这个问题。
作为一个良好的实践,你应该始终定义你想要使用的得分手,以避免依赖错误的一个。
https://stackoverflow.com/questions/61488045
复制相似问题