python - “ValueError:所有输入数组必须具有相同的维数”sklearn 管道中的错误
问题描述
我正在使用 sklearn 管道构建机器学习管道。在预处理步骤中,我尝试对两个不同的 sting 变量进行两种不同的处理 1)BusinessType 上的一个热编码 2)AreaCode 上的平均编码如下:
preprocesses_pipeline = make_pipeline (
FeatureUnion (transformer_list = [
("text_features1", make_pipeline(
FunctionTransformer(getBusinessTypeCol, validate=False), CustomOHE()
)),
("text_features2", make_pipeline(
FunctionTransformer(getAreaCodeCol, validate=False)
))
])
)
preprocesses_pipeline.fit_transform(trainDF[X_cols])
TransformerMixin 类定义为:
class MeanEncoding(BaseEstimator, TransformerMixin):
def fit(self, X, y=None):
return self
def transform(self, X):
tmp = X['AreaCode1'].map(X.groupby('AreaCode1')['isFail'].mean())
return tmp.values
class CustomOHE(BaseEstimator, TransformerMixin):
def fit(self, X, y=None):
return self
def transform(self, X):
tmp = pd.get_dummies(X)
return tmp.values
和 FunctionTransformer 函数返回所需字段
def getBusinessTypeCol(df):
return df['BusinessType']
def getAreaCodeCol(df):
return df[['AreaCode1','isFail']]
现在,当我取消上述管道时,它会生成以下错误
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-146-7f3a31a39c81> in <module>()
15 )
16
---> 17 preprocesses_pipeline.fit_transform(trainDF[X_cols])
~\Anaconda3\lib\site-packages\sklearn\pipeline.py in fit_transform(self, X, y, **fit_params)
281 Xt, fit_params = self._fit(X, y, **fit_params)
282 if hasattr(last_step, 'fit_transform'):
--> 283 return last_step.fit_transform(Xt, y, **fit_params)
284 elif last_step is None:
285 return Xt
~\Anaconda3\lib\site-packages\sklearn\pipeline.py in fit_transform(self, X, y, **fit_params)
747 Xs = sparse.hstack(Xs).tocsr()
748 else:
--> 749 Xs = np.hstack(Xs)
750 return Xs
751
~\Anaconda3\lib\site-packages\numpy\core\shape_base.py in hstack(tup)
286 return _nx.concatenate(arrs, 0)
287 else:
--> 288 return _nx.concatenate(arrs, 1)
289
290
ValueError: all the input arrays must have same number of dimensions
似乎在管道中有“MeanEncoding”的线上正在发生错误,因为删除它会使管道正常工作。不确定它到底有什么问题。需要帮忙。
解决方案
好的,我解决了这个难题。基本上,MeanEncoding()
转换后,返回格式数组,(n,)
而返回的调用期望格式,(n,1)
因此它可以将其与第一个管道返回的(n,1)
其他已处理数组相结合, 。由于不能合并,需要重新整形。所以,现在我的班级如下所示:(n,k)
CustomOHE()
numpy
(n,)
(n,k)
(n,1)
MeanEncoding
class MeanEncoding(BaseEstimator, TransformerMixin):
def fit(self, X, y=None):
return self
def transform(self, X):
tmp = X['AreaCode1'].map(X.groupby('AreaCode1')['isFail'].mean())
return tmp.values.reshape(len(tmp), 1)
推荐阅读
- python - 有一个 python 字节(来自 img),我如何在 C# 中处理它,并转换为字节 [] 或图像流?
- r - 当我没有 2*2 表时如何使用 metafor 计算效果大小?
- scala - org.apache.spark.sql.AnalysisException:
- python - 部署在heroku上的Django网站不起作用
- regex - 正则表达式搜索特定字段的全文
- java - 使用jsp的测验应用程序
- php - PHP分页循环没有可见链接
- java - 从 String 类的 .equals() 方法获取 NPE。如何调试这个
- actions-on-google - 谷歌智能家居第三方后台调用首页图错误
- heroku - 邮件因“已达到最大排队时间”消息而被阻止。Heroku,SendGrid