sklearn Pipeline 正确使用
Posted
技术标签:
【中文标题】sklearn Pipeline 正确使用【英文标题】:sklearn Pipeline correct usage 【发布时间】:2018-01-24 10:58:43 【问题描述】:我在 python 中有一个数据框,它有一个名为“datetime”的日期时间文件。使用 Pipeline 和 FeatureUnion 我正在尝试提取日、月、工作日和 isBusinessday。为了提取这些功能,我编写了自定义代码。
我正在使用以下代码来提取日、月、工作日和 isBusinessday
class itemselector(BaseEstimator, TransformerMixin):
def __init__(self, key):
self.key = key
def transform(self, X):
return X[self.key]
def fit(self, X, y=None):
return self
f_df = Pipeline([
('union', FeatureUnion([
('date', Pipeline([
('sitem', itemselector('pickup_datetime')),
('sday', Extract_date()),
])),
('month', Pipeline([
('sitem', itemselector('pickup_datetime')),
('smonth', Extract_month()),
])),
])),
])
当我运行此代码时,我将列表作为输出。比如说:
df = f_df.fit_transform(df_train[:5])
输出:
[14 12 19 6 26 3 6 1 4 3] // it has both day and month. it is not expected output
但我是天和月是分开的功能。我怎样才能做到这一点 ?我的代码出了什么问题?谁能帮我找到它?
更新
总结一下我的问题,我得到了输出形状(10,)
,但我希望我的输出是(5,2)
更新了 1 根据要求我添加了必要的代码
class Extract_date(BaseEstimator, TransformerMixin):
def fit(self, X):
print('one')
return self
def transform(self, X):
return X.apply(lambda y: y.day)
class Extract_month(BaseEstimator, TransformerMixin):
def fit(self, X, **atr):
print('two')
return self
def transform(self, X):
return X.apply(lambda y: y.month)
【问题讨论】:
投反对票的请留言并投反对票 FeatureUnion 将水平堆叠来自内部转换器每个部分的数据。你能显示Extract_month
和Extract_date
返回的内容吗?
@VivekKumar,我添加了必要的代码。请看一下
【参考方案1】:
好的,Extract_month
和 Extract_date
返回一个系列,它是一维向量,因此 FeatureUnion 没有正确堆叠它们。对于 FeatureUnion,您需要来自每个内部转换器的具有相同行数的二维数据。
您可以为此使用reshape(-1,1)
。
所以像这样改变你的方法:
class Extract_date(BaseEstimator, TransformerMixin):
...
...
def transform(self, X):
return X.apply(lambda y: y.day).values.reshape(-1,1)
class Extract_month(BaseEstimator, TransformerMixin):
...
...
def transform(self, X):
return X.apply(lambda y: y.month).values.reshape(-1,1)
现在输出应该是正确的。如果还有问题,请随时询问。
【讨论】:
以上是关于sklearn Pipeline 正确使用的主要内容,如果未能解决你的问题,请参考以下文章
您好,关于 sklearn.Pipeline 的两个问题,带有用于时间序列的自定义转换器 [关闭]
sklearn Pipeline 和 DataFrameMapper 有啥区别?