【机器学习技巧】之特征工程:数字编码以及One-hot独热编码的几种方式(sklearn与pandas处理方式)

简介: 【机器学习技巧】之特征工程:数字编码以及One-hot独热编码的几种方式(sklearn与pandas处理方式)

1. OneHot独热编码介绍


1.1 为什么要用One-hot编码?


在建模过程中,我们通常会碰到各种类型的属性,如果是标称型属性(非数值类型的属性),也就是不具备序列性、不能比较大小的属性,通常我们不能用简单的数值来粗暴替换。因为属性的数值大小会影响到权重矩阵的计算,不存在大小关系的属性,其权重也不应该发生相应的变化,那么我们就需要用到One-hot编码(也有人称独热编码)这种特殊的编码方式了。


1.2 One-hot举例


data = pd.DataFrame([
            [ 'M', 10.1], 
            [ 'L', 13.5], 
            [ 'XL', 15.3],
            [ 'XL', 16.3]])


One-hot编码后变为:

data = array([[0, 1, 0, 10.1],

[1, 0, 0, 13.5],

[0, 0, 1, 15.3],

[0, 0, 1, 16.3]])


1.3 One-hot使用范围


one-hot通常用在GBDT、XGBoost这些模型里面都挺好的,但是用在逻辑回归里不行。因为逻辑回归要求变量间相互独立,如果你只有一个属性需要做one-hot编码还好,如果你有多个属性需要做one-ont编码,那么当某个样本的多个one-hot属性同时为1时,这两个属性就完全相关了,必然会导致singular error,也就是非奇异矩阵不能求解唯一解,得不出唯一的模型,但是你又不可能把同一个属性的某一个one-hot延伸变量删除。


如果在逻辑回归中入模标称属性,可以直接替换成数值,然后做woe变换,用每个类别的woe值来代替原来的数值,这样既能够避免生成相关性强的变量,又能避开类别间大小无法比较的问题。


创建基础数据


import pandas as pd
import numpy as np
data = pd.DataFrame([
            ['yellow', 'M', 10.1, 'class1'], 
            ['red', 'L', 13.5, 'class2'], 
            ['blue', 'XL', 15.3, 'class1'],
            ['green', 'XL', 16.3, 'class3']])
data.columns = ['颜色', '大小', '价格', '类别标签']
data


image.png


2. sklearn机器学习中Onehot编码方式

2.1 将分类特征进行数字编码—LabelEncoder将分类特征数字化


from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
category = encoder.fit_transform(data['颜色'])
print("颜色编码:",category)
print("编码对应的颜色:",encoder.classes_)
颜色编码: [3 2 0 1]
编码对应的颜色: ['blue' 'green' 'red' 'yellow']


但是LabelEncoder一次只能处理一个属性,因此需要使用循环分别对属性进行处理


columns = ['颜色','大小','类别标签']
data2 = data.copy()
for column in columns:
    data2[column] = encoder.fit_transform(data[column])
    print("{}编码顺序:{}".format(column, encoder.classes_))
data2
颜色编码顺序:['blue' 'green' 'red' 'yellow']
大小编码顺序:['L' 'M' 'XL']
类别标签编码顺序:['class1' 'class2' 'class3']

image.png


2.2 Onehot编码方法一:LabelEncoder后使用OneHotEncoder


from sklearn.preprocessing import OneHotEncoder
columns = ['颜色','大小','类别标签']
enc = OneHotEncoder()
# 将['颜色','大小','类别标签']这3列进行独热编码
enc.fit_transform(data2[columns]).toarray()
array([[0., 0., 0., 1., 0., 1., 0., 1., 0., 0.],
       [0., 0., 1., 0., 1., 0., 0., 0., 1., 0.],
       [1., 0., 0., 0., 0., 0., 1., 1., 0., 0.],
       [0., 1., 0., 0., 0., 0., 1., 0., 0., 1.]])


2.3 Onehot编码方法二:直接对文本使用LabelBinarizer


LabelBinarizer 每次也只能对一个特征进行独热编码,需要使用循环对每个特征进行编码



from sklearn.preprocessing import LabelBinarizer
enc = LabelBinarizer()
transform_data = enc.fit_transform(data['颜色'])
transform_data
array([[0, 0, 0, 1],
       [0, 0, 1, 0],
       [1, 0, 0, 0],
       [0, 1, 0, 0]])
transform_data = enc.fit_transform(data['大小'])
transform_data
array([[0, 1, 0],
       [1, 0, 0],
       [0, 0, 1],
       [0, 0, 1]])


2.4 Onehot编码方法三:DictVectorizer


from sklearn.feature_extraction import DictVectorizer
dict = DictVectorizer(sparse=False)
dict_data= dict.fit_transform(data.to_dict(orient="records"))
dict_data
array([[10.1,  0. ,  1. ,  0. ,  1. ,  0. ,  0. ,  0. ,  0. ,  0. ,  1. ],
       [13.5,  1. ,  0. ,  0. ,  0. ,  1. ,  0. ,  0. ,  0. ,  1. ,  0. ],
       [15.3,  0. ,  0. ,  1. ,  1. ,  0. ,  0. ,  1. ,  0. ,  0. ,  0. ],
       [16.3,  0. ,  0. ,  1. ,  0. ,  0. ,  1. ,  0. ,  1. ,  0. ,  0. ]])
# 查看各列标签名称
dict.get_feature_names()
['价格',
 '大小=L',
 '大小=M',
 '大小=XL',
 '类别标签=class1',
 '类别标签=class2',
 '类别标签=class3',
 '颜色=blue',
 '颜色=green',
 '颜色=red',
 '颜色=yellow']


3. Pandas中Onehot编码方式


3.1 Pandas将分类特征进行数字编码方式–pd.factorize()


data_category, data_class = pd.factorize(data['大小'])
print(data_category)
print(data_class)
[0 1 2 2]
Index(['M', 'L', 'XL'], dtype='object')


3.2 Onehot编码–pd.get_dummies()


data_oneHot = pd.get_dummies(data)
• 1
data_oneHot


image.png


4. 总结


综合上述方法:


个人认为下面两种方式转化为One_hot类型特征最方便:


  1. sklearn中使用DictVectorizer
  2. Pandas中使用pd.get_dummies
相关文章
|
1月前
|
机器学习/深度学习 数据采集 数据可视化
Python数据科学实战:从Pandas到机器学习
Python数据科学实战:从Pandas到机器学习
|
5月前
|
机器学习/深度学习 数据可视化 搜索推荐
Python在社交媒体分析中扮演关键角色,借助Pandas、NumPy、Matplotlib等工具处理、可视化数据及进行机器学习。
【7月更文挑战第5天】Python在社交媒体分析中扮演关键角色,借助Pandas、NumPy、Matplotlib等工具处理、可视化数据及进行机器学习。流程包括数据获取、预处理、探索、模型选择、评估与优化,以及结果可视化。示例展示了用户行为、话题趋势和用户画像分析。Python的丰富生态使得社交媒体洞察变得高效。通过学习和实践,可以提升社交媒体分析能力。
93 1
|
2月前
|
机器学习/深度学习 数据采集 数据挖掘
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
因果推断方法为特征工程提供了一个更深层次的框架,使我们能够区分真正的因果关系和简单的统计相关性。这种方法在需要理解干预效果的领域尤为重要,如经济学、医学和市场营销。
86 1
特征工程在营销组合建模中的应用:基于因果推断的机器学习方法优化渠道效应估计
|
2月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
【Python篇】深入挖掘 Pandas:机器学习数据处理的高级技巧
100 3
|
5月前
|
机器学习/深度学习 人工智能
8个特征工程技巧提升机器学习预测准确性
8个特征工程技巧提升机器学习预测准确性
121 6
8个特征工程技巧提升机器学习预测准确性
|
4月前
|
机器学习/深度学习 SQL 数据采集
"解锁机器学习数据预处理新姿势!SQL,你的数据金矿挖掘神器,从清洗到转换,再到特征工程,一网打尽,让数据纯净如金,模型性能飙升!"
【8月更文挑战第31天】在机器学习项目中,数据质量至关重要,而SQL作为数据预处理的强大工具,助力数据科学家高效清洗、转换和分析数据。通过去除重复记录、处理缺失值和异常值,SQL确保数据纯净;利用数据类型转换和字符串操作,SQL重塑数据结构;通过复杂查询生成新特征,SQL提升模型性能。掌握SQL,就如同拥有了开启数据金矿的钥匙,为机器学习项目奠定坚实基础。
46 0
|
4月前
|
机器学习/深度学习 数据采集 算法
如何使用机器学习神器sklearn做特征工程?
如何使用机器学习神器sklearn做特征工程?
|
5月前
|
机器学习/深度学习 数据采集 大数据
驾驭大数据洪流:Pandas与NumPy在高效数据处理与机器学习中的核心作用
【7月更文挑战第13天】在大数据时代,Pandas与NumPy是Python数据分析的核心,用于处理复杂数据集。在一个电商销售数据案例中,首先使用Pandas的`read_csv`加载CSV数据,通过`head`和`describe`进行初步探索。接着,数据清洗涉及填充缺失值和删除异常数据。然后,利用`groupby`和`aggregate`分析销售趋势,并用Matplotlib可视化结果。在机器学习预处理阶段,借助NumPy进行数组操作,如特征缩放。Pandas的数据操作便捷性与NumPy的数值计算效率,共同助力高效的数据分析和建模。
109 3
|
5月前
|
机器学习/深度学习 数据采集 数据处理
重构数据处理流程:Pandas与NumPy高级特性在机器学习前的优化
【7月更文挑战第14天】在数据科学中,Pandas和NumPy是数据处理的关键,用于清洗、转换和计算。用`pip install pandas numpy`安装后,Pandas的`read_csv`读取数据,`fillna`处理缺失值,`drop`删除列。Pandas的`apply`、`groupby`和`merge`执行复杂转换。NumPy加速数值计算,如`square`进行向量化操作,`dot`做矩阵乘法。结合两者优化数据预处理,提升模型训练效率和效果。
75 1
|
4月前
|
机器学习/深度学习
机器学习中label如何实现多标签编码?
介绍了在机器学习中处理多标签分类问题时的一种标签编码方法。
69 0