真值转换
一、分类数据和顺序数据
-
分类数据:
分类数据☞某些数据属性只能归于某一类别的非数值型数据。例如性别中的男、女就是分类数据。分类数据中的值没有明显的高、低、大、小等包含等级、顺序、排序、好坏等逻辑的划分,只是用来区分两个或多个具有相同或相同价值的属性。 -
顺序数据:
顺序数据☞能归于某一有序类别的非数值型数据,例如用户的价值度分为高、中、低,学历分为博士、硕士、学士,这些都属于顺序数据。在顺序数据中,有明显的的排序规律和逻辑层次的划分。
二、运用标志方法处理分类和顺序变量
分类数据和顺序数据要参与模型计算,通常都会转化为数值型数据。当然,某些算法是允许这些数据直接参与计算的,例如分类算法中的决策树、关联规则等。将非数值型数据转换为数值型数据的最佳方法是:将所有分类或顺序变量的值域从一列多值的形态转为多列只包含真值的形态,其中的真值可用True,False或0,1的方式来表示。这种标志转换的方法有时候也称真值转换。
以用户性别变量举例,原有的用户数据为:
用户 | 性别 |
---|---|
张三 | 男 |
李四 | 女 |
王五 | 未知 |
经过转换后的数据格式为:
用户 | 性别男 | 性别女 | 性别未知 |
---|---|---|---|
张三 | 1 | 0 | 0 |
李四 | 0 | 1 | 0 |
王五 | 0 | 0 | 1 |
为什么不能直接用数字来表示不同的分类和顺序数据,而一定要做真值转换?这是因为在用数字直接表示分类和顺序变量的过程中,无法准确还原不同类别信息之间的信息差异和相互关联性。
- 针对分类数据:性别变量的属性值是男和女,无论用什么值来表示都无法表达出两个值的价值相等且带有区分的含义。如果用1和2区分,那么1和2本身已经带有距离为1的差异,但实际上二者是不具有这种差异性的,其他任意数字都是如此;如果用相同的数字来表示,则无法达到区分的目的。
- 针对顺序数据:学历变量的属性值是博士、硕士和学士,可以用3-2-1来表示顺序和排序关系,那么为什么是3-2-1,而不是30-20-10或者其他可以表示顺序关系的数字?因此,任何一个有序数字的排序也都无法准确表达出顺序数据的差异性。
三、代码实现:
这里解释一下独热编码:
独热编码即OneHot编码,又称一位有效编码,其方法是使用N为状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。
简单来说,对于某一个特征,如果他的值域有m个值,那么经过独热编码后,就变成了m个特征,并且这些特征之间互斥,每一个特征只有一个是生效状态。
- 引包
[1]:import pandas as pd
from sklearn.preprocessing import OneHotEncoder
- 制造数据
[2]:df = pd.DataFrame({
'id':[1,2,3],
'sex':['male','female','female'],
'level':['high','low','middle'],
'score':[1,2,3]
})
df
3. 分开需要独热编码的特征
[3]:id_data = df["id"]
raw_convert_data = df.iloc[:,1:]
raw_covnvert_data
方法一:
[4]:model_enc = OneHotEncoder() # 实例化
df_new2 = model_enc.fit_transform(raw_convert_data).toarray() # 独热编码转换
df_new2
[5]:df_all = pd.concat((id_data,pd.DataFrame(df_new2)),axis=1) # 合并ID和编码后特征
df_all.columns = ['id','female','male','high','low','middle','score_1','score_2','score_3']
df_all
方法二:
[6]:df_new3 = pd.get_dummies(raw_convert_data)
df_new3
[7]:df_all2 = pd.concat((id_data,df_new3),axis=1)
df_all2
Pandas的get_dummies方法仅对object和category类型的列做转换,因此在上面示例中,score列虽然也是分类或顺序意义的变量,但不会转换。
参考资料:《Python数据分析与数据化运营》
关联文章:
数据预处理Part1——数据清洗
数据预处理Part2——数据标准化
数据预处理Part4——数据离散化
数据预处理Part5——样本分布不均衡
数据预处理Part6——数据抽样
数据预处理Part7——特征选择
数据预处理Part8——数据共线性
数据预处理Part9——数据降维