你如何利用 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 的优势在于它总是对看不见的数据应用相同的转换。您还可以使用 pickle
或 joblib
导出实例并在其他脚本中加载它。
可能有一种方法可以直接将编码的列重新附加回原始 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()
,否则结果可能因数据集而异。
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 的优势在于它总是对看不见的数据应用相同的转换。您还可以使用 pickle
或 joblib
导出实例并在其他脚本中加载它。
可能有一种方法可以直接将编码的列重新附加回原始 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()
,否则结果可能因数据集而异。