序言
许多机器学习算法都会对数据做出假设。它通常是一个非常好的以这种方式准备数据的想法,以最好地将问题的结构暴露给我们打算使用机器学习的算法。
介绍
机器学习数据准备阶段的四个操作:数据缩放(Rescale data)、数据标准化(Standardize data)、数据规范化(Normalize data)和数据二值化(Binarize data)。下面系列操作应该根据需要进行适当裁剪。
1. 数据缩放:使用MinMaxScaler将数据缩放到0到1之间。
2. 数据标准化:使用StandardScaler将数据标准化,使其均值为0,标准差为1。
3. 数据规范化:使用Normalizer将每个样本独立规范化,使其范数为1。
4. 数据二值化:使用Binarizer将数据二值化,使其取值为0或1。
案例源码分享
首先读取数据文件,然后修改列名,将数据转换为数组,并将输入和输出数据分开。接下来,分别对输入数据进行数据缩放、标准化、规范化和二值化操作,并打印出每个操作后的数据。
# coding: utf-8
"""
准备数据阶段
1. Rescale data
2. Standardize data
3. Normalize data
4. Binarize data
"""
from pathlib import Path
import pandas as pd
from numpy import set_printoptions
from sklearn.preprocessing import MinMaxScaler, StandardScaler, Normalizer, Binarizer
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (3, 3) #(10, 6)
# 读取数据文件
filename = Path(__file__).parent / 'data/pima-indians-diabetes.csv'
data = pd.read_csv(filename)
# 修改列名以便于理解和后续分析
column_names = {'Pregnancies': 'pregnant_times',
'Glucose': 'glucose',
'BloodPressure': 'blood_pressure',
'SkinThickness': 'skin_thickness',
'Insulin': 'insulin',
'BMI': 'BMI',
'DiabetesPedigreeFunction': 'DPF',
'Age': 'age',
'Outcome': 'outcome'}
data.rename(columns=column_names, inplace=True)
array = data.values
print(array)
# Separate array into input and output components
X = array[:, 0:8]
Y = array[:, 8]
"""
该代码段展示了如何使用scikit-learn库中的MinMaxScaler类对数据进行归一化处理。
归一化是将数据缩放到统一的尺度范围内的一个预处理步骤,对于许多机器学习算法来说是非常重要的。
特别是当数据集中的特征具有不同的量纲和尺度时,归一化能够使得算法表现更加稳定和高效。
参数:
- X: 需要进行归一化处理的数据集,它应该是一个二维数组,每一行代表一个样本,每一列代表一个特征。
返回值:
- rescaledX: 归一化处理后得到的数据集,其特征范围被缩放到0到1之间。
"""
# 初始化MinMaxScaler对象,设定特征范围为0到1
scaler = MinMaxScaler(feature_range=(0, 1))
# 对数据X进行归一化处理
rescaledX = scaler.fit_transform(X)
# 设置打印选项,以三位小数的精度显示结果
set_printoptions(precision=3)
# 打印归一化后的数据集的前6行
print("Rescaled Data:\n", rescaledX[0:6, :])
# Standardize Data
"""
该代码块用于对数据进行标准化处理。
标准化是通过移除数据的均值并缩放到单位方差来实现的。具体地,对于一个样本x,
其标准化得分z计算公式为:z = (x - u) / s,
其中u为训练样本的均值,s为训练样本的标准差。
参数:
- X: 待处理的数据集。
返回值:
- standardizedX: 标准化处理后的数据集。
"""
# 初始化标准化处理器并拟合数据集X
standard_scaler = StandardScaler().fit(X)
# 对数据集X进行标准化处理
standardizedX = standard_scaler.transform(X)
# 设置打印选项以控制输出精度
set_printoptions(precision=3)
# 打印标准化后的数据集的前6行
print("Standardized Data:\n", standardizedX[0:6, :])
# Normalize Data
"""
该段代码用于对数据进行标准化处理。
标准化处理是将样本独立地调整为单位范数。即对数据集中的每个样本(即数据矩阵的每行),如果有至少一个非零组件,就会独立地进行重新缩放。
缩放的依据是数据集中范数最大的行向量。
参数:
- X: 待处理的数据矩阵,其中每一行代表一个样本。
返回值:
- normalizedX: 标准化处理后的数据矩阵。
"""
# 训练正常化器并应用到数据上
normalizer_scaler = Normalizer().fit(X)
normalizedX = normalizer_scaler.transform(X)
# 设置打印选项以显示三位小数
set_printoptions(precision=3)
# 打印前6个样本的标准化结果
print("Normalized Data:\n", normalizedX[0:6, :])
# Binarize Data
"""
该代码块用于二值化数据。二值化是指将数据转换为只有两个值(如0和1)的过程。
这在逻辑回归(设置阈值为0.0)或使神经网络的输出范围在[0, 1]之间(设置阈值为0.5)时非常有用。
参数:
- X: 待二值化的数据集。
- threshold: 二值化的阈值。如果元素大于等于该阈值,则二值化结果为1;否则为0。
返回值:
- binarizedX: 二值化后的新数据集。
"""
# 创建Binarizer实例并设置阈值为0.0,然后拟合数据X
binarizer = Binarizer(threshold=0.0).fit(X)
# 对数据X进行二值化处理
binarizedX = binarizer.transform(X)
# 设置打印选项,以三位小数的精度显示结果
set_printoptions(precision=3)
# 打印前6行二值化后的数据
print("Binarized Data:\n", binarizedX[0:6, :])
# 输出(略)