在机器学习进行数据预处理的时候,通常会对一些数据进行特征离散化处理,即将文本或者其他内容进行使用数字替代,方便后续的操作。在离散特征的时候,需要注意以下几点:
1 离散特征的取值之间没有大小的意义,比如color:[green,blue],那么就使用one-hot编码,形成一个N阶的方阵,此处的N与属性中的不重复特征数目一致。
2 离散特征的取值有大小的意义,比如size:[X,XL,XXL],那么就使用数值的映射{X:1,XL:2,XXL:3}说明:对于有大小意义的离散特征,直接使用映射就可以了,{'XL':3,'L':2,'M':1}
下面使用 Pandas 中的 get_dummies()进行one-hot 当然还可以使用 Sklearn库中的进行编码。
# -*-coding=utf-8-*- import pandas as pd df = pd.DataFrame([ ['yellow', 'M', 12.1, 'class1'], ['red', 'L', 15.8, 'class2'], ['blue', 'XL', 17.6, 'class1']]) df.columns = ['color', 'size', 'prize', 'class label'] size_mapping = {'XL': 3,'L': 2,'M': 1} df['size'] = df['size'].map(size_mapping)#将 size映射为 3,2,1 #根据set(df['class label'])将df['class label']中重复数据据去除 # enumerate(set(df['class label'])) 返回数据索引和数据 class_mapping = {label: idx for idx, label in enumerate(set(df['class label']))} df['class label'] = df['class label'].map(class_mapping) print('-----------未进行One-hot编码 注意颜色列---------------') print(df) print('-----------进行One-hot编码 注意颜色列--------------------') df = pd.get_dummies(df) print(df) 运行结果为:
使用 One-hot编码是让特征变位稀疏矩阵,如下的代码示例:
import pandas as pd import numpy as np s = pd.Series(list('abca')) print(pd.get_dummies(s)) s1 = ['a', 'b', np.nan] print(pd.get_dummies(s1)) print(pd.get_dummies(s1, dummy_na=True))#设置显示 Nan
运行结果:
下面进行只编码前两列
import pandas as pd df = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': ['b', 'a', 'c'], 'C': [1, 2, 3]}) #只对 前两列进行编码prefix=[args],根据args的数目进行编码 如果只有一个则只编码第一列 t=pd.get_dummies(df, prefix=['A','B']) print(t)