Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/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 在管道中使用时,scikit learn PLSRegression的值错误_Python_Python 2.7_Scikit Learn - Fatal编程技术网

Python 在管道中使用时,scikit learn PLSRegression的值错误

Python 在管道中使用时,scikit learn PLSRegression的值错误,python,python-2.7,scikit-learn,Python,Python 2.7,Scikit Learn,我试图使用scikit learns PLSRegressor类作为降维的中间步骤,但收到以下错误 ValueError: could not broadcast input array from shape (100,2) into shape (100) 我从scikit学习文档中了解到,管道中实现fit和transform的任何中间步骤都应该有效。PLSRegression类确实实现了这些方法 类sklearn.pipeline.pipeline(步骤) 按顺序应用变换列表和最终估计器。

我试图使用scikit learns PLSRegressor类作为降维的中间步骤,但收到以下错误

ValueError: could not broadcast input array from shape (100,2) into shape (100)
我从scikit学习文档中了解到,管道中实现fit和transform的任何中间步骤都应该有效。PLSRegression类确实实现了这些方法

类sklearn.pipeline.pipeline(步骤)

按顺序应用变换列表和最终估计器。 管道的中间步骤必须是“转换”,也就是说,它们必须实现fit和transform方法。最终的估计器只需要实现拟合

下面是一个演示该行为的示例。我是做错了什么还是遗漏了一些明显的东西

import numpy as np
import pandas as pd
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LinearRegression
from sklearn.cross_decomposition import PLSRegression

df = pd.DataFrame(np.random.randint(0,100,size=(100, 5)), columns=list('ABCDy'))

pipeline = make_pipeline(PLSRegression(n_components=2), LinearRegression())

X = df.ix[:, :-1]
y = df['y']

pipeline.fit(X, y)
这是完整的痕迹

Traceback (most recent call last):
  File "pls.py", line 15, in <module>
    pipeline.fit(X, y)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/pipeline.py", line 270, in fit
    self._final_estimator.fit(Xt, y, **fit_params)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/linear_model/base.py", line 512, in fit
    y_numeric=True, multi_output=True)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py", line 521, in check_X_y
    ensure_min_features, warn_on_dtype, estimator)
  File "/usr/local/lib/python2.7/dist-packages/sklearn/utils/validation.py", line 382, in check_array
    array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: could not broadcast input array from shape (100,2) into shape (100)
回溯(最近一次呼叫最后一次):
文件“pls.py”,第15行,在
管道安装(X,y)
文件“/usr/local/lib/python2.7/dist-packages/sklearn/pipeline.py”,第270行,适合
self._final_estimator.fit(Xt,y,**fit_参数)
文件“/usr/local/lib/python2.7/dist-packages/sklearn/linear\u-model/base.py”,第512行,适合
y_数值=真,多输出=真)
文件“/usr/local/lib/python2.7/dist packages/sklearn/utils/validation.py”,第521行,检查
确保\u最小\u功能,警告\u数据类型,估计器)
check_数组中的文件“/usr/local/lib/python2.7/dist packages/sklearn/utils/validation.py”,第382行
array=np.array(array,dtype=dtype,order=order,copy=copy)
ValueError:无法将输入数组从形状(100,2)广播到形状(100)

我理解这个错误,但由于这是管道的一部分,一旦阵列进入管道,我就无法控制阵列的形状。在拟合之前,我尝试了许多不同的重塑
X.values
的迭代,但到目前为止没有任何效果。

这个错误是因为在大多数用于降维的scikit类中,
transform
方法没有将Y作为参数并返回转换后的X。在PLS的情况下,它返回“如果未给出Y,则为x_分数,(x_分数,Y_分数)否则”(引用自文件)

为了使其与管道一起工作,您只需创建一个简单的包装器:

class PLSRegressionWrapper(PLSRegression):

    def transform(self, X):
        return super().transform(X)

    def fit_transform(self, X, Y):
        return self.fit(X,Y).transform(X)

通过Python3.6测试,该模块似乎已投入使用。@sascha感谢您为我指出这一点。甚至有人提到它在管道中不起作用。