特征工程数据预处理--基于SK-learn的One-Hot编码

一,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 四种状态取值

特征工程数据预处理--基于SK-learn的One-Hot编码_第1张图片

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


你可能感兴趣的:(机器学习)