这几个玩意儿对于一个小白来说,真的被绕死了。
先来一个别人的解释
https://www.jianshu.com/p/2a30846eb4f0
小白总结一下个人理解的,分类变量编码转换方法:
LabelEncoder
LabelEncoder可以将值转换为0~n-1个类型,也可以用来将非数值的标签转换为数值标签(需要确保非数值标签是可比的和可哈希的)
即,将类型变量转换为数值组成的数组。产生结果为连续型特征。
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
y=["paris", "paris", "tokyo", "amsterdam"]
y_le = le.fit_transform(y)
print('=========y_le is========= ')
print(y_le)
print('=========classes is========= ')
print(list(le.classes_))
得到的结果为:
=========y_le is=========
[1 1 2 0]
=========classes is========= 标签列表
['amsterdam', 'paris', 'tokyo']
OneHotEncoder
将数值类型属性转换成独热编码的数值型数组。使用LabelEncoder会以为两个相近的数字比两个较远的数字更为相似一些,为了解决这个问题,使用独热编码,即OneHot编码,得到的输出结果默认是稀疏矩阵,可以使用toarray()方法完成转换。
label_binarize
from sklearn.preprocessing import label_binarize
label_binarize(y, classes, neg_label=0, pos_label=1, sparse_output=False)
固定类别数量的标签转换(1.受到classes顺序的影响;2.如果某类不存在,则相应位置为0)
例如:
from sklearn.preprocessing import label_binarize
array=label_binarize([1, 6], classes=[1, 2, 4, 6])
print('=========array is========= ')
print(array)
array1=label_binarize([1, 6], classes=[1, 6, 4, 2])
print('=========array1 is========= ')
print(array1)
得到的结果为:
=========array is=========
[[1 0 0 0]
[0 0 0 1]]
=========array1 is=========
[[1 0 0 0]
[0 1 0 0]]
LabelBinerizer
from sklearn.preprocessing import LabelBinarizer
y_bina=LabelBinarizer().fit_transform(y)
LabelBinarizer将标签二值化为一对多的形式。默认直接返回一个密集的NumPy数组,通过使用sparse_output=True给LabelBinarizer构造函数,可以得到稀疏矩阵。与label_binarize结果形式一致,只是不固定标签数量,以传入的标签为准。
总结
LabelEncoder:将类型变量转换为数值组成的数组。
LabelBinerizer:将标签二值化为一对多的形式。不限定类别数量,取输入标签的类别
label_binarize:将标签二值化为一对多的形式。限定类别数量。如果某类别在所有标签中均未出现,则对应未知为0
在标签数量一致的情况下,LabelBinerizer 和 label_binarize 的结果是一样的。如果已知标签数量,但是输入的标签样本不全,那么最好使用label_binarize,若使用 LabelBinerizer,则未在标签样本中出现的标签值会不被识别
即:
n_class = len(set(y)) # 类别数量
le = LabelEncoder()
y_le = le.fit_transform(y)
y_bina=LabelBinarizer().fit_transform(y)
y_bina1 = label_binarize(y_le, np.arange(n_class))
结果:
y_bina = y_bina
网友评论