当前位置: 首页 > article >正文

机器学习数据预处理preprocessing

预处理方法预处理方法预处理方法
BinarizerFunctionTransformerKBinsDiscretizer
KernelCentererLabelBinarizerLabelEncoder
MaxAbsScalerMinMaxScalerMultiLabelBinarizer

sklearn.preprocessing.Binarizer

设定一个阈值(threshold),对于每个输入值,如果该值大于或等于阈值,则输出 1;否则输出 0

from sklearn.preprocessing import Binarizer

# 创建 Binarizer 对象,并设定阈值
binarizer = Binarizer(threshold=0.5)

# 输入数据
data = [[0.1, 0.8], [0.4, 0.6], [0.7, 0.2]]

# 进行二值化处理
binary_data = binarizer.transform(data)

print(binary_data)
[[0. 1.]
 [0. 1.]
 [1. 0.]]

sklearn.preprocessing.FunctionTransformer

将一个自定义的函数应用于数据的转换过程

from sklearn.preprocessing import FunctionTransformer
import numpy as np

# 定义一个简单的函数
def log_transform(x):
    return np.log1p(x)

# 创建 FunctionTransformer 对象
transformer = FunctionTransformer(log_transform)

# 应用转换
data = np.array([[1, 2], [3, 4]])
transformed_data = transformer.transform(data)
print(transformed_data)
[[0.69314718 1.09861229]
 [1.38629436 1.60943791]]

它可以将任何可调用的函数包装成一个转换器,使其能够与流水线(pipeline)和网格搜索(grid search)无缝集成

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import Binarizer

# 创建 Binarizer 对象,并设定阈值
# binarizer = Binarizer(threshold=0.5)

# 创建一个流水线,将自定义转换器与标准化器结合
pipeline = Pipeline([
    ('log_transform', FunctionTransformer(log_transform)),
    ('scaler', Binarizer(threshold=0.8))
])

# 应用流水线
data = np.array([[1, 2], [3, 4]])
transformed_data = pipeline.fit_transform(data)
print(transformed_data)
[[0. 1.]
 [1. 1.]]

sklearn.preprocessing.KBinsDiscretizer

将连续数据分箱(即离散化)
将连续特征值分成离散的区间(bins),从而将连续变量转换为离散变量

class sklearn.preprocessing.KBinsDiscretizer(n_bins=5, *, encode='onehot', strategy='quantile', dtype=None, subsample=200000, random_state=None)
  • n_bins:指定每个特征要分成的箱子的数量
  • encode:指定编码方式
    • onehot’:独热编码
    • 'onehot-dense’密集独热编码
    • ordinal’:使用序数编码(即每个箱用一个整数表示)
  • strategy:指定分箱策略
    • uniform’:将数据均匀分箱
    • quantile’:根据分位数分箱
    • kmeans’:使用 K-Means 聚类分箱
from sklearn.preprocessing import KBinsDiscretizer
import numpy as np

# 创建示例数据
X = np.array([[1, 2, 6],
              [4, 5, 8],
              [7, 8, 10]])

# 初始化 KBinsDiscretizer
kbins = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')

# 拟合并转换数据
X_binned = kbins.fit_transform(X)

print(X_binned)
[[0. 0. 0.]
 [1. 1. 1.]
 [2. 2. 2.]]

在上述示例中,KBinsDiscretizer 将每个特征列分成 3 个箱,并使用均匀分箱策略,具体分箱情况如下:

  • 第一列:对于数据范围 [1, 7],每个箱的宽度为 (7 - 1) / 3 = 2
    • 第一个箱子:[1, 3)对应编号为0
    • 第二个箱子:[3, 5)对应编号为1
    • 第二个箱子:[5, 7)对应编号为2
      所以第一列特征的[1, 4, 7]变换为[0, 1, 2],同理第二列特征的[2, 5, 8]变换为[0, 1, 2],第二列特征的[6, 8, 10]变换为[0, 1, 2]

再看另外一个例子

from sklearn.preprocessing import KBinsDiscretizer
import numpy as np

# 创建示例数据
X = np.array([[1, 2, 6],
              [2, 5, 8],
              [7, 8, 10]])

# 初始化 KBinsDiscretizer
#n_bins参数如果是列表形式,则其长度须等于特征数,即列数
kbins = KBinsDiscretizer(n_bins=[3, 2, 2], encode='ordinal', strategy='uniform')

# 拟合并转换数据
X_binned = kbins.fit_transform(X)

print(X_binned)
[[0. 0. 0.]
 [0. 1. 1.]
 [2. 1. 1.]]

在上述示例中,KBinsDiscretizer 将第一列分成 3 个箱、第二列分成2个箱、第三列分成2个箱,并使用均匀分箱策略,具体分箱情况如下:

  • 第一列:对于数据范围 [1, 7],每个箱的宽度为 (7 - 1) / 3 = 2
    • 第一个箱子:[1, 3)对应编号为0
    • 第二个箱子:[3, 5)对应编号为1
    • 第二个箱子:[5, 7)对应编号为2
  • 第二列:对于数据范围 [2, 8],每个箱的宽度为 (8 - 2) / 2 = 3
    • 第一个箱子:[2, 5)对应编号为0
    • 第二个箱子:[5, 8]对应编号为1
  • 第三列:对于数据范围 [6, 10],每个箱的宽度为 (10 - 6) / 2 = 2
    • 第一个箱子:[6, 8)对应编号为0
    • 第二个箱子:[8, 10]对应编号为1
      所以第一列特征的[1, 4, 7]变换为[0, 1, 2],同理第二列特征的[2, 5, 8变换为[0, 1, 1],第二列特征的[6, 8, 10]变换为[0, 1, 1]

sklearn.preprocessing.KernelCenterer

用于中心化核矩阵的工具,通常用于核方法(如支持向量机和核主成分分析)中,以确保核矩阵的中心化,从而提高算法的性能
调整核矩阵使其行和列的均值为零,目的是消除数据的偏移,使得算法能够更好地捕捉数据的结构特征

具体计算方式参见机器学习数据预处理preprocessing之KernelCenterer

sklearn.preprocessing.LabelBinarizer

将多类标签转换为一组二进制值,使得每个类都用一个独立的二进制特征表示

from sklearn.preprocessing import LabelBinarizer

# 创建 LabelBinarizer 对象
lb = LabelBinarizer()

# 拟合并转换标签
labels = ['猫', '狗', '兔子', '猫', '狗']
binary_labels = lb.fit_transform(labels)

print(binary_labels)
[[0 0 1]
 [0 1 0]
 [1 0 0]
 [0 0 1]
 [0 1 0]]
# 查看标签
print(lb.classes_)
# 输出:
# ['兔子' '狗' '猫']

sklearn.preprocessing.LabelEncoder

将每个类别值映射到一个从 0 到 n_classes-1 的整数,其中 n_classes 是类别的数量

from sklearn.preprocessing import LabelEncoder

# 创建一个 LabelEncoder 实例
label_encoder = LabelEncoder()

# 假设我们有一个包含类别数据的列表
categories = ['猫', '狗', '猫', '鸟']

# 使用 LabelEncoder 将类别数据转换为数值数据
encoded_labels = label_encoder.fit_transform(categories)

print(encoded_labels)
# 输出: [0 1 0 2]

# 如果需要将数值数据转换回类别数据,可以使用 inverse_transform 方法
decoded_labels = label_encoder.inverse_transform(encoded_labels)
print(decoded_labels)
# 输出: ['猫' '狗' '猫' '鸟']

sklearn.preprocessing.MaxAbsScaler

通过将每个特征值除以该特征的最大绝对值,将特征值缩放到 [-1, 1] 范围内
MaxAbsScaler 不会改变数据的稀疏性(即不会破坏稀疏矩阵的结构),适合处理稀疏数据

X s c a l e d = X m a x ( ∣ X ∣ ) X_{scaled}=\frac{X}{max(|X|)} Xscaled=max(X)X

  1. 初始化 MaxAbsScaler 对象
  2. 使用 fit 方法计算训练数据的最大绝对值
  3. 使用 transform 方法将训练数据缩放到 [-1, 1] 范围内
  4. 对测试数据重复第 3 步的缩放操作
from sklearn.preprocessing import MaxAbsScaler
X = [[ 1., -1.,  2.],
     [ 2.,  0.,  0.],
     [ 0.,  1., -1.]]
transformer = MaxAbsScaler().fit(X)
transformer.transform(X)
array([[ 0.5, -1. ,  1. ],
       [ 1. ,  0. ,  0. ],
       [ 0. ,  1. , -0.5]])

sklearn.preprocessing.MinMaxScaler

class sklearn.preprocessing.MinMaxScaler(feature_range=(0, 1), *, copy=True, clip=False)

将特征缩放到给定的最小值和最大值之间,通常是0和1之间

X s c a l e d = X − X m i n X m a x − X m i n X_{scaled}=\frac{X-X_{min}}{X_{max}-X_{min}} Xscaled=XmaxXminXXmin

from sklearn.preprocessing import MinMaxScaler
data =	[[-1.   2.  ]
			 [-0.5 6]
			 [0  10 ]
			 [1.   18.  ]]
scaler = MinMaxScaler()
scaler.fit(data)
print(scaler.data_max_)
[ 1. 18.]
print(scaler.transform(data))
[[0.   0.  ]
 [0.25 0.25]
 [0.5  0.5 ]
 [1.   1.  ]]
print(scaler.transform([[2, 2]]))
[[1.5 0. ]]

sklearn.preprocessing.MultiLabelBinarizer

将多标签数据转换为二进制格式。它可以将一组标签集合转换为一个二进制矩阵,其中每一列代表一个可能的标签,每一行代表一个样本。如果样本包含某个标签,则相应位置为1,否则为0。

from sklearn.preprocessing import MultiLabelBinarizer

# 假设我们有以下多标签数据
y = [['apple', 'banana'],
       ['banana', 'orange'],
       ['apple'],
       ['banana', 'orange', 'apple']]

# 创建 MultiLabelBinarizer 对象
mlb = MultiLabelBinarizer()

# 拟合并转换数据
y_bin = mlb.fit_transform(y)
print(y_bin)
# 输出:
# [[1 1 0]
#  [0 1 1]
#  [1 0 0]
#  [1 1 1]]

# 查看标签
print(mlb.classes_)
# 输出:
# ['apple' 'banana' 'orange']


http://www.kler.cn/a/500507.html

相关文章:

  • 百度视频搜索架构演进
  • yum系统报错:SyntaxError: multiple exception types must be parenthesized
  • 【2024年华为OD机试】(A卷,100分)- 单词倒序(Java JS PythonC/C++)
  • C# OpenCV机器视觉:OCR产品序列号识别
  • MySQL存储引擎、索引、索引失效
  • 手写系列——VPG算法或REINFORCE算法
  • Redisson和可重入锁初认
  • Level DB --- filter_block
  • screenpipe - 全天候录制屏幕的 AI 助手
  • DDD - 微服务设计与领域驱动设计实战(上)_统一建模语言及事件风暴会议
  • Flink系统知识讲解之:Flink内存管理详解
  • 【STM32-学习笔记-1-】GPIO
  • CSS响应式
  • spring boot 集成 knife4j
  • 2024年有哪些人工智能书籍推荐?
  • Facebook 隐私变革之路:回顾与展望
  • 04:同步与互斥
  • 【教程】Unity 本地化多语种 | Localization 工具组
  • 【PDF转Word】 PDF在线转word文档 好用!优质网站资源推荐
  • Java 实现 Elasticsearch 查询当前索引全部数据
  • OOM排查思路
  • 蓝桥杯历届真题 #食堂(C++,Java)
  • 探讨人工智能机器人学之路径规划与导航:A*算法、Dijkstra算法等路径规划方法
  • 《零基础Go语言算法实战》【题目 2-12】Go 语言接口的工作原理
  • 冒泡排序基础与实现
  • 微服务的配置共享