文章目录
前言
本篇整理连续特征离散化和离散特征编码的方法。
准备一份数据
import sklearn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 用于在notebook直接显示图片
%matplotlib inline
from sklearn import datasets
# 加载数据
data = datasets.load_wine()
# 提取自变量和响应变量
X, y = data.data, data.target
print(X.shape, y.shape)
#输出:(178, 13) (178,)
# 查看前两条自变量
X[:2]
#输出:
#array([[1.423e+01, 1.710e+00, 2.430e+00, 1.560e+01, 1.270e+02, 2.800e+00,
# 3.060e+00, 2.800e-01, 2.290e+00, 5.640e+00, 1.040e+00, 3.920e+00,
# 1.065e+03],
# [1.320e+01, 1.780e+00, 2.140e+00, #1.120e+01, 1.000e+02, 2.650e+00,
# 2.760e+00, 2.600e-01, 1.280e+00, #4.380e+00, 1.050e+00, 3.400e+00,
# 1.050e+03]])
数据预处理:连续特征离散化和类别特征编码
1. 连续特征二值化 Binarizer
设置一个阈值threshold,低于该阈值的数据被记为0,高于该阈值的数据被记为1。
例:
from sklearn.preprocessing import Binarizer
br = Binarizer(threshold=13)
X0_r = br.fit_transform([X[:,0]])
# 查看结果
print(X[:,0][20:25])
print(X0_r[0][20:25])
## 输出结果:
## [14.06 12.93 13.71 12.85 13.5 ]
## [1. 0. 1. 0. 1.]
2. 连续特征分箱 KBinsDiscretizer
将连续特征按一定规律分成多个组。函数为:
KBinsDiscretizer(n_bins, encode, strategy, dtype)
"""
n_bins: 分箱数。整数或array(长度等于待分箱的特征数), default=5;
encode : 编码方式。{'onehot', 'onehot-dense', 'ordinal'}, default='onehot';
strategy : 分组策略。{'uniform', 'quantile', 'kmeans'}, default='quantile';
dtype : 输出的数据类型。{np.float32, np.float64}, default=None(即和输入的数据类型一致)
"""
例1:采用kmeans聚类方法分箱,将前三列分别分成3、4、5组,并将结果通过’ordinal’方式编码。
kbd = KBinsDiscretizer(n_bins = [3,4,5], encode = 'ordinal', strategy='kmeans')
kbd.fit(X[:,0:3])
X_kbd = kbd.transform(X[:,0:3])
## 结果展示
X_kbd_df[0].unique()
# array([2., 1., 0.])
X_kbd_df[1].unique()
# array([0., 1., 2., 3.])
X_kbd_df[2].unique()
# array([2., 1., 3., 4., 0.])
例2:将第一列分成5组,并采用‘onehot’方式将分组结果编码。
kbd_2 = KBinsDiscretizer(n_bins = 5, encode = 'onehot', strategy='kmeans')
# 需要reshape将待分组数据转换为 1列的形式
kbd_2.fit(X[:,0].reshape(-1,1))
X_kbd_2 = kbd_2.transform(X[:,0].reshape(-1,1))
# 结果显示
print(X_kbd_2)
# 结果为一个稀疏矩阵的形式。
# (0, 4) 1.0
# (1, 2) 1.0
# (2, 2) 1.0
# (3, 4) 1.0
# (4, 2) 1.0
# ...
例3:如果encode为’onehot-dense’,则结果为一般的矩阵形式。
3. 类别特征编码 OneHotEncoder
由于示例数据均连续,我们构造一组类别特征。
import random
items = np.repeat(['male','female','other'],4)
random.shuffle(items) # 打乱顺序
# 结果
#array(['other', 'other', 'male', 'female', 'female', 'female', 'male', 'male', 'other', 'other', 'male', 'female'], dtype='<U6')
# 转换为列
from sklearn.preprocessing import OneHotEncoder
items = items.reshape(-1,1)
ohe = OneHotEncoder(handle_unknown='ignore')
ohe.fit(items)
ohe.transform(items).toarray()