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 将与 Xy 匹配,两者都是数据帧。我不确定 X.as_matrix 是否有帮助。

  • 来回转换事物

Pandas 有一个 .to_records() 方法,而且正如您提到的,还有一个 .as_matrix() 方法。 .to_records() 方法实际上会为您保留列名。 Numpy 支持数组中的命名列。参见 here

  • 坚持

Pandas 有一个 pandas.to_pickle(obj, filename) 方法,它接受一个 pandas 对象和 pickles 它。有对应的pandas.read_pickle(文件名)方法。

Numpy 也有一个 save and load 函数。