机器学习中的特征工程

如果您是机器学习的新手,您一定听说过特征工程并思考“什么是特征工程?” “这听起来确实很复杂;我会保存起来以备后用。” 但我告诉你,这听起来很复杂,但其实很简单,只需要几分钟你就可以完全理解它。那么让我们开始吧。

在学习特征工程之前,我们必须先了解什么是机器学习。

什么是机器学习?

机器学习近年来获得了广泛的普及。随着 ChatGPT 等新的强大人工智能工具的推出,机器学习吸引了很多人的目光。我们多年来一直听说机器学习,但第一次看到它的实际应用。

机器学习是借助大量数据训练模型的过程,模型将根据这些数据进行预测。现在,这些数据以数据集的形式输入到模型中。数据集是表格形式的数据集合。它由行和列组成。在处理大数据集时,我们必须确保我们的数据集能够为做出积极的预测做出最大贡献。

数据类型

在机器中,学习数据主要分为两部分:-

结构化数据

采用特定格式使其更易于处理的数据称为结构化数据。它通常有行和列。它通常存储在 RDBMS(关系数据库管理系统)或 CSV 文件中。它更容易工作,并且对创建机器学习模型有很大帮助。

非结构化数据

非结构化数据是未经处理的原始数据。它可以包含音频文件、文本数据或图像数据。它没有预定义的方式。在我们开始建立模型之前,它们需要转换为结构化数据。不可能在非结构化数据上建立机器学习模型。为了将非结构化数据转换为结构化数据,需要使用特征工程。

什么是特征工程?

假设我们的数据集中有一些自变量。这些变量也称为“特征”。现在我们可以根据数据集中的这些现有特征生成新特征。从已有特征生成新特征的过程称为特征工程。

用正式语言来说,“特征工程”是从数据集中现有数据中提取越来越多有用数据的科学。

为什么我们需要特征工程?

原始形式的数据集可能并不总是适合训练我们的模型。因此,我们需要改进我们的数据集,以便我们的模型能够具有最大的准确性并给出最佳的结果。特征工程可以帮助您实现这一目标。它可以帮助您使数据集更适合训练 ML 模型。

在开始特征工程之前,我们必须确保目前数据集中存在的特征对于我们的模型来说都是必需的。有些特征可能是多余的,或者有些特征可能会对我们模型的预测能力产生负面影响。

如何进行特征工程?

特征工程流程图的类型

特征创建

当您通过识别预先存在的特征中的模式来创建新特征时,这称为特征创建。它是特征工程的一个重要方面。很多时候,可用的数据可能会给您一些有关模式的提示。您可以识别这些模式并基于它们创建新功能。

特征选择

特征选择是特征工程的重要组成部分。这是我们检查某个特征对于我们的模型是好是坏的过程。检查后,我们从数据集中排除了对我们的模型不利的特征。即使所有特征都适合我们的模型,有时我们只需要几个最好的特征。可能是由于时间限制或者是为了避免模型过拟合的问题。

相关:了解如何处理过度拟合

特征选择可以通过两种方式完成:-

向前选择

在此方法中,我们从一个空数据集开始。我们给它添加一个特征并评估它的R2 分数如果 R2 分数增加,我们将继续保留该功能,否则将其删除。我们对所有功能重复此过程。

向后淘汰

在此方法中,我们首先包含整个数据集。我们从中删除一个特征并评估它的R2 分数如果 R2 分数增加,我们将永久删除该功能,否则将保留它。我们对所有功能重复此过程。

相关特征选择

特征缩放

如果您有多个变量,则它们不需要具有相同大小的值范围。他们可能有不同的域。因此,我们的模型可能会更加重视重要性非常低的特征。这会增加模型的不准确性。为了解决这个问题,我们需要将数据调整到相同的规模。为此,我们进行特征缩放。特征缩放可以使用各种方法来完成,但归一化和标准化是缩放数据的最常见方法。您可以在下面提到的链接中了解有关它们的更多信息。

相关特征缩放

处理缺失数据

数据集中的缺失数据通常由 NA 或空值表示。许多空值可能会将模型引向错误的方向。他们需要得到处理。因此,我们删除具有大量空值的列。如果特征中没有那么多空值,我们可以用特征中剩余值的平均值替换空值,或者我们可以估算整个记录。尽管在某些情况下插补不是首选方法,因为它可能会导致数据丢失。

特征变换

特征变换是一种利用数学运算来变换数据集特征的方法。当数据呈正态分布时,某些模型(例如线性模型)表现良好。如果数据有偏差,我们可以使用特征变换来变换数据并对其进行归一化。

对于右偏数据,我们可以使用 n 次根或对数变换,对于右偏数据,我们可以使用 n 次方或指数变换。

特征编码

许多机器学习模型(例如线性回归)不接受分类变量作为自变量。在这些情况下,我们必须将分类变量转换为数值变量才能使其有用。为此,我们使用分类编码。分类编码是一种重要的特征工程方法。我们主要有两种方法可以执行分类编码。

一热编码/虚拟编码

在虚拟编码中,我们为分类变量中的每个类别创建一个单独的变量。这些新变量将包含布尔值(0 或 1)。例如,我们有一个分类变量“结果”,由两个值“是”或“否”组成。现在,我们将用两个变量替换该变量 – 名为“Result_Yes”和“Result_No”。在数据集的实例中,如果“Result”的值为“Yes”,我们将在“Result_Yes”变量中放入 1实例和“Result_No”变量中的 0。现在让我们看看如何在 Python 中做到这一点。

Python 中的虚拟编码实现

为此,我们只需要使用 pandas 的 get_dummies 函数即可。

1
2
3
4
5
import pandas as pd
data = {"Marks":[99,31,23,81,63],"Qualified":["Yes","No","No","Yes","Yes"]}
df = pd.DataFrame(data)
df = pd.get_dummies(df,columns = ['Qualified'], drop_first = True)
df

在上面的代码中,我们首先导入了pandas库。然后,我们创建一个以 Marks 和 Qualified 作为键的字典,传递标记,并将 Qualified 的值设置如下:标记 >=35 的记录的 Qualified 值为“Yes”,否则将为“No”值。然后我们将字典转换为数据框。现在我们使用 pandas 的 get_dummies 函数将“Qualified”变量替换为虚拟变量。

虚拟编码的代码和输出

现在您可以看到 Qualified 列已被删除。但只有一个虚拟变量——Qualified_Yes,为什么呢?

想一想。Qualified_Yes 变量的值为 1,其中 Qualified 列中为 Yes。这意味着,只要 Qualified 中为“否”,Qualified_Yes 中必定为 0,Qualified _No 中也必定为 1。因此不会丢失任何信息。我们只能通过 Qualified_Yes 变量检索之前存在的所有信息。添加 Qualified_No 变量是不必要且多余的。

标签编码

在标签编码中,对于变量中的每个类别,我们分配一个数字,然后用该数字替换类别。例如,我们有一个分类变量“condition”,接受值“Excellent”、“Good”、“Okay”和“Bad”。在这个变量中,类别之间有一个顺序。

优秀>良好>一般>差

因此,我们可以用 4 表示优秀,用 3 表示良好,用 2 表示良好,用 1 表示不好。现在,将所有实例替换为其相应的数值。现在,我们得到了一个值为 1-4 的数字列,而不是一个分类列。

Python中标签编码的实现

让我们使用 pandas 库创建一个数据框。要创建数据框,请执行以下步骤

  • 导入pandas库。
  • 创建一个字典,其中键作为列的名称,值作为相应列中的值列表。
  • 现在使用 pandas 库中的 DataFrame 函数将此字典转换为数据帧。
1
2
3
import pandas as pd
data = {"Marks":[99,65,73,81,63],"Result":["excellent","bad","okay","good","bad"]}
df = pd.DataFrame(data)
在数据框中转换字典的代码和输出

在上面的代码块中,首先,我们将 pandas 库导入为 pd。然后我们创建一个以Marks和Result为键的字典,传递marks,并设置结果的值如下:marks>=90的记录的Result值为“excellent”,90>marks>=80的记录有一个Result值为“good”,80>marks>=70 的结果值为“okay”,marks<70 的结果值为“bad”。现在我们必须对“Result”变量执行标签编码。为此,我们将使用dataframe的map函数。

1
2
3
4
mapping = {"excellent": 4, "good": 3, "okay": 2, "bad": 1}
df_encoded = df
df_encoded['Result'] = df['Result'].map(mapping)
df_encoded
标签编码的代码和输出

对于标签编码,我们创建了一个字典,其中包含 Result 的所有值作为键,并且我们必须替换它的数值将是键的相应值。然后我们在 Result 变量上使用 map 函数,并将映射字典作为参数传递。这将使用其中提到的字典的相应值更改结果列中的每条记录。

注意:仅当您知道不同级别之间的顺序时才使用标签编码。

热点编码是特征工程的重要组成部分。我们无法在这里涵盖所有内容。深入了解一种热门编码。

分档

考虑一个有 100 个类别的分类变量。如果我们尝试为此分类变量创建虚拟变量,数据集中将出现 100 个新列。当我们执行虚拟编码时,我们可以减少编号。使用分箱的类别。这样,我们就可以减少数量。虚拟变量。

注意:我们也可以对连续变量进行分箱,但建议不要这样做,因为这会导致信息丢失。

特征生成

特征生成是特征工程中最重要的部分。我们可以利用特征生成来发挥巨大的优势。让我们通过一个例子来理解这一点。

假设您正在制作一个用于流量预测的机器学习模型。数据集中有日期变量。日期变量本身对我们的模型贡献不大。现在,我们可以通过找出给定日期是哪一天,使用此日期变量创建一个新特征“day”。现在这一天的变量很棒。该模型将能够注意到基于日期的流量模式,因为我们知道流量随着日期而变化。

例如,周日由于是假期,交通流量会减少。我们刚刚从另一个无法对我们的模型做出太大贡献的现有功能中生成了一个新的有用功能。这样我们就可以使用特征生成来使我们的模型比以前更好。

功能组合

特征组合是基于两个或多个不同特征创建一个特征并取代其余特征的过程。两个或多个特征的有效组合可以提高我们模型的预测能力。

例如,我们正在制作一个机器学习模型来预测房屋的售价。该数据集有一个海滨视图列和一个后院列。我们可以将这两个特征结合起来,制作一个新的特征豪华住宅,并且将海滨景观和后院都为1的记录我们将豪华住宅作为1。其中任何一个为1的记录将具有豪华住宅的价值: 0.5 以及两者都为 0 的情况下,其值为 0。现在,我们可以删除这些列。通过这种方式,我们减少了数据集的维度并保留了信息。

针对特定数据类型的特征工程

时间序列数据

时间序列数据是随时间收集的一类数据。例如,股市价格和全球变暖率。在这种类型中,时间顺序很重要。让我们考虑一下股票市场价格的例子。该数据集中的数据不仅仅是随机日期的股票价格。随机日期的股票价格没有任何用处。我们需要找到股票价格变化的模式。所以我们需要保持时间顺序。这种以年代顺序为重要的数据类型称为时间序列数据。

时间序列数据中的特征工程对于数据分析和建模非常重要。时间序列数据中的特征工程包括小波变换、傅里叶变换、滚动特征、滞后特征、季节性特征等。Python 中有可用于时间序列数据特征工程的库。tsfresh是最常用的。它包含提取 1000 多个特征的函数。

音频数据

为音频数据创建机器学习模型非常复杂。使用音频数据使模型创建过程变得更加乏味。对于音频数据,完成特征工程过程非常重要。

音频数据中的特征工程包括创建音调节奏特征、频谱特征和频谱图特征,其中我们将音频信号转换为频谱图图像。您可以使用PyAudioAnalysisLibrosa库来实现此目的。

文本数据

基于文本数据的机器学习模型非常普遍。借助文本处理,情感分析、假新闻检测以及更重要的事情都成为可能。文本数据包含大量我们知道预测过程可能不需要的数据,并且可能会成为准确预测的障碍。例如,大多数文本分析不需要停用词、标点符号或表情符号。您需要删除它们才能提高模型的准确性。NLTK(自然语言工具包)是最常见、最有用的文本处理库。它包含许多有助于特征工程的函数。

结论

特征工程是机器学习中的一个重要课题。它并不复杂,但如果没有特征工程,您的模型就无法处于最佳形式。这是一个乏味的过程,但不经历它是一个坏主意。确保始终检查您的数据集是否需要任何特征工程。只有在那之后才继续训练你的模型。

参考

预处理库:sci-kit learn .

Python 中的机器学习 – 初学者简单指南。

机器学习中的数据集