离散特征的转码选择【OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummies】

文章目录

前言

最近在复盘一些机器学习项目时发现,在一些案例中对于离散特征转码方案的选择存在一些问题。故在此记录一些重要的点,以防止遗忘。对于想要了解详细内容的同学,推荐去看这一篇博客离散数据编码方式总结

一、转码方案的选择

在之前的一些数据分析以及数据挖掘案例中,常将离散特征转码分为0-1编码和哑变量两种,在选择方案时忽略了一些细节。
在这里将离散特征进行转码的方案分为以下两种:

进行数值编码
适用准则:离散特征的取值之间存在大小、层级的关系,比如收入:[高、中、低];机票的仓位等级:[头等舱、经济舱】等。
进行OneHot编码
适用准则:离散特征的取值之间不存在大小、层级等可进行数值比较的关系,比如性别:[男、女];是否有女朋友:[N,Y]等。

二、如何实现

这里仅对sklearn和Python中的常用实现方案进行记录:

1 进行数值编码

  • sklearn.preprocessing.LabelEncoder()
  • sklearn.preprocessing.OrdinalEncoder()
  • map函数映射

2 OneHot编码

  • sklearn.preprocessing.OneHotEncoder()
  • pd.get_dummies()

下面通过pandas创建一些数据来演示一下操作,具体原理就不这里记录了:

import numpy as np
import pandas as pd
demo = pd.DataFrame(data=
                    {'Sex':['male','female','male','female','male'],
                     'Salary':['high','low','median','high','low'],
                   'Target':[1,0,1,0,1] })

离散特征的转码选择【OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummies】
这里的Sex代表性别,Salary代表工资,Target代表标签
通过前面转码方案的描述需要对Sex进行Onehot编码,对收入进行数值编码,这里的Target主要是用来说明LabelEncoder的用法

Sex: Onehot编码
pd.get_dummies()的方法:

from sklearn.preprocessing import OrdinalEncoder,OneHotEncoder,LabelEncoder
res1 = pd.get_dummies(demo['Sex'],columns = np.unique(demo['Sex'].values))
res1

转码后的结果:

离散特征的转码选择【OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummies】
OneHotEncoder()的方法:
onehot = OneHotEncoder(sparse=False)
res2 = onehot.fit_transform(demo['Sex'].values.reshape(-1,1))
res2 = pd.DataFrame(res2,columns=['female','male'])
res2

转码后的结果:

离散特征的转码选择【OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummies】
Salary:数值编码
OrdinalEncoder():
res3 = OrdinalEncoder().fit_transform(demo['Salary'].values.reshape(-1, 1))
res3 = pd.DataFrame(res3,columns = ['Salary'])
res3

转码后的结果:

离散特征的转码选择【OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummies】
Target:标签转码
LabelEncoder()
这个例子中的Target其实无需进行转码,但是需要记住的是如果需要对label(非特征)进行编码,使用LabelEncoder(),编码后的值为0 and n_classes-1
res4 = LabelEncoder().fit_transform(demo['Target'].values.reshape(-1,1))
res4 = pd.DataFrame(res4,columns=['Target'])
res4

转码后的结果:

离散特征的转码选择【OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummies】
最后将转码后的特征进行合并就可以了
demo = pd.concat([res1,res3,res4],axis = 1)
demo

结果如下:

离散特征的转码选择【OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummies】

总结

以上是对离散特征的转码选择的一些个人总结。

Original: https://blog.csdn.net/weixin_43819931/article/details/124278253
Author: Simon Toxic
Title: 离散特征的转码选择【OneHotEncoder、LabelEncoder、OrdinalEncoder、get_dummies】

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/696822/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球