把文本型、字符型数据转换成数值型的方法
labelencode
从名字上看,这是对标签进行编码,实际上可以对任何数据进行编码
作法很简单,就是将序列中不同值给个序号,以代表这个字符型数据。
示例代码
from sklearn.preprocessing import LabelEncoder # 标签专用 label = np.array(['好','不好','不好','好','不好','好','不好']) encoding=LabelEncoder() classes = encoding.fit_transform(label) # 把字符型特征转化成整型 print(encoding.classes_) # ['好','不好'] print(classes) # [1 0 0 1 0 1 0] label = encoding.inverse_transform(classes) # 还原 print(label)
上面把好与不好变成了0,1
这种方法简单,但是有很大问题。
思考以下问题:
比如特征是[‘鸡’,‘鸭’,‘鹅’],彼此之间完全独立,没有关联性和大小,
再如特征是[‘小学’,‘初中’,‘高中’],彼此之间不完全独立,有“大小”之分,小学<初中<高中,但彼此之间无法数据计算
又如特征是[‘<45’,‘<90’,‘<135’],彼此之间不完全独立,不仅有“大小”之分,彼此间也可以数据计算
单纯的变为 0 1 2,忽略了特征本身之间的联系,传达了不准确的信息,影响建模效果。
独热编码-onehot encode
也叫哑编码,就是用二进制来表示特征,生成稀疏矩阵。
作用
1. 转换成数值型
2. 解决labelencode的问题
3. 增加维度
示例代码
from sklearn.preprocessing import OneHotEncoder import numpy as np train = np.array([ [0, 1, 2], [1, 1, 0], [2, 0, 1], [3, 1, 1]]) one_hot = OneHotEncoder() one_hot = one_hot.fit(train) result = one_hot.transform([[1, 0, 1]]).toarray() print result # [[0. 1. 0. 0. 1. 0. 0. 1. 0.]] # print(one_hot.transform([[1, 0, 1]]).todense()) # 将结果保存起来 稀疏矩阵,转为密集矩阵 # print one_hot.inverse_transform(result) # 还原 # print one_hot.get_feature_names() ### 解释 # one column 0 1 2 3-->0 1 2 3 # two column 0 1-->0 1 # three column 0 1 2-->0 1 2 # 1 0 1 --> 1==> 0 1 0 0 # 0==> 1 0 # 1==> 0 1 0 ### test1 train = np.array([ ['0', 1, 2], ['1', 1, 0], ['2', 0, 1], ['3', 1, 1]]) one_hot = OneHotEncoder() one_hot.fit(train) print(one_hot.transform([['1', 0, 1]]).toarray()) # [[0. 1. 0. 0. 1. 0. 0. 1. 0.]] ### test2 train = np.array([ ['0', 'a', 2], ['1', 'a', 0], ['2', 'b', 1], ['3', 'a', 1]]) one_hot = OneHotEncoder() one_hot.fit(train) print(one_hot.transform([['1', 'b', 1]]).toarray()) # ValueError: could not convert string to float: a
sklearn中独热编码不能直接处理非数值的字符串,需要先根据 LableEncode 进行编码,再进行独热编码
二值化编码
很简单,设定阈值,大于为1,小于为0
from sklearn.preprocessing import Binarizer from sklearn.preprocessing import KBinsDiscretizer
具体用法请百度