一、onehot向量
1、onehot向量,也叫做one-of-k编码,将一个离散的类别变量映射为一个高维向量,具体来说就是将一个类别变量映射为一个只有一个元素为1,其他元素都为0的向量。
2、举个例子,假如现在有一个属性为{red, green, blue},那么它可以被映射为如下三个向量:[1, 0, 0], [0, 1, 0], [0, 0, 1]。
3、onehot向量常用于表示分类变量,如性别和学历等,方便模型计算。
二、one shot
1、与onehot向量类似的概念是one shot,它也是用来将类别变量映射成向量的方法。不同的是,onehot向量只有一个元素为1,其他为0,而one shot中,每个元素都可以是1或0。
2、继续以上面的颜色属性为例,one shot可以将红色映射为[1,0,0],浅红色映射为[1,1,0],黄色映射为[0,1,1]。
三、onehotencoder 用法
1、onehotencoder是sklearn里一个用来进行onehot编码的类。其用法如下:
from sklearn.preprocessing import OneHotEncoder # 假设我们的数据长这样 x = [['青岛', 22], ['济南', 21], ['青岛', 23], ['烟台', 20]] # 我们先对城市进行标签编码 from sklearn.preprocessing import LabelEncoder city_encoder = LabelEncoder() city_labels = city_encoder.fit_transform([row[0] for row in x]) # 再对城市进行onehot编码,要注意reshape一下 ohe = OneHotEncoder(categories='auto') x_city = ohe.fit_transform(city_labels.reshape(-1, 1)) # 将年龄和城市合并为一个矩阵 x_age = np.array([row[1] for row in x]).reshape(-1, 1) x1 = np.hstack((x_city.toarray(), x_age))
2、上面的代码中,我们先用LabelEncoder对青岛、济南、烟台进行了标签编码,将它们分别编码为0、1、2。接着我们用OneHotEncoder对城市进行了onehot编码,得到如下编码结果:
| 青岛 | 济南 | 烟台 | | :-----: | :-----: | :-----: | | 1 | 0 | 0 | | 0 | 1 | 0 | | 1 | 0 | 0 | | 0 | 0 | 1 |3、最后,我们把城市和年龄合并为一个矩阵,得到完整的样本:
| 青岛 | 济南 | 烟台 | 年龄 | | :---: | :---: | :---: | :---: | | 1 | 0 | 0 | 22 | | 0 | 1 | 0 | 21 | | 1 | 0 | 0 | 23 | | 0 | 0 | 1 | 20 |四、onehot code
1、实现一个简单的onehot编码的代码如下:
def one_hot_encoding(x): """ :param x: 输入列表 :return: onehot编码后的二维列表 """ unique_x = list(set(x)) encoding_map = {unique_x[i]: [0] * i + [1] + [0] * (len(unique_x)-i-1) for i in range(len(unique_x))} return [encoding_map[e] for e in x]
2、此代码可以输入任意一个列表,返回它的onehot编码结果。大致思路是先找出列表里的所有唯一值,然后用一个字典生成式来生成每个唯一值的对应编码,最后把整个列表每个元素都进行编码。
五、onehot状态
1、在实际应用中,onehot编码可能会因为离散类别数量过多而导致维度过高,进而影响模型效果。
2、还有一种情况是,如果本应该被当做一个整体来考虑的类别变量被拆开编码之后,可能会失去一些本应有的信息。
3、因此,onehot编码需要根据具体情况来判断是否适用,以及在使用时需要注意类别数量和编码方式的选择,既要保证有效表示信息,也要尽量避免维度灾难的影响。
六、onehot可以转换string
1、在sklearn中,我们可以用LabelEncoder将离散类别映射成数字,然后使用OneHotEncoder将数字转换成onehot向量;而在tensorflow中,我们可以使用tf.feature_column.categorical_column_with_vocabulary_list将离散类别映射成onehot向量。
2、例:
import tensorflow as tf # 假设我们有一个字符串向量 colors = tf.constant(['red', 'blue', 'green', 'green', 'yellow']) # 我们使用categorical_column_with_vocabulary_list生成一个特征列 colors_column = tf.feature_column.categorical_column_with_vocabulary_list(key='colors', vocabulary_list=['red', 'blue', 'green', 'yellow']) # 使用onehot_column将特征列转换成onehot向量 colors_onehot = tf.feature_column.indicator_column(colors_column) # 将向量输入到神经网络中 net = tf.layers.dense(inputs=tf.feature_column.input_layer({'colors': colors}), units=10)
3、上面的代码中,我们使用了categorical_column_with_vocabulary_list将字符串向量映射成了onehot向量,得到的结果与前面LabelEncoder和OneHotEncoder所得到的结果相同。
总结
本文对onehot从多个方面进行了深入阐述,包括onehot向量、one shot、onehotencoder 用法、onehot code、onehot状态和onehot可以转换string等方面。其中,onehot向量和onehotencoder是常用的应用方式,而onehot状态需要根据具体情况进行选择和优化。