[机器学习与scikit-learn-12]:数据预处理-5-重新编码:特征的二值化、oneHot编码

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/123263129


目录

第1章 重新编码概述

1.1 概述

1.2 种类

第2章  特征的二值化:preprocessing.Binarizer

2.1 概述

2.2 案例

第3章 特征的分段:preprocessing.KBinsDiscretizer

3.1 概述

3.2 代码实例

第4章 分类特征编码

4.1 概述

4.2 sklearn支持的方法

4.3 案例:LabelEncoder

4.4 案例:OrdinalEncoder

4.5 案例:OneHotEncoder : 数值=》oneHot

4.6 案例:OneHotEncoder : 字符串=》oneHo


第1章 重新编码概述

1.1 概述

有时候,原始样本数据的值格式,并非是模型期望的数据形式,并非通过线性和非线性变换可以进行实现,这时候,需要对原始数据,进行重新编码,编码模型所需要的数据格式,这就是本章要探讨的问题。

1.2 种类

(1)特征的二值化:把原始数据转换成0和1.

(2)特征的分段化:把原始数据转换成多分段

(3)OneHot编码:把非数值型的分类字符型串行数据,转换成oneHot编码的数值型数据。

第2章  特征的二值化:preprocessing.Binarizer

2.1 概述

特征二值化是将数值特征值用阈值过滤,得到布尔值的过程。

根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。

大于阈值的值映射为1,而小于或等于阈值的值映射为0。

默认阈值为0时,特征中所有的正值都映射到1。映射后,所有的数据,变成了0或1

二值化是对文本计数数据的常见操作,分析人员可以决定仅考虑某种现象的存在与否。它还可以用作考虑布尔随机变量的估计器的预处理步骤(例如,使用贝叶斯设置中的伯努利分布建模)。

2.2 案例

from sklearn import preprocessing

X = [[ 1., -1., 0.5],
[ 2., 0., 0.],
[ 0., 1., -1.]]

binarizer = preprocessing.Binarizer()
binarizer.fit(X)
binarizer.transform(X)
array([[1., 0., 1.],
       [1., 0., 0.],
       [0., 1., 0.]])

默认门限值为0,正数转换成1,负数转换成0

把每一行当作一个样本,每一列当作一个特征.

当然,进行分割0和1的threshold的数值是可以设置的:

binarizer = preprocessing.Binarizer(threshold=1)
binarizer.fit(X)
binarizer.transform(X)
array([[0., 0., 0.],
       [1., 0., 0.],
       [0., 0., 0.]])

第3章 特征的分段:preprocessing.KBinsDiscretizer

3.1 概述

除了可以进行0和1的二分隔,还可以进行分段,把将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分段编码。

总共包含三个重要参数:

[机器学习与scikit-learn-12]:数据预处理-5-重新编码:特征的二值化、oneHot编码_第1张图片

分段的规则:在最大值和最小值间,按照等分的原则,把所有数据分为指定的等分数。

3.2 代码实例

from sklearn.preprocessing import KBinsDiscretizer
#X = data.iloc[:,0].values.reshape(-1,1)

X = [[ 20., -10., 0.5],
[ 2., 4., 10.],
[ 10., 1., -10.]]
print("原始数据\n",X)


# 分段:普通数值编码
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
X1 = est.fit_transform(X)
print("\n分段:普通编码\n",X1)

#查看转换后分的箱:变成了一列中的三箱
#set(est.fit_transform(X).ravel())
# 分段:OneHot数值编码
est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')
#查看转换后分的箱:变成了哑变量
X2 = est.fit_transform(X).toarray()
print("\n分段:OneHot编码\n",X2)
原始数据
 [[20.0, -10.0, 0.5], [2.0, 4.0, 10.0], [10.0, 1.0, -10.0]]

分段:普通编码
 [[2. 0. 1.]
 [0. 2. 2.]
 [1. 2. 0.]]

分段:OneHot编码
 [[0. 0. 1. 1. 0. 0. 0. 1. 0.]
 [1. 0. 0. 0. 0. 1. 0. 0. 1.]
 [0. 1. 0. 0. 0. 1. 1. 0. 0.]]

第4章 分类特征编码

4.1 概述

在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导入文字型数据(其实手写决策树和普斯贝叶斯可以处理文字,但是sklearn中规定必须导入数值型)。

然而在现实中,许多标签和特征在数据收集完毕的时候,都不是以数字来表现的。比如说,学历的取值可以是["小学",“初中”,“高中”,"大学"],付费方式可能包含["支付宝",“现金”,“微信”]等等。在这种情况下,为了让数据适应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型。

为了解决这个问题,我们可以使用一种叫做"one-of-K"或称做"one-hot"(独热)的编码方式。即两
个特征值来进行编码性别[1,0]表示"male",而[0,1]表示"female"。

通常使用"one-hot"方式编码后会增加数据的维度和稀疏性。

4.2 sklearn支持的方法

(1)preprocessing.LabelEncoder:标签专用,能够将分类标签转换为分类数值

(2)preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值

(3)preprocessing.OneHotEncoder:独热编码

4.3 案例:LabelEncoder

#普通编码:字符串转普通分类数值编码
import numpy as np 
from sklearn import preprocessing

Y = [["A"], 
     ["B"], 
     ["C"], 
     ["D"]]

# 把每一行当作一个样本,每一列当作一个标签,
# 一共有4种标签
#Y = np.array(Y)

print("原始标签:\n", Y)
onehot = preprocessing.LabelEncoder()

# 将稀疏矩阵转化为普通矩阵
Y = onehot.fit_transform(Y)
print("\n普通编码后的标签:\n", Y)
原始标签:
 [['A'], ['B'], ['C'], ['D']]

普通编码后的标签:
 [0 1 2 3]

4.4 案例:OrdinalEncoder

#普通编码:字符串转普通分类数值编码
import numpy as np 
from sklearn import preprocessing

X = [["A", "A", "A"], 
     ["B", "B", "B"], 
     ["A", "C", "C"], 
     ["B", "B", "D"]]

# 把每一行当作一个样本,每一列当作一个特征
# 第1列:2个特征值:A, 1 
# 第2列:3个特征值:0, 1, 2
# 第3列:4个特征值:0, 1, 2, 3
X = np.array(X)  

print("原始特征:\n", X)
onehot = preprocessing.OrdinalEncoder()

# 将稀疏矩阵转化为普通矩阵
X = onehot.fit_transform(X)
print("\n编码后特征:\n", X)
原始特征:
 [['A' 'A' 'A']
 ['B' 'B' 'B']
 ['A' 'C' 'C']
 ['B' 'B' 'D']]

编码后特征:
 [[0. 0. 0.]
 [1. 1. 1.]
 [0. 2. 2.]
 [1. 1. 3.]]

4.5 案例:OneHotEncoder : 数值=》oneHot

#one hot编码:  普通数字转oneHot编码
import numpy as np 
from sklearn import preprocessing

X = [[0., 0., 0.],
     [1., 1., 1.],
     [0., 2., 2.],
     [1., 1., 3.]]

#把每一行当作一个样本,每一列当作一个特征
#第1列:2个特征值:0, 1 
#第2列:3个特征值:0, 1, 2
#第3列:4个特征值:0, 1, 2, 3
Y = np.array(X)  

print(Y)
onehot = preprocessing.OneHotEncoder()

#将稀疏矩阵转化为普通矩阵
onehot.fit_transform(Y).toarray() 
[[0. 0. 0.]
 [1. 1. 1.]
 [0. 2. 2.]
 [1. 1. 3.]]

Out[71]:

array([[1., 0., 1., 0., 0., 1., 0., 0., 0.],
       [0., 1., 0., 1., 0., 0., 1., 0., 0.],
       [1., 0., 0., 0., 1., 0., 0., 1., 0.],
       [0., 1., 0., 1., 0., 0., 0., 0., 1.]])

OneHot编码会把原先的每列的特征数据,编码成oneHot编码。

备注:标识规则为自左向右。

如:  0 => 1, 0;   1 => 0, 1

4.6 案例:OneHotEncoder : 字符串=》oneHot

#one hot编码:字符串转OneHot编码
import numpy as np 
from sklearn import preprocessing

X = [["A", "A", "A"], 
     ["B", "B", "B"], 
     ["A", "C", "C"], 
     ["B", "B", "D"]]

#把每一行当作一个样本,每一列当作一个特征
#第1列:2个特征值:A, B 
#第2列:3个特征值:A, B, C
#第3列:4个特征值:A, B, C, D
Y = np.array(X)  

print(Y)
onehot = preprocessing.OneHotEncoder()

#将稀疏矩阵转化为普通矩阵
onehot.fit_transform(Y).toarray() 
[['A' 'A' 'A']
 ['B' 'B' 'B']
 ['A' 'C' 'C']
 ['B' 'B' 'D']]

Out[72]:

array([[1., 0., 1., 0., 0., 1., 0., 0., 0.],
       [0., 1., 0., 1., 0., 0., 1., 0., 0.],
       [1., 0., 0., 0., 1., 0., 0., 1., 0.],
       [0., 1., 0., 1., 0., 0., 0., 0., 1.]])

备注:标识规则为自左向右。

如:  A => 1, 0;   B => 0, 1


作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/123263129

你可能感兴趣的:(机器学习,scikit-learn,sklearn,预处理,编码)