使用Keras和Tensorflow进行回归的负面结果

我按照Jason Brownlee的教程进行学习,并完成了第二部分。他的代码显然给出了以下结果:

基准:31.64 (26.82) MSE

而我的结果是

结果:-59.54 (45.45) MSE

我对这个负结果感到很困惑,因为它应该是平方米的价格(案例研究是波士顿房价数据)。

他的代码如下:

import numpyimport pandasfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.wrappers.scikit_learn import KerasRegressorfrom sklearn.model_selection import cross_val_scorefrom sklearn.model_selection import KFoldfrom sklearn.preprocessing import StandardScalerfrom sklearn.pipeline import Pipeline# load datasetdataframe = pandas.read_csv("housing.csv", delim_whitespace=True, header=None)dataset = dataframe.values# split into input (X) and output (Y) variablesX = dataset[:, 0:13]Y = dataset[:, 13]# define base modeldef baseline_model():    # create model    model = Sequential()    model.add(Dense(13, input_dim=13, kernel_initializer='normal',                    activation='relu'))    model.add(Dense(1, kernel_initializer='normal'))    # Compile model    model.compile(loss='mean_squared_error', optimizer='adam')    return model# fix random seed for reproducibilityseed = 7numpy.random.seed(seed)# evaluate model with standardized datasetestimator = KerasRegressor(build_fn=baseline_model, nb_epoch=100,                           batch_size=5, verbose=0)kfold = KFold(n_splits=10, random_state=seed)results = cross_val_score(estimator, X, Y, cv=kfold)print("Results: %.2f (%.2f) MSE" % (results.mean(), results.std()))print(results)

编辑:现在的结果是

使用TensorFlow后端。 2017-11-17 15:19:20.550701: I tensorflow/core/platform/cpu_feature_guard.cc:137] 您的CPU支持此TensorFlow二进制文件未编译使用的指令:SSE4.1 SSE4.2 AVX AVX2 FMA

结果:-59.57 (45.48) MSE

[ -21.09693904 -34.74104155 -24.24863872 -113.87524421 -80.55262979 > -98.56815988 -39.08693658 -150.61814082 -17.41903878 -15.52491613] 忽略的异常: > 追溯(最近的调用最后):文件”/home/zchihani/pythonEnvs/kerasEnv/lib/python3.5/site-packages/tensorflow/python/client/session.py”,第696行,在del中 TypeError: ‘NoneType’ 对象不可调用

有趣的是(也许),后续的调用并没有显示“忽略的异常”部分。

–编辑结束–

我在这里读到,“当训练误差降低到一定水平时,输出的预测有时会是负值”。

提出的回应是使用

from keras.constraints import nonneg

但它没有说明如何或在哪里使用…

为了提供信息,我的keras.json文件是

{                                                                                    "backend": "tensorflow",    "epsilon": 1e-07,    "floatx": "float64",    "image_dim_ordering": "tf",    "image_data_format": "channels_last"}

以及在虚拟环境中pip list的输出是

autopep8 (1.3.3)bleach (1.5.0)enum34 (1.1.6)flake8 (3.5.0)h5py (2.7.1)html5lib (0.9999999)importmagic (0.1.7)jedi (0.11.0)Keras (2.0.9)Markdown (2.6.9)mccabe (0.6.1)numpy (1.13.3)olefile (0.44)pandas (0.21.0)parso (0.1.0)Pillow (4.3.0)pip (9.0.1)pkg-resources (0.0.0)protobuf (3.4.0)pycodestyle (2.3.1)pyflakes (1.6.0)python-dateutil (2.6.1)pytz (2017.3)PyYAML (3.12)rope (0.10.7)scikit-learn (0.19.1)scipy (1.0.0)setuptools (36.7.0)six (1.11.0)tensorflow (1.4.0)tensorflow-gpu (1.4.0)tensorflow-tensorboard (0.4.0rc2)Theano (1.0.0rc1+5.gab69bf0)Werkzeug (0.12.2)wheel (0.30.0)yapf (0.19.0)

回答:

这不是一个真正的答案,但我需要这个空间。

当我研究这个问题时,我发现现在已废弃的sklearn.cross_validation显然应该返回一个负的MSE,基于更大的数字总是表示更好的结果这一想法。参见这里的开发者讨论,特别是这个评论,它展示了一个特别不直观的结果。还值得注意的是,sklearn.metrics.make_scorer接受一个greater_is_better标志,允许用户自定义这一点。

然而,未废弃的sklearn.model_selection.cross_val_score并未否定MSE,包括当我运行它时。我猜测Keras包装器通过否定不再被否定的MSE来搞乱事情,但我找不到任何文档或Keras代码中对此的说明,而且Paddy运行你的代码并得到了正确的结果。我再次尝试使用scikit-learn (0.19.1) 和 tensorflow (1.4.0),结果仍然是负的。

所以不幸的是,我的建议是接受实际的MSE是你得到的否定值,或者尝试不使用Keras构建你的模型,看看是否有效。你也可以尝试在GitHub上向Keras开发者提出问题。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注