您的位置:

深入解析onehot

一、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状态需要根据具体情况进行选择和优化。