机器学习中的特征处理--onehot编码

首先介绍数据标准化工具onehot[独热编码]:

One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。以手写数字识别为例,我们需要将0-9共十个数字标签转化成onehot标签。例如:数字标签“6”转化为onehot标签就是[0,0,0,0,0,0,1,0,0,0].
我第一次利用以下函数进行编码:

def convert2onehot(data):
    # covert data to onehot representation
    return pd.get_dummies(data, prefix=data.columns)

结果报错:
很明显职业一项我们一共有15个而该函数只能提供10个以下的编码,只能另觅他法喽,

ValueError: Length of 'prefix' (15) did not match the length of the columns being encoded (9).

虽然已经有很多人在 stackoverflow 和 sklearn 的 github issue 上讨论过这个问题,但目前为止的 sklearn 版本仍没有增加OneHotEncoder对字符串型类别变量的支持,所以一般都采用曲线救国的方式:

  • 方法一 :先用 LabelEncoder() 转换成连续的数值型变量,再用 OneHotEncoder() 二值化;
  • 方法二 :直接用 LabelBinarizer() 进行二值化;
import pandas as pd
#import Numpy as np
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import LabelBinarizer
from sklearn.preprocessing import MultiLabelBinarizer
col_names = ["age", "workclass", "fnlwgt", "education", "education-num", "marital-status", "occupation", 
             "relationship", "race", "sex", "capital-gain", "capital-loss", "hours-per-week", "native-country", "result"]
data = pd.read_csv("D://ML//Data//adult.csv", names=col_names)
#利用函数将文字标准化为tensorflow可以处理的数字
#OneHotEncoder(sparse = False).fit_transform( data[['age','education-num']] )
data['age']=LabelBinarizer().fit_transform(data['age'])
data['workclass']=LabelBinarizer().fit_transform(data['workclass'])
data['fnlwgt']=data['fnlwgt']/100
data['fnlwgt']=OneHotEncoder(sparse = False).fit_transform( data[['fnlwgt']] )
data['education']=LabelBinarizer().fit_transform(data['education'])
data['education-num']=LabelBinarizer().fit_transform(data['education-num'])
data['marital-status']=LabelBinarizer().fit_transform(data['marital-status'])
data['occupation']=LabelBinarizer().fit_transform(data['occupation'])
data['relationship']=LabelBinarizer().fit_transform(data['relationship'])
data['race']=LabelBinarizer().fit_transform(data['race'])
data['sex']=LabelBinarizer().fit_transform(data['sex'])
data['capital-gain']=LabelBinarizer().fit_transform(data['capital-gain'])
data['capital-loss']=LabelBinarizer().fit_transform(data['capital-loss'])
data['hours-per-week']=LabelBinarizer().fit_transform(data['hours-per-week'])
data['native-country']=LabelBinarizer().fit_transform(data['native-country'])
data['result']=LabelBinarizer().fit_transform(data['result'])

print(data[:10])

打印结果如下所示:

 age  workclass  fnlwgt  education  education-num  marital-status  \
0    0          0     0.0          0              0               0   
1    0          0     0.0          0              0               0   
2    0          0     0.0          0              0               1   
3    0          0     0.0          0              0               0   
4    0          0     0.0          0              0               0   
5    0          0     0.0          0              0               0   
6    0          0     0.0          0              0               0   
7    0          0     0.0          0              0               0   
8    0          0     0.0          0              0               0   
9    0          0     0.0          0              0               0   

   occupation  relationship  race  sex  capital-gain  capital-loss  \
0           0             0     0    1             0             1   
1           0             1     0    1             1             1   
2           0             0     0    1             1             1   
3           0             1     0    1             1             1   
4           0             0     0    0             1             1   
5           0             0     0    0             1             1   
6           0             0     0    0             1             1   
7           0             1     0    1             1             1   
8           0             0     0    0             0             1   
9           0             1     0    1             0             1   

   hours-per-week  native-country  result  
0               0               0       0  
1               0               0       0  
2               0               0       0  
3               0               0       0  
4               0               0       0  
5               0               0       0  
6               0               0       0  
7               0               0       1  
8               0               0       1  
9               0               0       1  

如果觉得本文写的还不错的伙伴,可以给个关注一起交流进步,如果有在找工作且对阿里感兴趣的伙伴,也可以发简历给我进行内推:
在这里插入图片描述

<think>嗯,用户想了解如何在机器学习中实现one-hot编码,并希望有示例。首先,我需要回忆一下one-hot编码的基本概念。记得它主要是将分类变量转换为二进制向量,每个类别对应一个唯一的二进制向量,其中只有一个位置是1,其余是0。比如,颜色有红、蓝、绿三种,红色可能被编码为[1,0,0],蓝色是[0,1,0],绿色是[0,0,1]。这样做的目的是为了让机器学习模型能够处理分类数据,因为很多模型不能直接处理文本标签。 接下来,用户需要具体的实现方法。首先想到的是使用Python的sklearn中的OneHotEncoder。可能需要先安装sklearn,不过通常用户可能已经安装了。然后,需要导入相关的模块,比如from sklearn.preprocessing import OneHotEncoder。接着,准备示例数据,可能是一个包含分类特征的二维数组,比如颜色和尺寸的数据集。 然后,需要初始化OneHotEncoder,并调用fit_transform方法来转换数据。这里要注意,OneHotEncoder默认返回的是稀疏矩阵,为了更直观显示,可能需要转换成密集矩阵。例如,data = [['红', '大'], ['蓝', '中'], ['绿', '小']],然后用encoder.fit_transform(data).toarray()得到编码后的数组。 另外,用户可能也需要知道如何还原特征名称,比如使用get_feature_names_out方法,这样可以知道每个二进制列对应的原始类别。例如,encoder.get_feature_names_out(['颜色', '尺寸'])会输出特征名称,如['颜色_红' '颜色_蓝' '颜色_绿' '尺寸_大' '尺寸_中' '尺寸_小'],这样用户就知道每个列代表什么了。 另外,可能需要提到另一种实现方式,比如使用pandas的get_dummies函数,这会更简单一些。例如,pd.get_dummies(df, columns=['颜色', '尺寸']),其中df是一个DataFrame。这种方法会自动为每个类别生成虚拟变量,但可能不适合在流水线中使用,因为sklearn的转换器更适用于构建可复用的流程。 还需要注意一些注意事项,比如高基类别的处理,如果类别数量太多,会导致维度爆炸,这时候可能需要其他方法,如特征哈希或嵌入层。另外,训练和测试数据要使用相同的编码器,避免数据不一致,可以用管道或者保存编码器实例。 最后,应用场景方面,用户可能想知道什么时候使用one-hot编码。比如,在逻辑回归、线性回归等需要数值输入的模型中,或者在处理类别型特征时,如用户性别、产品类别等。但也要提醒用户,对于树模型如随机森林,可能不需要one-hot编码,因为树模型可以处理类别特征。 现在需要将这些步骤整理成结构化的回答,分步骤说明,并给出示例代码。同时,生成相关问题,比如与其他编码方法的对比、处理新类别的方法、优缺点比较等。还要检查是否有遗漏的细节,比如稀疏矩阵的处理,或者如何处理训练集和测试集的一致性。确保引用正确,用户提供的引用[1]和[2]是关于one-hot编码的基本原理和应用,可以在回答中适当引用。</think>### 机器学习中One-Hot编码的实现方法及示例 #### 一、One-Hot编码的核心作用 One-Hot编码将分类变量(如颜色、尺寸)转换为二进制向量,使得每个类别对应唯一的向量(仅一个位置为1,其余为0)。例如,颜色类别`红、蓝、绿`可分别编码为$[1,0,0]$、$[0,1,0]$、$[0,0,1]$[^1]。 --- #### 二、实现步骤与代码示例 ##### 1. **使用`scikit-learn`的`OneHotEncoder`** **步骤:** 1. 导入工具包: ```python from sklearn.preprocessing import OneHotEncoder import pandas as pd ``` 2. **准备数据**: ```python data = [['红', '大'], ['蓝', '中'], ['绿', '小']] ``` 3. **初始化编码器并转换数据**: ```python encoder = OneHotEncoder(sparse_output=False) # 禁用稀疏矩阵 encoded_data = encoder.fit_transform(data) print(encoded_data) ``` **输出**: ``` [[1. 0. 0. 1. 0. 0.] [0. 1. 0. 0. 1. 0.] [0. 0. 1. 0. 0. 1.]] ``` 4. **还原特征名称**: ```python feature_names = encoder.get_feature_names_out(['颜色', '尺寸']) df_encoded = pd.DataFrame(encoded_data, columns=feature_names) ``` **结果**: ``` 颜色_红 颜色_蓝 颜色_绿 尺寸_大 尺寸_中 尺寸_小 1.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0 ``` --- ##### 2. **使用`pandas.get_dummies`简化实现** **示例**: ```python df = pd.DataFrame({'颜色': ['红', '蓝', '绿'], '尺寸': ['大', '中', '小']}) df_encoded = pd.get_dummies(df, columns=['颜色', '尺寸']) print(df_encoded) ``` **输出**: ``` 颜色_红 颜色_蓝 颜色_绿 尺寸_大 尺寸_中 尺寸_小 0 1 0 0 1 0 0 1 0 1 0 0 1 0 2 0 0 1 0 0 1 ``` --- #### 三、关键注意事项 1. **高基类别问题**: 若类别数量极多(如用户ID),会导致维度爆炸。此时可改用**特征哈希**或**嵌入层**(深度学习场景)[^2]。 2. **训练与测试数据一致性**: 需使用`encoder.fit_transform(train_data)`训练编码器后,用`encoder.transform(test_data)`处理测试集,避免类别不一致。 3. **稀疏矩阵优化**: 默认情况下,`OneHotEncoder`生成稀疏矩阵以节省内存。若需直接操作数据,可通过`sparse_output=False`关闭。 --- #### 四、应用场景 1. **模型适配性**: 适用于逻辑回归、支持向量机等需要数值输入的模型。 2. **类别型特征处理**: 如用户性别、产品类型、地区等离散特征--- §§ 1. One-Hot编码与标签编码(Label Encoding)有何区别?如何选择? 2. 如何处理One-Hot编码后出现的新类别(测试集包含训练集未出现的类别)? 3. 在高维稀疏场景下,One-Hot编码的替代方案有哪些? 4. 为什么树模型(如随机森林)通常不需要One-Hot编码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值