pandas 到 sklearn 管道的 numpy 数组
pandas to numpy array for sklearn pipeline
我有一个转换器可以计算每组值的百分比。最初,使用 pandas 是因为我从 pandas 开始,而且 colnames 更容易处理。但是,现在我需要集成到 sklearn-pipeline 中。
我如何转换我的 Transformer 以支持来自 sklearn pipeline 而不是 pandas 数据帧的 numpy 数组?
关键是 self.colname
不能用于 numpy 数组,我认为分组需要以不同的方式执行。
如何实现 persistence 这样的转换器,因为这些 weights 需要从磁盘加载才能部署这样的转换器管道。
class PercentageTransformer(TransformerMixin):
def __init__(self, colname,typePercentage='totalTarget', _target='TARGET', _dropOriginal=True):
self.colname = colname
self._target = _target
self._dropOriginal = _dropOriginal
self.typePercentage = typePercentage
def fit(self, X, y, *_):
original = pd.concat([y,X], axis=1)
grouped = original.groupby([self.colname, self._target]).size()
if self.typePercentage == 'totalTarget':
df = grouped / original[self._target].sum()
else:
df = (grouped / grouped.groupby(level=0).sum())
if self.typePercentage == 'totalTarget':
nameCol = "pre_" + self.colname
else:
nameCol = "pre2_" + self.colname
self.nameCol = nameCol
grouped = df.reset_index(name=nameCol)
groupedOnly = grouped[grouped[self._target] == 1]
groupedOnly = groupedOnly.drop(self._target, 1)
self.result = groupedOnly
return self
def transform(self, dataF):
mergedThing = pd.merge(dataF, self.result, on=self.colname, how='left')
mergedThing.loc[(mergedThing[self.nameCol].isnull()), self.nameCol] = 0
if self._dropOriginal:
mergedThing = mergedThing.drop(self.colname, 1)
return mergedThing
它将在这样的管道中使用:
pipeline = Pipeline([
('features', FeatureUnion([
('continuous', Pipeline([
('extract', ColumnExtractor(CONTINUOUS_FIELDS)),
])),
('factors', Pipeline([
('extract', ColumnExtractor(FACTOR_FIELDS)),
# using labelencoding and all bias
('bias', PercentageAllTransformer(FACTOR_FIELDS, _dropOriginal=True, typePercentage='totalTarget')),
]))
], n_jobs=-1)),
('estimator', estimator)
])
pipeline
将与 X
和 y
匹配,两者都是数据帧。我不确定 X.as_matrix
是否有帮助。
我有一个转换器可以计算每组值的百分比。最初,使用 pandas 是因为我从 pandas 开始,而且 colnames 更容易处理。但是,现在我需要集成到 sklearn-pipeline 中。
我如何转换我的 Transformer 以支持来自 sklearn pipeline 而不是 pandas 数据帧的 numpy 数组?
关键是 self.colname
不能用于 numpy 数组,我认为分组需要以不同的方式执行。
如何实现 persistence 这样的转换器,因为这些 weights 需要从磁盘加载才能部署这样的转换器管道。
class PercentageTransformer(TransformerMixin):
def __init__(self, colname,typePercentage='totalTarget', _target='TARGET', _dropOriginal=True):
self.colname = colname
self._target = _target
self._dropOriginal = _dropOriginal
self.typePercentage = typePercentage
def fit(self, X, y, *_):
original = pd.concat([y,X], axis=1)
grouped = original.groupby([self.colname, self._target]).size()
if self.typePercentage == 'totalTarget':
df = grouped / original[self._target].sum()
else:
df = (grouped / grouped.groupby(level=0).sum())
if self.typePercentage == 'totalTarget':
nameCol = "pre_" + self.colname
else:
nameCol = "pre2_" + self.colname
self.nameCol = nameCol
grouped = df.reset_index(name=nameCol)
groupedOnly = grouped[grouped[self._target] == 1]
groupedOnly = groupedOnly.drop(self._target, 1)
self.result = groupedOnly
return self
def transform(self, dataF):
mergedThing = pd.merge(dataF, self.result, on=self.colname, how='left')
mergedThing.loc[(mergedThing[self.nameCol].isnull()), self.nameCol] = 0
if self._dropOriginal:
mergedThing = mergedThing.drop(self.colname, 1)
return mergedThing
它将在这样的管道中使用:
pipeline = Pipeline([
('features', FeatureUnion([
('continuous', Pipeline([
('extract', ColumnExtractor(CONTINUOUS_FIELDS)),
])),
('factors', Pipeline([
('extract', ColumnExtractor(FACTOR_FIELDS)),
# using labelencoding and all bias
('bias', PercentageAllTransformer(FACTOR_FIELDS, _dropOriginal=True, typePercentage='totalTarget')),
]))
], n_jobs=-1)),
('estimator', estimator)
])
pipeline
将与 X
和 y
匹配,两者都是数据帧。我不确定 X.as_matrix
是否有帮助。