My existence is not without reason!I know that i could be a quite a different person!
我的存在必定有意义!我知道我会成为一个与众不同的人!
基本概念
One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。
One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。
整数编码和One-Hot编码
假设我们有一个带有’red’和’green’值的标签序列。我们可以将’red’的整数值分配为0,’green’的整数值为1。只要我们总是将这些数字分配给这些标签,这称为整数编码。
我们可以创建一个二进制向量来表示每个整数值。对于2个可能的整数值,向量的长度为2。编码为0的“red”标签将用二进制向量[1,0]表示,其中第0个索引被标记为值1。然后,编码为1的“green”标签将用一个二进制向量[0,1],其中第一个索引被标记为1。
如果我们有序列:
‘red’,‘red’,‘green’
我们可以用整数编码来表示它:
0,0,1
而One-Hot编码就为:
[1,0],[1,0],[0,1]
编码优点
One hot 编码进行数据的分类更准确,许多机器学习算法无法直接用于数据分类。数据的类别必须转换成数字,对于分类的输入和输出变量都是一样的。
整数编码适用于在类别之间存在自然关系的问题,例如温度“冷”(0)和”热“(1)的标签。
当没有关系时,可能会出现问题,一个例子可能是标签的“狗”和“猫”。在这些情况下,我们想让网络更具表现力,为每个可能的标签值提供概率式数字。这有助于进行问题网络建模。当输出变量使用one-hot编码时,它可以提供比单个标签更准确的一组预测。
Python实现
# -*- coding: UTF-8 -*-
"""
Created on 18-1-2
@summary: One Hot 编码
@author: dreamhome
"""
import numpy as np
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelEncoder
data = ["a", "b", "c", "d", "b", "c"]
test = np.array(data)
print test
# 整数编码
label_encoder = LabelEncoder()
integer_result = label_encoder.fit_transform(test)
# One-Hot编码
one_hot_encoder = OneHotEncoder()
# One-Hot编码将分类值映射到整数值再表示成二进制向量
integer_result1 = integer_result.reshape(len(integer_result), 1)
one_hot_result = one_hot_encoder.fit_transform(integer_result1)
print "整数编码:"
print integer_result
print "One-Hot编码"
print one_hot_result.toarray()
# 逆编码
inverted = label_encoder.inverse_transform([np.argmax(one_hot_result[4, :])])
print inverted