机器学习中的数据准备



数据准备是机器学习过程中一个至关重要的步骤,它会显著影响最终模型的准确性和有效性。它需要仔细关注细节,并对数据和手头的问题有透彻的理解。

让我们讨论一下如何准备数据,以便更好地适应模型,从而提高准确性和结果。

什么是数据准备?

数据准备是处理原始数据,即清洗、组织和转换数据以使其与机器学习算法对齐的过程。数据准备是一个持续的过程,对机器学习模型的性能有巨大影响。干净且结构化的数据会产生更好的结果。

数据准备的重要性

在机器学习中,模型从输入的数据中学习。因此,只有当数据组织完善且完美时,算法才能有效地学习。用于模型的数据质量会显著影响模型的性能。

以下是一些定义数据准备在机器学习中重要性的方面:

  • 提高模型准确性 - 机器学习算法完全依赖于数据。当您向模型提供干净且结构化的数据时,结果会更准确。
  • 促进特征工程 - 数据准备通常包括选择或创建新特征来训练模型的过程。因此,数据准备会使特征工程更容易。
  • 数据质量 - 收集的数据通常包含不一致之处、错误和无关信息。因此,当应用数据清洗、转换等任务时,数据就会变得格式化和整洁。这可以用于获得见解和模式。
  • 提高预测速度 - 准备好的数据使分析结果更容易,并会产生准确的结果。

数据准备流程步骤

数据准备过程包含一系列步骤,这些步骤是使数据适合分析和建模所必需的。数据准备的目标是确保数据对于分析是准确、完整和相关的。

以下是数据准备中涉及的一些关键步骤:

  • 数据收集
  • 数据清洗
  • 数据转换
  • 数据降维
  • 数据分割
ML Data Preparation Steps
所示过程并非总是顺序的。例如,您可能在转换数据之前先分割数据。您可能需要收集更多数据。

让我们详细了解上述每个步骤:

数据收集

数据收集是机器学习过程的第一步,它从不同的来源收集数据以做出决策、回答研究问题和进行统计规划。数据收集可以使用不同的来源,例如数据库、文本文件、图片、声音文件或网络抓取。一旦选择数据,就必须对数据进行预处理以获得见解。此过程是为了将数据转换成适合解决问题的适当格式。有时数据收集会在数据集成步骤之后进行。

数据集成涉及将来自多个来源的数据组合到单个数据集中进行分析。这可能包括匹配或链接不同数据集中的记录,或基于公共变量合并数据集。

选择原始数据后,最重要的任务是数据预处理。广义地说,数据预处理会将选择的数据转换为我们可以使用或可以馈送到机器学习算法的格式。我们总是需要预处理我们的数据,以便它可以满足机器学习算法的预期。数据预处理包括数据清洗、转换和降维。让我们详细讨论这三个方面。

数据清洗

数据清洗是识别和纠正数据中的错误、缺失值、重复值和异常值等的处理过程。此步骤在机器学习过程中至关重要,因为它确保数据准确、相关且无错误。

用于数据清洗的常用技术包括插补、异常值检测和去除等。以下是数据清洗步骤的顺序:

1. 处理重复值

数据集中存在重复数据意味着存在重复数据,这可能是由于数据输入错误或数据收集过程中的问题造成的。用于去除重复数据的技术首先是识别它们,然后使用**Pandas中的drop_duplicates函数**将其删除。

2. 纠正语法错误

在此步骤中,应解决结构性错误,例如数据格式或命名约定中的不一致之处。标准化格式和纠正错误将确保数据一致性和准确的分析。

3. 处理异常值

异常值是不寻常的值,与数据差异很大。用于检测异常值的技巧包括统计方法,如**z分数**或**IQR方法**,以及机器学习方法,如**聚类**和**支持向量机 (SVM)**。

4. 处理缺失值

缺失值是指数据集中某些值未存储的值或数据。有多种方法可以处理缺失数据,例如

  • 插补 - 在此过程中,缺失值被替换为不同的值,对于数值可以是均值、中位数或众数等集中趋势度量,对于分类数据则是最频繁的类别。插补的其他方法包括回归插补和多重插补。
  • 删除 - 在此过程中,删除所有包含缺失值的实例。好吧,这并不是一种可靠的方法,因为存在数据丢失。

5. 验证数据

数据验证是另一个阶段,它确保数据完全符合要求,以便预测结果准确。一些常见的数据验证程序是在将数据存储到数据库之前检查数据的正确性,例如:

  • 数据类型检查
  • 代码检查
  • 格式检查
  • 范围检查

数据转换

数据转换是将数据从原始格式转换为适合分析和建模的格式的过程。这可能包括定义结构、对齐数据、从源提取数据,然后将其存储到适当的格式中。

有多种技术可用于将数据转换为合适的格式。一些常用的数据转换技术如下:

  • 缩放
  • 归一化 - L1和L2归一化
  • 标准化
  • 二值化
  • 编码
  • 对数转换

让我们详细讨论上述每种数据转换技术:

1. 缩放

在大多数情况下,我们收集的数据包含具有不同比例的属性,但我们不能向机器学习算法提供此类数据,因此需要重新缩放。数据缩放确保属性具有相同的比例,即通常为0到1的范围。

我们可以借助scikit-learn Python库的MinMaxScaler类来重新缩放数据。

示例

本例将重新缩放我们之前使用过的Pima印第安人糖尿病数据集的数据。首先,将加载CSV数据(如前几章所做的那样),然后借助MinMaxScaler类,将其重新缩放至0到1的范围。

以下脚本的前几行与我们在前几章加载CSV数据时编写的相同。

from pandas import read_csv
from numpy import set_printoptions
from sklearn import preprocessing
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

现在,我们可以使用MinMaxScaler类将数据重新缩放至0到1的范围。

data_scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
data_rescaled = data_scaler.fit_transform(array)

我们还可以根据自己的选择汇总输出数据。这里,我们将精度设置为1,并显示输出中的前10行。

set_printoptions(precision=1)
print ("\nScaled data:\n", data_rescaled[0:10])
输出
Scaled data:
[
   [0.4 0.7 0.6 0.4 0.  0.5 0.2 0.5 1. ]
   [0.1 0.4 0.5 0.3 0.  0.4 0.1 0.2 0. ]
   [0.5 0.9 0.5 0.  0.  0.3 0.3 0.2 1. ]
   [0.1 0.4 0.5 0.2 0.1 0.4 0.  0.  0. ]
   [0.  0.7 0.3 0.4 0.2 0.6 0.9 0.2 1. ]
   [0.3 0.6 0.6 0.  0.  0.4 0.1 0.2 0. ]
   [0.2 0.4 0.4 0.3 0.1 0.5 0.1 0.1 1. ]
   [0.6 0.6 0.  0.  0.  0.5 0.  0.1 0. ]
   [0.1 1.  0.6 0.5 0.6 0.5 0.  0.5 1. ]
   [0.5 0.6 0.8 0.  0.  0.  0.1 0.6 1. ]
]

从上面的输出可以看出,所有数据都已重新缩放至0到1的范围。

2. 归一化

归一化用于将数据重新缩放至0到1之间的分布值。对于每个特征,最小值设置为0,最大值设置为1。

这用于重新缩放数据的每一行,使其长度为1。这主要用于稀疏数据集,其中有很多零。我们可以借助scikit-learn Python库的Normalizer类来重新缩放数据。

在机器学习中,有两种归一化预处理技术,如下所示:

L1归一化

它可以定义为一种归一化技术,它以这样的方式修改数据集的值:在每一行中,绝对值的总和始终加起来为1。它也称为最小绝对偏差。

示例

在本例中,我们使用L1归一化技术来归一化我们之前使用过的Pima印第安人糖尿病数据集的数据。首先,将加载CSV数据,然后借助Normalizer类对其进行归一化。

以下脚本的前几行与我们在前几章加载CSV数据时编写的相同。

from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values

现在,我们可以使用带有L1的Normalizer类来归一化数据。

Data_normalizer = Normalizer(norm='l1').fit(array)
Data_normalized = Data_normalizer.transform(array)

我们还可以根据自己的选择汇总输出数据。这里,我们将精度设置为2,并显示输出中的前3行。

set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])
输出
Normalized data:
[
   [0.02 0.43 0.21 0.1  0. 0.1  0. 0.14 0. ]
   [0.   0.36 0.28 0.12 0. 0.11 0. 0.13 0. ]
   [0.03 0.59 0.21 0.   0. 0.07 0. 0.1  0. ]
]

L2归一化

它可以定义为一种归一化技术,它以这样的方式修改数据集的值:在每一行中,平方的总和始终加起来为1。它也称为最小二乘法。

示例

在本例中,我们使用L2归一化技术来归一化我们之前使用过的Pima印第安人糖尿病数据集的数据。首先,将加载CSV数据(如前几章所做的那样),然后借助Normalizer类对其进行归一化。

以下脚本的前几行与我们在前几章加载CSV数据时编写的相同。

from pandas import read_csv
from numpy import set_printoptions
from sklearn.preprocessing import Normalizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv (path, names=names)
array = dataframe.values

现在,我们可以使用带有L1的Normalizer类来归一化数据。

Data_normalizer = Normalizer(norm='l2').fit(array)
Data_normalized = Data_normalizer.transform(array)

我们还可以根据自己的选择汇总输出数据。这里,我们将精度设置为2,并显示输出中的前3行。

set_printoptions(precision=2)
print ("\nNormalized data:\n", Data_normalized [0:3])
输出
Normalized data:
[
   [0.03 0.83 0.4  0.2  0. 0.19 0. 0.28 0.01]
   [0.01 0.72 0.56 0.24 0. 0.22 0. 0.26 0.  ]
   [0.04 0.92 0.32 0.   0. 0.12 0. 0.16 0.01]
]

3. 标准化

标准化用于将数据属性转换为标准高斯分布,其均值为0,标准差为1。此技术适用于线性回归、逻辑回归等机器学习算法,这些算法假设输入数据集中存在高斯分布,并且使用重新缩放的数据可以产生更好的结果。

我们可以借助scikit-learn Python库的StandardScaler类来标准化数据(均值=0,标准差=1)。

示例

在本例中,我们将重新缩放我们之前使用过的Pima印第安人糖尿病数据集的数据。首先,将加载CSV数据,然后借助StandardScaler类将其转换为均值=0,标准差=1的高斯分布。

以下脚本的前几行与我们在前几章加载CSV数据时编写的相同。

from sklearn.preprocessing import StandardScaler
from pandas import read_csv
from numpy import set_printoptions
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

现在,我们可以使用StandardScaler类来重新缩放数据。

data_scaler = StandardScaler().fit(array)
data_rescaled = data_scaler.transform(array)

我们还可以根据自己的选择汇总输出数据。这里,我们将精度设置为2,并显示输出中的前5行。

set_printoptions(precision=2)
print ("\nRescaled data:\n", data_rescaled [0:5])
输出
Rescaled data:
[
   [ 0.64  0.85  0.15  0.91 -0.69  0.2   0.47  1.43  1.37]
   [-0.84 -1.12 -0.16  0.53 -0.69 -0.68 -0.37 -0.19 -0.73]
   [ 1.23  1.94 -0.26 -1.29 -0.69 -1.1   0.6  -0.11  1.37]
   [-0.84 -1.   -0.16  0.15  0.12 -0.49 -0.92 -1.04 -0.73]
   [-1.14  0.5  -1.5   0.91  0.77  1.41  5.48 -0.02  1.37]
]

4. 二值化

顾名思义,这是一种可以使我们的数据二值化的技术。我们可以使用二值化阈值来使我们的数据二值化。高于该阈值的值将转换为1,低于该阈值的值将转换为0。例如,如果我们选择阈值=0.5,则高于该阈值的数据集值将变为1,低于该阈值的数据集值将变为0。这就是为什么我们可以称之为对数据进行二值化或对数据进行阈值处理。当我们的数据集中有概率并且想要将其转换为清晰的值时,此技术很有用。

我们可以借助scikit-learn Python库的Binarizer类来二值化数据。

示例

在本例中,我们将重新缩放我们之前使用过的Pima印第安人糖尿病数据集的数据。首先,将加载CSV数据,然后借助Binarizer类将其转换为二进制值,即0和1,具体取决于阈值。我们取0.5作为阈值。

以下脚本的前几行与我们在前几章加载CSV数据时编写的相同。

from pandas import read_csv
from sklearn.preprocessing import Binarizer
path = r'C:\pima-indians-diabetes.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(path, names=names)
array = dataframe.values

现在,我们可以使用Binarize类将数据转换为二进制值。

binarizer = Binarizer(threshold=0.5).fit(array)
Data_binarized = binarizer.transform(array)

这里,我们显示输出中的前5行。

print ("\nBinary data:\n", Data_binarized [0:5])
输出
Binary data:
[
   [1. 1. 1. 1. 0. 1. 1. 1. 1.]
   [1. 1. 1. 1. 0. 1. 0. 1. 0.]
   [1. 1. 1. 0. 0. 1. 1. 1. 1.]
   [1. 1. 1. 1. 1. 1. 0. 1. 0.]
   [0. 1. 1. 1. 1. 1. 1. 1. 1.]
]

5. 编码

此技术用于将分类变量转换为数字表示。一些常见的编码技术包括独热编码标签编码目标编码

标签编码

大多数sklearn函数期望数据使用数字标签而不是文字标签。因此,我们需要将此类标签转换为数字标签。此过程称为标签编码。我们可以借助scikit-learn Python库的LabelEncoder()函数执行数据的标签编码。

示例

在下面的示例中,Python脚本将执行标签编码。

首先,导入所需的Python库,如下所示:

import numpy as np
from sklearn import preprocessing

现在,我们需要提供输入标签,如下所示:

input_labels = ['red','black','red','green','black','yellow','white']

下一行代码将创建标签编码器并对其进行训练。

encoder = preprocessing.LabelEncoder()
encoder.fit(input_labels)

接下来的几行脚本将通过编码随机排序的列表来检查性能:

test_labels = ['green','red','black']
encoded_values = encoder.transform(test_labels)
print("\nLabels =", test_labels)
print("Encoded values =", list(encoded_values))
encoded_values = [3,0,4,1]
decoded_list = encoder.inverse_transform(encoded_values)

我们可以借助以下Python脚本获取编码值的列表:

print("\nEncoded values =", encoded_values)
print("\nDecoded labels =", list(decoded_list))
输出
Labels = ['green', 'red', 'black']
Encoded values = [1, 2, 0]
Encoded values = [3, 0, 4, 1]
Decoded labels = ['white', 'black', 'yellow', 'green']

6. 对数转换

此技术通常用于处理倾斜数据。它涉及对数据集中所有值应用自然对数函数以修改数值的比例。

数据降维

数据缩减是一种通过选择与分析最相关的特征或观察值的子集来减小数据集大小的技术。这有助于减少噪声并提高模型的准确性。

当数据集非常大或数据集包含大量无关数据时,这很有用。

最常用的技术之一是降维,它在不丢失重要信息的情况下减小数据集的大小。另一种方法是离散化,其中将时间和温度等连续值转换为离散类别,从而简化数据。

数据分割

数据分割是机器学习数据准备的最后一步,其中数据被分割成不同的集合:

  • 训练集 - 机器学习模型用于学习模式的子集。
  • 验证集 - 用于评估机器学习模型在训练期间性能的子集。
  • 测试集 - 用于评估训练模型的性能和效率的子集。

Python示例

让我们检查一下使用乳腺癌数据集进行数据准备的示例:

from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# load the dataset
data = load_breast_cancer()

# separate the features and target
X = data.data
y = data.target

# split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# normalize the data using StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

在本例中,我们首先使用scikit-learn中的load_breast_cancer函数加载乳腺癌数据集。然后,我们分离特征和目标,并使用train_test_split函数将数据分割成训练集和测试集。

最后,我们使用scikit-learn中的StandardScaler对数据进行归一化,该函数减去均值并将数据缩放至单位方差。这有助于将所有特征都放到相似的尺度上,这对于SVM和神经网络之类的模型尤其重要。

数据准备和特征工程

特征工程涉及从现有数据中创建新的特征,这些特征可能对分析更有用或更有信息量。它可能涉及组合或转换现有特征,或基于领域知识或见解创建新特征。数据准备和特征工程在整个数据预处理管道中是相辅相成的。

广告