简单来说 LabelEncoder 是对不连续的数字或者文本进行编号(连续的会是同一个编号)
分类,但有排序逻辑关系,等级上高于定类。 比如,学历分小学,初中,高中,本科,研究生, 各个类别之间存在一定的逻辑,显然研究生学历是最高的,小学最低。 这时候使用Label encoding会显得更合适, 因为自定义的数字顺序可以不破坏原有逻辑,并与这个逻辑相对应。from sklearn.preprocessing import LabelEncoder le = LabelEncoder() le.fit([1,5,67,100]) le.transform([1,1,100,67,5]) 输出: array([0,0,3,2,1])#有顺序的
OneHotEncoder 用于将表示分类的数据扩维: (one-hot encoding 独热编码(哑变量))
纯分类,不排序,没有逻辑关系。比如性别分男和女,男女不存在任何逻辑关系, 我们不能说男就比女好,或者相反from sklearn.preprocessing import OneHotEncoder ohe = OneHotEncoder() ohe.fit([[1],[2],[3],[4]]) ohe.transform([2],[3],[1],[4]).toarray() 输出:[ [0,1,0,0] , [0,0,1,0] , [1,0,0,0] ,[0,0,0,1] ]
One-Hot实际案例
————————————————————————————————————————
就拿上面的例子来说吧,性别特征:["男","女"],按照N位状态寄存器来对N个状态进行编码的原理,咱们处理后应该是这样的(这里只有两个特征,所以N=2):
男 => 10
女 => 01
祖国特征:["中国","美国,"法国"](这里N=3):
中国 => 100
美国 => 010
法国 => 001
运动特征:["足球","篮球","羽毛球","乒乓球"](这里N=4):
足球 => 1000
篮球 => 0100
羽毛球 => 0010
乒乓球 => 0001
所以,当一个样本为["男","中国","乒乓球"]的时候,完整的特征数字化的结果为:
[1,0,1,0,0,0,0,0,1]
下图可能会更好理解:
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0,0,3],
[1,1,0],
[0,2,1],
[1,0,2]]) #这里一共有4个数据,3种特征
array = enc.transform([[0,1,3]]).toarray() #这里使用一个新的数据来测试
print array # 1 0 / 0 1 0 / 0 0 0 1