如何利用OneHotEncoder的阵列输出

2024-06-02 07:55:12 发布

您现在位置:Python中文网/ 问答频道 /正文

这里是Python初学者

试图了解如何使用sklearn.preprocessing库中的OneHotEncoder。我非常有信心将其与fit_transform结合使用,这样结果也可以适合测试数据帧。我感到困惑的是如何处理生成的编码数组。然后,您是否将ohe结果转换回数据帧,并将其附加到现有的列车/测试数据帧

ohe方法似乎比pd.get_dummies方法麻烦得多,但据我所知,使用ohe和fit_变换可以更容易地将相同的变换应用于测试数据

搜索了几个小时,为了找到一个好的答案遇到了很多麻烦

广泛使用的泰坦尼克号数据集示例:

ohe = OneHotEncoder()
imp = SimpleImputer()

ct = make_column_transformer(
    (imp, ['Age']),
    (ohe, ['Sex', 'Embarked']),
    remainder='passthrough')
ct.fit_transform(train)

结果:

array([[22.        ,  0.        ,  1.        , ...,  1.        ,
         0.        ,  7.25      ],
       [38.        ,  1.        ,  0.        , ...,  1.        ,
         0.        , 71.2833    ],
       [26.        ,  1.        ,  0.        , ...,  0.        ,
         0.        ,  7.925     ],
       ...,
       [29.69911765,  1.        ,  0.        , ...,  1.        ,
         2.        , 23.45      ],
       [26.        ,  0.        ,  1.        , ...,  0.        ,
         0.        , 30.        ],
       [32.        ,  0.        ,  1.        , ...,  0.        ,
         0.        ,  7.75      ]])

您是否将生成的数组直接传递到变量中,例如,X和y用于train_test_split以运行的最终模型?或者有没有办法将结果转换回带有列标签的数据帧,以便进一步EDA


Tags: 数据方法transformtrain数组sklearnfitimp
1条回答
网友
1楼 · 发布于 2024-06-02 07:55:12

您的直觉是正确的:pandas.get_dummies()使用起来容易得多,但使用OHE的优点是它将始终对看不见的数据应用相同的转换。您还可以使用picklejoblib导出实例并将其加载到其他脚本中

有一种方法可以直接将编码列重新附加回原始pandas.DataFrame。就我个人而言,我一直在努力。也就是说,我安装编码器,转换数据,将输出连接回数据帧,并删除原始列

# Columns to encode
cols = ['Sex','Embarked']

# Initialize encoder
ohe = OneHotEncoder()

# Fit to data
ohe.fit(df[cols])

# Declare encoded data as new columns in `df`
df[ohe.get_feature_names] = ohe.transform(df[cols])

# Drop unencoded columns
df.drop(cols, axis=1, inplace=True)

最后,我注意到你说:

I feel pretty confident in using it in combination with fit_transform so that the results can also be fit to the test dataframe.

我想指出的是,您应该不要再安装编码器!相反,在处理新数据时应该使用ohe.transform(X_test[cols])。不要再次使用fit_transform(),否则结果可能因数据集而异

相关问题 更多 >