使用sklearn进行数据预处理之Binarizer,LabelEncoder,LabelBinarizer,OneHotEncoder

本文详细介绍使用sklearn进行数据预处理的方法,包括Binarizer的阈值转换、LabelEncoder的类别编码、LabelBinarizer的二进制编码及OneHotEncoder的独热编码。通过实例展示各类编码器的应用场景和限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言
数据预处理的过程中经常需要对数据进行数值化等处理,比如将性别男女转换为计算机可以理解的1和0,还有将数值化的1,2,3,4,5按照阈值3转换为0,0,0,1,1等,下面介绍一下sklearn提供的类。

Binarizer
这个就是根据阈值将数值型转变为二进制型,阈值可以进行设定,另外只能对数值型数据进行处理,且传入的参数必须为2D数组,也就是不能是Series这种类型,shape为(m,n)而不是(n,)类型的数组,下面看下例子

df = DataFrame(np.arange(12).reshape(4,3),columns=['A','B','C'])
df
第一列为索引值
A   B   C
0   0   1   2
1   3   4   5
2   6   7   8
3   9   10  11
将小于等于5的数值转为0,大于5的转为1

binarize = Binarizer(threshold=5)
binarize.fit_transform(df)
array([[0, 0, 0],
       [0, 0, 0],
       [1, 1, 1],
       [1, 1, 1]])
也可以传入df[['A','B']]来对两列进行转换,注意,不可以是df['A']或者df.A,因为df.A是Series不是二维的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
LabelEncoder
可以将数据(类别型或者数值型都可以)转换为一个整数值,比如讲高中低转换为0,1,2,假设特征的取值类别有n种,那么转换到的范围就是[0:n],LabelEncoder的输入必须是个一维的数组,如Series这种格式,如果是DataFrame则会报错,看个例子

df['B'] = ['a','b','c','d']
df
    A   B   C
0   0   a   2
1   3   b   5
2   6   c   8
3   9   d   11

le = LabelEncoder()
le.fit_transform(df.A)
输出:array([0, 1, 2, 3])

le = LabelEncoder()
le.fit_transform(df.B)
输出:array([0, 1, 2, 3])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
从例子中可以看出,LabelEncoder可以处理数值型和类别型数据

LabelBinarizer
将对应的数据转换为二进制型,有点类似于onehot编码,这里有几点不同,LabelBinarizer可以处理数值型和类别型数据,输入必须为1D数组,可以自己设置正类和父类的表示方式,下面看例子,还是用之前的数据

df
    A   B   C
0   0   a   2
1   3   b   5
2   6   c   8
3   9   d   11

lb = LabelBinarizer()
lb.fit_transform(df.B)
输出
array([[1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1]])

也可以对数值型进行转换
lb.fit_transform(df.A)

array([[1, 0, 0, 0],
       [0, 1, 0, 0],
       [0, 0, 1, 0],
       [0, 0, 0, 1]])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
OneHotEncoder
来到注明的OneHot编码,注意,OneHotEncoder只能对数值型数据进行处理,还是上面的数据,只接受2D数组

df
    A   B   C
0   0   a   2
1   3   b   5
2   6   c   8
3   9   d   11

onehot = OneHotEncoder(sparse=False)//不产生稀疏矩阵
onehot.fit_transform(df[['A']]) //传入B则会出错

array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])
--------------------- 
作者:知天易or逆天难 
来源:优快云 
原文:https://blog.youkuaiyun.com/u013019431/article/details/80009545 
版权声明:本文为博主原创文章,转载请附上博文链接!

import os import pickle import cv2 import matplotlib.pyplot as plt import numpy as np from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout from keras.models import Sequential from keras.optimizers import adam_v2 from keras_preprocessing.image import ImageDataGenerator from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder, OneHotEncoder, LabelBinarizer def load_data(filename=r'/root/autodl-tmp/RML2016.10b.dat'): with open(r'/root/autodl-tmp/RML2016.10b.dat', 'rb') as p_f: Xd = pickle.load(p_f, encoding="latin-1") # 提取频谱图数据和标签 spectrograms = [] labels = [] train_idx = [] val_idx = [] test_idx = [] np.random.seed(2016) a = 0 for (mod, snr) in Xd: X_mod_snr = Xd[(mod, snr)] for i in range(X_mod_snr.shape[0]): data = X_mod_snr[i, 0] frequency_spectrum = np.fft.fft(data) power_spectrum = np.abs(frequency_spectrum) ** 2 spectrograms.append(power_spectrum) labels.append(mod) train_idx += list(np.random.choice(range(a * 6000, (a + 1) * 6000), size=3600, replace=False)) val_idx += list(np.random.choice(list(set(range(a * 6000, (a + 1) * 6000)) - set(train_idx)), size=1200, replace=False)) a += 1 # 数据预处理 # 1. 将频谱图的数值范围调整到0到1之间 spectrograms_normalized = spectrograms / np.max(spectrograms) # 2. 对标签进行独热编码 label_binarizer = LabelBinarizer() labels_encoded= label_binarizer.fit_transform(labels) # transfor the label form to one-hot # 3. 划分训练集、验证集和测试集 # X_train, X_temp, y_train, y_temp = train_test_split(spectrograms_normalized, labels_encoded, test_size=0.15, random_state=42) # X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42) spectrogramss = np.array(spectrograms_normalized) print(spectrogramss.shape) labels = np.array(labels) X = np.vstack(spectrogramss) n_examples = X.shape[0] test_idx = list(set(range(0, n_examples)) - set(train_idx) - set(val_idx)) np.random.shuffle(train_idx) np.random.shuffle(val_idx) np.random.shuffle(test_idx) X_train = X[train_idx] X_val = X[val_idx] X_test = X[test_idx] print(X_train.shape) print(X_val.shape) print(X_test.shape) y_train = labels[train_idx] y_val = labels[val_idx] y_test = labels[test_idx] print(y_train.shape) print(y_val.shape) print(y_test.shape) # X_train = np.expand_dims(X_train,axis=-1) # X_test = np.expand_dims(X_test,axis=-1) # print(X_train.shape) return (mod, snr), (X_train, y_train), (X_val, y_val), (X_test, y_test) 这是我的数据预处理代码
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值