Python 在管道中使用时,scikit learn PLSRegression的值错误
我试图使用scikit learns PLSRegressor类作为降维的中间步骤,但收到以下错误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(步骤) 按顺序应用变换列表和最终估计器。
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感谢您为我指出这一点。甚至有人提到它在管道中不起作用。