如何对二进制编码拖曳混合特征



我有一个看起来像这样的数据集:

import pandas as pd
pd.DataFrame({"A": [2, 2, 1, 0, 5, 3, 0, 4, 5], "B": [1, 0, 0, 0, 1, 1, 1, 0, 0]})
   A  B
0  2  1
1  2  0
2  1  0
3  0  0
4  5  1
5  3  1
6  0  1
7  4  0

(我知道A在0到5之间; B仅为0或1(

我想改变它并得到:

    A0_B0 A1_B0 A2_B0 A3_B0 ...  A5_B1
0   0     0     0     0     ...
1   0     0     1     0     ...
2   0     1     0     0     ...
...

(知道哪个列对应于哪种组合很重要(

使用可以与Sklearn Pipeline和/或Sklearn_pandas DataFrameMapper集成的方法(需要在测试样本上重现(。

目前,我尝试使用onehotencoder或labelbinarizer,但它们适用于无需混合的A或B列。

我还使用自定义变压器手动尝试了它,但是dataframemapper松开列名:

from sklearn.base import BaseEstimator, TransformerMixin
class ABTransformer(BaseEstimator, TransformerMixin):
    def fit(self, x, y=None):
        return self
    def transform(self, x):
        A = x.A
        B = x.B
        A0_B0 = np.logical_and((A==0), (B == 0))
        A1_B0 = np.logical_and((A==1), (B == 0))
        ...
       data = pd.DataFrame(np.stack((A0_B0, A1_B0,.... ), axis=1), 
             columns=["A0_B0", "A1_B0", ...]
       )
       return data

 mapper = DataFrameMapper([
        (["A", "B"], [ABTransformer()] ,  {'input_df':True, "alias": None}),
        ],
        df_out=True, sparse=False)

最后,我得到的数据被标记为:" A_B_0"," A_B_1"等...

有没有办法实现所需的输出?

鉴于A和B列的不同值分别为n_An_B,并且所有值表示为基于零的整数,您可以使用以下变换函数。

def transform(self, x):
    indices = x.B * n_A + x.A
    columns = ["A%d_B%d" % (j, i) for i in range(n_B) for j in range(n_A)]
    onehot = np.eye(n_A * n_B)[indices]
    data = pd.DataFrame(data=onehot, columns=columns)
    return data

最新更新