我正试图使用scikit学习PLSRegressor类作为降维的中间步骤,但收到以下错误。
ValueError: could not broadcast input array from shape (100,2) into shape (100)
我从scikit学习文档中了解到,管道中实现拟合和转换的任何中间步骤都应该有效。PLSRegression类确实实现了这些方法。
类sklearn.ppipeline.pipeline(步骤)
依次应用变换列表和最终估计器。管道的中间步骤必须是"转换",也就是说,它们必须实现拟合和转换方法。最终估计器只需要实现拟合。
下面是一个演示该行为的示例。我是做错了什么还是遗漏了一些显而易见的东西?
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)
我理解这个错误,但由于这是管道的一部分,一旦数组进入管道,我就无法控制数组的形状。在拟合之前,我尝试了许多不同的X.values
整形迭代,但到目前为止都没有成功。
该错误是由以下事实引起的:在大多数用于降维的scikit类中,transform
方法不将Y作为参数并返回变换后的X。在PLS的情况下,它返回"如果没有给定Y,则返回X_scores,否则返回(X_scores、Y_scores)"(引用自文档)
为了使其与管道一起工作,您只需创建一个简单的包装器:
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 进行测试