你如何利用 OneHotEncoder 的数组输出

How do you utilize array output from OneHotEncoder

Python初学者...

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

ohe 方法似乎比 pd.get_dummies 方法麻烦很多,但根据我的理解,将 ohe 与 fit_transform 结合使用可以更轻松地将相同的转换应用于测试数据。

搜索了几个小时,但在寻找合适的答案时遇到了很多麻烦。

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

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      ]])

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

您的直觉是正确的:pandas.get_dummies() 更易于使用,但使用 OHE 的优势在于它总是对看不见的数据应用相同的转换。您还可以使用 picklejoblib 导出实例并在其他脚本中加载它。

可能有一种方法可以直接将编码的列重新附加回原始 pandas.DataFrame。就个人而言,我会走很长的路。也就是说,我安装编码器,转换数据,将输出附加回 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(),否则结果可能因数据集而异。