Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将sklearn目标变压器(用于输出变量)添加到keras神经网络管道?_Python_Tensorflow_Machine Learning_Keras_Scikit Learn - Fatal编程技术网

Python 如何将sklearn目标变压器(用于输出变量)添加到keras神经网络管道?

Python 如何将sklearn目标变压器(用于输出变量)添加到keras神经网络管道?,python,tensorflow,machine-learning,keras,scikit-learn,Python,Tensorflow,Machine Learning,Keras,Scikit Learn,我想在输入变量和输出变量的转换上使用Keras构建一个神经网络,使用sklearn管道(这样我就可以执行CV)。我试图使用TransformedTargetRegressor,但我的均方误差对我来说没有意义 这是我的代码,改编自Sklearn的TransformedTargetGressor示例,使用Boston Housing数据集并添加一个简单的神经网络来缩放输入变量(X) 设置(此部分很好): import numpy as np from keras.models import Sequ

我想在输入变量和输出变量的转换上使用Keras构建一个神经网络,使用sklearn管道(这样我就可以执行CV)。我试图使用TransformedTargetRegressor,但我的均方误差对我来说没有意义

这是我的代码,改编自Sklearn的TransformedTargetGressor示例,使用Boston Housing数据集并添加一个简单的神经网络来缩放输入变量(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))

我正在尝试执行以下操作(有问题的部分):

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))

得出的交叉验证分数为:
数组([0.61321517,0.35811762,-2.67674546,-0.30623006,-0.38187424])


我特别关心中间的数字,因为y目标应该从0缩放到1,所以-2.67的均方误差似乎是错误的。我做错了什么?

均方误差是平方的,因此不可能是负的。 这意味着你的分数不是均方误差

文档告诉我们,如果未定义,计分器默认为估计器计分器:

“如果没有,则使用估计器的默认记分器(如果可用)

在您的情况下,使用的是TransformedTargetRegressor回归器。它告诉我们其默认分数:

返回预测的确定系数R^2

因此,您显示的值是R2分数。如果您的模型表现不佳,则可能为负值


作为一个好的实践,你应该始终定义你想要使用的计分器,以避免依赖错误的计分器。

明白了,这是有意义的。如果在上面的
交叉值评分
模型
,并且
模型
本身是一个
转换的计分器,我如何获得均方误差评分e> 以管道作为回归因子?是否只是在行中填写?:
结果=交叉值(模型,X,y,cv=KFold(n_分割=5),评分=?)
一般来说,设置是否正确?我相信这可能是
评分
,尽管我仍然不确定这在转换方面是否正确。是的,你应该在
你的交叉值分数中添加
评分='neg\u均方误差'
,以获得MSE。如果你是不确定您的转换,您应该使用受控输入数据独立测试每个步骤,例如输入范围(10)。您可以访问安装管道的不同步骤,如dict(管道['Standardized'))。谢谢!感谢您的帮助和时间。我想我明白了。