使用 Keras 和 Tensorflow 进行回归的否定结果
Posted
技术标签:
【中文标题】使用 Keras 和 Tensorflow 进行回归的否定结果【英文标题】:Negative result for regression using Keras and Tensorflow 【发布时间】:2018-05-01 00:05:34 【问题描述】:我关注了 Jason Brownlee 的 tutorial,并完成了第 2 部分。结果,他的代码显然给出了,
基线:31.64 (26.82) MSE
我给了
结果:-59.54 (45.45) MSE
我对否定结果很感兴趣,因为它应该是平方米的价格(案例研究是波士顿住房数据)。
他的代码如下:
import numpy
import pandas
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
# load dataset
dataframe = pandas.read_csv("housing.csv", delim_whitespace=True, header=None)
dataset = dataframe.values
# split into input (X) and output (Y) variables
X = dataset[:, 0:13]
Y = dataset[:, 13]
# define base model
def 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 reproducibility
seed = 7
numpy.random.seed(seed)
# evaluate model with standardized dataset
estimator = 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: 我 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.5249161 > 忽略: Traceback(最近一次通话最后一次):文件 “/home/zchihani/pythonEnvs/kerasEnv/lib/python3.5/site-packages/tensorflow/python/client/session.py”, 第 696 行,在 del TypeError: 'NoneType' object is not callable
有趣的是(也许),进一步的调用没有显示“忽略异常”部分。
--编辑结束--
我读到here说“当训练误差降低到一定水平时,输出的预测有时是负的”。
建议的响应是使用
from keras.constraints import nonneg
但它没有说明如何或在哪里......
关于信息,mu 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)
【问题讨论】:
刚刚测试你的代码得到了这个结果:'Results: 57.92 (42.26) MSE' 我不知道你怎么能得到否定的结果,你能添加结果变量的输出吗? @Paddy 我很怀疑,这是我在 JB 的教程中找到的确切代码......但是,这是我第一次使用 python 和 Keras 代码,你能告诉我应该打印什么变量吗?谢谢 这个:结果 @Paddy 你能发布你正在使用的 Keras、scikit-learn 和 tensorflow 的版本吗?我也得到了负面的 MSE,并且我已经看到 Keras 和/或 sklearn 在某些情况下正在翻转符号的建议,假设更大的值更好。我正在使用 Keras (2.1.1)、scikit-learn (0.18.2) 和 tensorflow (1.3.0)。 抱歉耽搁了,我正在使用 Keras (2.0.8)、Numpy (1.13.3)、TensorFlow (1.3.0) 和 Sklearn (0.19.1) 【参考方案1】:不是真正的答案,但我需要空间。
当我对此进行研究时,我发现现在已贬值的 sklearn.cross_validation
显然应该返回负 MSE,这是基于更大的数字总是表示更好的结果的想法。请参阅 here 以了解开发人员之间的讨论,尤其是 this 评论以获得特别不直观的结果。 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 开发人员提出问题。
【讨论】:
【参考方案2】:其实这个结果并不是MSE,而是一个“分数”。 损失是一个人希望最小化的目标,而分数是一个人希望最大化的目标。 区别就在这里:
https://github.com/keras-team/keras/pull/7788
还有一个类似的问题:
scikit-learn cross validation, negative values with mean squared error
【讨论】:
以上是关于使用 Keras 和 Tensorflow 进行回归的否定结果的主要内容,如果未能解决你的问题,请参考以下文章
TensorFlow2 入门指南 keras.callbacks 回调使用方法
TensorFlow2 入门指南 | 18 keras.callbacks 回调使用方法
如何在 Tensorflow 2.0 + Keras 中进行并行 GPU 推理?
独家 | COVID-19:利用Opencv, Keras/Tensorflow和深度学习进行口罩检测