我按照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开发者提出问题。