机器学习 数据预处理之独热编码
1、什么是独热编码
让由0和1组成的占位符取表示每列特征,让不同样本之间相同特征之间的两两距离(两两差异)相同
例:
特征1 特征2 特征3数据集 1 3 27 5 41 8 67 1 9用独热编码表示: 1:10 3:0001 2:00017:01 1:0010 4:00105:0100 6:01008:1000 9:1000独热编码转换后:10 0001 000101 0100 0010 10 1000 010001 0001 1000
2、 作用
优点:独热编码解决了分类器不好处理属性数据的问题,在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。
缺点:当类别的数量很多时,特征空间会变得非常大,成为一个高维稀疏矩阵。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding(独热编码)+PCA这种组合在实际中也非常有用。
3、原理示例代码
import numpy as np
import sklearn.preprocessing as sp
raw_samples = np.array([[1, 3, 2],[7, 5, 4],[1, 8, 6],[7, 1, 9],
])# 找出每一列(特征)有多少种不同的取值
code_tables = []
for col in raw_samples.T:code_table = {} #空字典for val in col:code_table[val] = None #通过空字典去重 因为相同键会覆盖code_tables.append(code_table)
print(code_tables)for code_table in code_tables:size = len(code_table)for one,key in enumerate(sorted(code_table.keys())): #enumerate会生成给一个列表 返回索引和值code_table[key] = np.zeros(shape=size,dtype=int) #生成一个size大小(同列特征不同值个数)的0矩阵code_table[key][one] = 1 #把相应位置的0改为1
print(code_tables) #列类似于这样的列表[{1: array([1, 0]), 7: array([0, 1])}, {3: array([0, 1, 0, 0]), 5: array([0, 0, 1, 0]), 8: array([0, 0, 0, 1])]ohe_samples = []
for raw_sample in raw_samples:ohe_sample = np.array([],dtype=int) #创建一个举矩阵for i, key in enumerate(raw_sample): #返回一个列表 返回索引值和值ohe_sample = np.hstack((ohe_sample,code_tables[i][key])) #code_tables[i][key]获取第i列特征(这个列表中第i个字典)中键为数据中的键的对应的矩阵 对每列特征都会生成一个列表 然后水平拼接ohe_samples.append(ohe_sample) #独热编码转换后的列表
ohe_samples = np.array(ohe_samples) #转换为矩阵
print(ohe_samples)
4、调用库包代码
import numpy as np
import sklearn.preprocessing as spraw_samples = np.array([[1, 3, 2],[7, 5, 4],[1, 8, 6],[7, 1, 9],
])ohe = sp.OneHotEncoder(sparse=False, dtype=int) #非压缩格式 一般都False 独热编码器
new_sample = ohe.fit_transform(raw_samples)
print(new_sample)
samp = np.array([[7,5,4]])
ohe_samp = ohe.transform(samp) #根据上面生成的独热编码器预测
print(ohe_samp)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
