Numpy自己实现独热编码one-hot

博客介绍了独热编码相关参考,重点讲述如何用numpy实现独热编码。还介绍了numpy中ravel()、flat()、flatten()、squeeze()、reshape()等将多维数组转换为一维数组的方法及区别,指出在代码实现中ravel()和flatten()可互换。

有关于独热编码的介绍参考:这里

下面列出如何使用numpy自己实现独热编码:

import numpy as np

def dense_to_onehot(labels_dense, num_classes=10):
    num_labels = labels_dense.shape[0]
    index_offset = np.arange(num_labels) * num_classes
    labels_onehot = np.zeros((num_labels,num_classes))
    # 展平的索引值对应相加,然后得到精确索引并修改labels_onehot中的每一个值
    labels_onehot.flat[index_offset + labels_dense.ravel()] = 1
    print(labels_onehot)

# 模拟需要做独热编码的数据,这是10个类别的数据,从0-9
labels_dense = np.arange(start=0,stop=10,step=1,dtype=np.uint8)

print(labels_dense)
dense_to_onehot(labels_dense)
'''
[0 1 2 3 4 5 6 7 8 9]
[[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 1. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]]
'''

在上面的代码里面我们用到了flat和ravel两个函数,关于矩阵压平我们可以有如下方法可以选择:

numpy中的ravel()、flat()、flatten()、squeeze()、reshape()都有将多维数组转换为一维数组的功能,区别: 
ravel():如果没有必要,不会产生源数据的副本,指向同样的数据空间 
flatten():返回源数据的副本 ,新的内存空间

flat:返回一个迭代器对象,通过该对象和索引拿到对应展平为一维的值,并支持修改
squeeze():只能对维数为1的维度降维

另外,reshape(-1)也可以“拉平”多维数组

经过上面的区别,所以在上述代码实现中,可以将ravel()和flatten()函数互换使用。

<think>好的,我现在需要帮助用户了解Python中独热编码One-Hot Encoding)的详细使用方法。用户之前的问题是关于集合差集操作的,现在转向了数据预处理中的独热编码,这可能是因为他在数据清洗后需要进行特征工程。我需要结合用户提供的三个引用,特别是引用[2]和[3],来构建一个清晰的教程。 首先,用户可能已经知道独热编码的基本概念,但需要具体的实现步骤。引用[1]解释了独热编码的定义,引用[2]提供了sklearn的代码示例,而引用[3]提到了处理类别变量时的注意事项。因此,我应该涵盖基本原理、使用场景、实现方法(包括不同的库,比如pandas和sklearn)、注意事项以及常见问题。 接下来,我需要确定用户可能的实际需求。用户可能正在处理分类数据,比如机器学习模型的特征工程,需要将分类变量转换为数值形式。这时候,他可能需要知道如何正确应用独热编码,避免常见错误,比如多重共线性或维度爆炸。因此,我应该提到如何通过drop_first参数来处理这些问题。 用户可能对代码示例特别感兴趣,尤其是不同库的实现方式。引用[2]中的sklearn示例和引用[3]中的pandas方法都是重点。需要比较两者的优缺点,比如pandas更简单,而sklearn更适合集成到机器学习流程中。此外,用户可能不清楚如何处理新数据中的未知类别,所以在transform方法中需要强调这一点。 还需要注意数据类型的问题,确保输入的列是类别类型,否则可能会被误处理。例如,如果数值型的列被错误地当作分类变量,会导致编码错误。引用[3]提到了这一点,所以需要提醒用户明确指定需要编码的列。 最后,用户可能有疑问如何处理高基数特征,这时候需要给出建议,比如特征选择或嵌入方法。同时,示例部分需要详细说明输出结果的结构,帮助用户理解编码后的特征矩阵。 总结下来,回答的结构应该是:基本原理、应用场景、具体实现(分pandas和sklearn)、注意事项、常见问题解决、示例和进阶优化。这样用户能够逐步了解如何应用独热编码,并避免常见陷阱。</think>以下是Python中独热编码One-Hot Encoding)的详细使用指南,结合数据预处理场景和代码实现--- ### 一、基本原理 独热编码将**类别型特征**转换为二进制向量形式。假设某特征有$N$个可能值,则用$N$位二进制数表示,其中仅一位为1(有效位),例如: $$颜色 \in \{红,绿,蓝\} \Rightarrow 红=[1,0,0], 绿=[0,1,0], 蓝=[0,0,1]$$ --- ### 二、核心应用场景 1. **机器学习模型输入**:将非数值型数据转换为数值型 2. **消除类别间大小关系误导**:如将"学历"(高中=1, 本科=2)转换为独立特征[^1] 3. **处理无序分类变量**:如性别、国家等离散值 --- ### 三、Python实现方法 #### 方法1:使用Pandas ```python import pandas as pd # 示例数据 df = pd.DataFrame({ '颜色': ['红', '绿', '蓝', '绿'], '尺寸': ['S', 'L', 'M', 'XL'] }) # 独热编码实现 encoded_df = pd.get_dummies(df, columns=['颜色', '尺寸'], prefix=['COLOR', 'SIZE']) print(encoded_df) ``` **输出结果**: ```text COLOR_红 COLOR_绿 COLOR_蓝 SIZE_S SIZE_L SIZE_M SIZE_XL 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 0 2 0 0 1 0 0 1 0 3 0 1 0 0 0 0 1 ``` #### 方法2:使用Scikit-learn(适合机器学习管道) ```python from sklearn.preprocessing import OneHotEncoder import numpy as np # 示例数据 data = np.array([['红', 'S'], ['绿', 'L'], ['蓝', 'M'], ['绿', 'XL']]) # 创建编码器 encoder = OneHotEncoder(sparse_output=False, handle_unknown='ignore') encoder.fit(data) # 转换数据 test_data = np.array([['绿', 'XL']]) encoded_array = encoder.transform(test_data) print("\n编码结果:", encoded_array) ``` **输出结果**: ```text 编码结果: [[0. 1. 0. 0. 0. 0. 1.]] ``` 特征对应关系: $$特征顺序=[红,绿,蓝,S,L,M,XL]$$ --- ### 四、关键参数说明 | 参数 | 说明 | Pandas示例 | Scikit-learn示例 | |------|------|------------|------------------| | 列选择 | 指定需要编码的列 | `columns=['颜色']` | 通过数据输入控制 | | 前缀 | 生成列名前缀 | `prefix='COL'` | `feature_names_out()`获取 | | 稀疏矩阵 | 内存优化 | 默认False | `sparse_output=True` | | 未知处理 | 处理新类别值 | 自动置0 | `handle_unknown='ignore'`[^3] | --- ### 五、注意事项 1. **维度爆炸问题**:当类别数量较多时(如邮编),考虑: - 使用`drop='first'`消除多重共线性: ```python pd.get_dummies(df, drop_first=True) ``` - 特征选择或嵌入(Embedding)技术 2. **数据类型验证**: ```python # 确保转换的列是category类型 df['颜色'] = df['颜色'].astype('category') ``` 3. **管道集成**(Scikit-learn特有): ```python from sklearn.pipeline import make_pipeline from sklearn.linear_model import LogisticRegression pipe = make_pipeline( OneHotEncoder(handle_unknown='ignore'), LogisticRegression() ) ``` --- ### 六、进阶应用示例 **混合类型数据处理**: ```python # 数值型+类别型混合数据 from sklearn.compose import ColumnTransformer preprocessor = ColumnTransformer( transformers=[ ('num', StandardScaler(), ['age', 'income']), ('cat', OneHotEncoder(), ['gender', 'city']) ]) ``` --- ### 七、性能优化建议 1. **稀疏矩阵存储**: ```python encoder = OneHotEncoder(sparse_output=True) # 节省内存 ``` 2. **批处理大数据**:使用`partial_fit`方法 3. **类别限制**:通过`categories`参数预设有效类别: ```python OneHotEncoder(categories=[['红','绿'], ['S','M','L']]) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值