Python 实现独热编码的方法

Python 实现独热编码的方法

技术背景

在机器学习分类问题中,当数据集中存在大量分类变量时,独热编码(One-Hot Encoding)是一种常用的数据预处理技术。独热编码可以将分类变量转换为二进制向量,使得分类变量能够被机器学习模型正确处理。然而,独热编码可能会导致特征数量的指数级增长,增加计算复杂度和内存需求。因此,选择合适的独热编码方法至关重要。

实现步骤

方法一:使用 Pandas 的 pd.get_dummies

  1. 示例 1:对 Series 进行独热编码
import pandas as pd
s = pd.Series(list('abca'))
encoded_s = pd.get_dummies(s)
print(encoded_s)
  1. 示例 2:对 DataFrame 的指定列进行独热编码
import pandas as pd
df = pd.DataFrame({
    'A': ['a', 'b', 'a'],
    'B': ['b', 'a', 'c']
})
one_hot = pd.get_dummies(df['B'])
df = df.drop('B', axis=1)
df = df.join(one_hot)
print(df)

方法二:使用 Scikit-learn 的 OneHotEncoder

from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
transformed_data = enc.transform([[0, 1, 1]]).toarray()
print(transformed_data)

方法三:使用 Numpy 的 np.eye

import numpy as np
nb_classes = 6
data = [[2, 3, 4, 0]]

def indices_to_one_hot(data, nb_classes):
    """Convert an iterable of indices to one-hot encoded labels."""
    targets = np.array(data).reshape(-1)
    return np.eye(nb_classes)[targets]

encoded_data = indices_to_one_hot(data, nb_classes)
print(encoded_data)

核心代码

封装的 Pandas 独热编码函数

def one_hot(df, cols):
    """
    @param df pandas DataFrame
    @param cols a list of columns to encode 
    @return a DataFrame with one-hot encoding
    """
    for each in cols:
        dummies = pd.get_dummies(df[each], prefix=each, drop_first=False)
        df = pd.concat([df, dummies], axis=1)
    return df

封装的 Scikit-learn 独热编码函数

from sklearn.preprocessing import OneHotEncoder

def sklearn_one_hot(data):
    enc = OneHotEncoder()
    enc.fit(data)
    return enc.transform(data).toarray()

最佳实践

  • 简单场景:如果只是进行简单的独热编码,且数据量较小,使用 Pandas 的 pd.get_dummies 是最简单快捷的方法。
  • 需要复用编码器:如果需要在训练数据和测试数据上使用相同的编码规则,建议使用 Scikit-learn 的 OneHotEncoder
  • 自定义编码:如果需要对特定类型的数据进行独热编码,或者不想使用第三方库,可以使用 Numpy 实现自定义的独热编码函数。

常见问题

内存问题

当分类变量的类别数量较多时,独热编码会导致特征数量的指数级增长,从而占用大量内存。可以考虑使用稀疏矩阵(如 pd.get_dummies 中的 sparse=True 参数)来减少内存占用。

特征选择问题

独热编码会增加特征数量,可能导致过拟合。在进行特征选择时,可以使用一些特征选择方法(如相关性分析、递归特征消除等)来选择重要的特征。

未见过的类别问题

在使用 Scikit-learn 的 OneHotEncoder 时,如果测试数据中出现了训练数据中未见过的类别,可能会导致错误。可以通过设置 handle_unknown='ignore' 来忽略这些未见过的类别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1010n111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值