Scikit-Learn 中跨多列的标签编码
标签编码是将分类数据转换为数字特征的常用技术。虽然可以为每列创建一个单独的 LabelEncoder 实例,但在多列需要标签编码的情况下,使用单个编码器会更有效。
考虑具有许多字符串标签列的 DataFrame。要对整个 DataFrame 进行标签编码,一种简单的方法可能是将整个 DataFrame 传递给 LabelEncoder,如下所示:
import pandas as pd from sklearn.preprocessing import LabelEncoder df = pd.DataFrame({ 'pets': ['cat', 'dog', 'cat', 'monkey', 'dog', 'dog'], 'owner': ['Champ', 'Ron', 'Brick', 'Champ', 'Veronica', 'Ron'], 'location': ['San_Diego', 'New_York', 'New_York', 'San_Diego', 'San_Diego', 'New_York'] }) le = LabelEncoder() le.fit(df)
但是,这种方法会导致以下错误:
ValueError: bad input shape (6, 3)
要解决这个问题,一个解决方案是使用 apply 函数将 LabelEncoder 应用于 DataFrame 中的每一列。此方法独立地转换每一列,允许对多列进行高效的一步编码:
df.apply(LabelEncoder().fit_transform)
或者,在 scikit-learn 0.20 及更高版本中,推荐的方法是使用 OneHotEncoder:
OneHotEncoder().fit_transform(df)
OneHotEncoder 现在支持直接对字符串输入进行编码。
为了获得更大的灵活性,可以使用 ColumnTransformer 将标签编码应用于特定列或仅应用于列中的某些数据类型。
对于逆变换和转换未来数据,可以使用 defaultdict 来保留每列的标签编码器。通过访问字典中的编码器,可以使用原始 LabelEncoder 实例对数据进行解码或编码。
此外,像 Neuraxle 这样的库提供了 FlattenForEach 步骤,这有助于将相同的 LabelEncoder 应用到扁平化数据。
对于不同的列需要不同的 LabelEncoder 或仅对列的子集进行编码的情况,ColumnTransformer 可以对选择和编码过程进行精细控制。
以上是如何在 Scikit-Learn 中高效地对多列进行标签编码?的详细内容。更多信息请关注PHP中文网其他相关文章!