一,One-Hot编码概念:
在数据处理和特征工程中,经常会遇到类型数据,如性别分为[男,女](暂不考虑其他。。。。),国家分为[中国,日本,美国]等,我们通常将其转为数值带入模型,如[0,1], [1,0,-1]等,但模型往往默认为连续型数值进行处理,这样其实是违背我们最初设计的,也会影响模型效果。
独热编码便是解决这个问题,其方法是使用N位bit来对N个状态进行编码,每个状态都由他独立的bit位,并且在任意时候,其中只有一位有效(只有一个bit是1)。
如自然编码为:0,1
独热编码为:10,01
可以理解为对有m个取值的特征,经过独热编码处理后,转为m个二元特征,每次只有一个激活。
如数字字体识别0~9中,6的独热编码为:
0000 0010 00(下标index = 6 的bit位被激活,=1)
二,基于scikit-learn的One-Hot 编码示例
import numpy as np
import pandas as pd
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
#一个4行3列的数组,即有4个样本,3个特征;
print(enc.n_values_)
#每个特征的取值个数(第一列共有2个取值,第二列有3个,第三列有4个)
#输出:array([2, 3, 4])
print(enc.feature_indices_)
#独热编码后每个特征开始和结束的下标;
#输出:array([0, 2, 5, 9])
print(enc.transform([[1,0,2]]).toarray())
#对新拿到的[0,1,1]做独热编码,即有第一列是[1,0],第二列是[0,1,0]
#第三列是[0,1,0,0],所以最终拼在一起得到它的独热编码就是[1,0,0,1,0,0,1,0,0]
#output:array([[ 1., 0., 0., 1., 0., 0., 1., 0., 0.]])
三,用图片形式表示
print(enc.n_values_)
#每个特征的取值个数(第一列共有2个取值,第二列有3个,第三列有4个)
#输出:array([2, 3, 4])
对应array[2,3,4]
第一列有 0,1 两种状态取值
第二列有0,1,2,三种状态取值
第三列有0,1,2,3 四种状态取值
print(enc.transform([[0,1,2]]).toarray())
#对新拿到的[0,1,2]做独热编码,即有第一列是[1,0],第二列是[0,1,0]
#第三列是[0,0,1,0],所以最终拼在一起得到它的独热编码就是[1,0,0,1,0,0,0,1,0]
#output:array([[ 1. 0. 0. 1. 0. 0. 0. 1. 0.]])
即:[0,1,2]
print(enc.feature_indices_)
#独热编码后每个特征开始和结束的下标;
#输出:array([0, 2, 5, 9]), 0,2,5分别就是上面第一个数字编码,第二个数字编码,第三个数字编码起始的index