用于sklearn管道的pandas到numpy数组

时间:2016-10-23 17:11:16

标签: python numpy scikit-learn converter pipeline

我有一个变压器,用于计算每组值的百分比。最初,使用熊猫是因为我开始使用pandas和colnames可以更好地处理。但是,现在我需要集成到sklearn-pipeline中。

如何转换我的Transformer以支持来自sklearn 管道而不是pandas数据帧的numpy 数组? 关键是self.colname不能用于numpy数组,我认为分组需要以不同的方式执行。

如何实现此类转换器的持久性,因为这些权重需要从磁盘加载才能在管道中部署这样的Transformer。

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会有所帮助。

1 个答案:

答案 0 :(得分:2)

  • 转换回来的事情

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

  • 持久性

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

Numpy也有saveload功能。