作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_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)特征的二值化:把原始数据转换成0和1.
(2)特征的分段化:把原始数据转换成多分段
(3)OneHot编码:把非数值型的分类字符型串行数据,转换成oneHot编码的数值型数据。
特征二值化是将数值特征值用阈值过滤,得到布尔值的过程。
根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。
大于阈值的值映射为1,而小于或等于阈值的值映射为0。
默认阈值为0时,特征中所有的正值都映射到1。映射后,所有的数据,变成了0或1
二值化是对文本计数数据的常见操作,分析人员可以决定仅考虑某种现象的存在与否。它还可以用作考虑布尔随机变量的估计器的预处理步骤(例如,使用贝叶斯设置中的伯努利分布建模)。
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.]])
除了可以进行0和1的二分隔,还可以进行分段,把将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分段编码。
总共包含三个重要参数:
分段的规则:在最大值和最小值间,按照等分的原则,把所有数据分为指定的等分数。
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.]]
在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导入文字型数据(其实手写决策树和普斯贝叶斯可以处理文字,但是sklearn中规定必须导入数值型)。
然而在现实中,许多标签和特征在数据收集完毕的时候,都不是以数字来表现的。比如说,学历的取值可以是["小学",“初中”,“高中”,"大学"],付费方式可能包含["支付宝",“现金”,“微信”]等等。在这种情况下,为了让数据适应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型。
为了解决这个问题,我们可以使用一种叫做"one-of-K"或称做"one-hot"(独热)的编码方式。即两
个特征值来进行编码性别[1,0]表示"male",而[0,1]表示"female"。
通常使用"one-hot"方式编码后会增加数据的维度和稀疏性。
(1)preprocessing.LabelEncoder:标签专用,能够将分类标签转换为分类数值
(2)preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值
(3)preprocessing.OneHotEncoder:独热编码
#普通编码:字符串转普通分类数值编码
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]
#普通编码:字符串转普通分类数值编码
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.]]
#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
#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