python——机器学习:sklearn数据预处理preprocessing连续特征离散化和类别特征编码

前言

        本篇整理连续特征离散化和离散特征编码的方法。

准备一份数据

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()

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值