机器学习和数据科学中最重要的预处理步骤是什么?

数据科学和机器学习是目前最新的话题,公司正在寻找数据科学家和机器学习工程师来处理他们的数据并为他们做出重大贡献。每当将数据提供给数据科学家时,他们必须采取正确的步骤来处理它们,并且……

机器学习和数据科学中最重要的预处理步骤是什么?

数据科学和机器学习是目前最新的话题,公司正在寻找数据科学家和机器学习工程师来处理他们的数据并为他们做出重大贡献。每当将数据提供给数据科学家时,他们都必须采取正确的步骤来处理它们,并确保转换后的数据可用于以最佳方式训练各种机器学习模型,同时确保最高效率。

人们经常发现现实世界中存在的数据通常不完整且不准确,并且包含许多机器学习模型无法处理的异常值,从而导致训练性能欠佳。同样重要的是要注意数据中可能存在重复的行或列,在将其提供给机器学习模型之前必须对其进行处理。与许多其他问题一起解决这些问题可能至关重要,尤其是当人们想要提高模型性能和模型的泛化能力时。此外,在分类任务的情况下,感兴趣的输出类别中可能存在类别不平衡。因此,通过创建合成数据点来平衡类也可能是我们将在本文中讨论的其他方法的好方法。

采取正确的数据处理步骤可能是一个挑战,尤其是考虑到该过程发生的方式总数。了解数据处理步骤的适当用法可以帮助数据科学家更好地分析数据并更好地理解它。此外,由于他们的机器学习预测,他们可以帮助引导公司朝着正确的方向前进。

现在让我们回顾一下预处理数据的所有各种可能方法,并确保提供给模型的数据是完整的、准确的并且包含最小的异常值。

Missing Values

在现实世界中,通常不可能找到完整且没有缺失值或 NaN 值的数据。因此,我们可能会删除那些包含这些缺失值的行,或者执行插补(填充缺失值)以确保 ML 模型处理这些数据。

1. 去除缺失值

现在是处理数据中存在的缺失值的时候了。处理数据中缺失值的一种方法是只删除那些行,如前所述。假设我们使用 Python,这是许多数据科学家在机器学习应用程序中使用的默认语言,让我们也看看可以执行此操作的代码。

# Assuming that data is stored in 'df' variable which is mostly used by default. df.isnull()
# This returns a boolean matrix that contains True if there is presence of missing values (NaN) and False otherwise

让我们也考虑一下我们的数据中存在缺失值(这在大多数现实世界的数据集中都是如此),我们可以删除那些包含这些值的行,尽管不推荐这样做。但是让我们看看这是如何完成的,以便更好地了解删除具有缺失值 (NaN) 的行。

df.dropna()
# This removes the rows that contains missing values in the dataframe that is stored as 'df' variable

2. Imputation

它是用各种插补策略(例如均值插补、中值插补和众数插补)替换缺失值的过程。但是,也可以通过基于领域知识为数据分配值来随机进行插补。

同样重要的是要注意,也可以根据机器学习对所有剩余特征的预测进行插补,这些特征已经不包含缺失值。通过这种方式,模型学会了寻找模式并分别对特征中的未知值进行预测。

下面是一个函数,可用于通过均值、中值或众数估算来估算值。随意看看。

def mean_imputation(data, inplace = False):
"""
This function would take the NULL values present in data and replace them with average values of the data respectively.
"""
data.fillna(data.mean(), inplace = inplace)

def median_imputation(data, inplace = False):
"""
This function would take the NULL values present in data and replace them with median values in our data respectively.
"""
data.fillna(data.median(), inplace = inplace)

def mode_imputation(data, inplace = False):
"""
This function would take the NULL values present in data and replace them with mode values of the given data respectively.
"""
data.fillna(data.mode(), inplace = inplace)

来源:Predicting-Loan-Default-Using-Machine-Learning/Home Credit Python Prediction.ipynb at main · suhasmaddali/Predicting-Loan-Default-Using-Machine-Learning (github.com)[0]

该代码实际上取自我在 GitHub 上的一个存储库。你也可以在 GitHub 上关注我,获取我在平台上不断分享的最新项目和见解。

suhasmaddali (Suhas Maddali) (github.com)[0]

正如我们之前所讨论的,也可以基于机器学习预测执行插补,这可以导致更稳健的模型和更准确的缺失值插补。

Outliers

数据集通常包含异常值或数据点,其值与我们数据中的实际预期值相差甚远。这可能是由于记录值时的人为错误或记录特征的机器故障。当我们尝试评估机器学习的指标时,其中一些是均方误差,数据中异常值的存在可能会显着增加误差。但这并不能让我们最准确地了解我们的模型性能。

此外,有许多机器学习模型对数据中的异常值不具有鲁棒性。因此,必须在数据处理阶段采取措施去除它们,以便我们在使用均方误差等指标时获得模型的真实表示,同时确保模型生成最佳预测而不会被异常值怀疑。

Transforming the data

在填充缺失值并删除异常值之后,下一步将是转换这些数据,以便在机器学习模型上进行训练变得可行。根据数据类型和业务需求,有许多方法可以转换数据。

1. Dimensionality reduction

拥有高维数据(更多特征)的挫折之一是存在一种称为“维度诅咒”的现象,其中增加的特征具有递减的收益。因此,删除那些对模型预测和输出没有显着影响的特征很重要。减少维度有两件事:它减少了机器学习模型对数据进行训练所需的时间,并且有时还可以从数据中删除异常值。因此,我们应该进行降维,以确保在训练后得到更稳健的模型。

有多种方法可以将高维数据简化为低维表示。有诸如主成分分析 (PCA)、随机邻域嵌入 (t-SNE) 和 UMAP 等技术可用于降低维度。请注意,这些方法中的每一种在引擎盖下的工作方式都不同,但最终产品是减小尺寸。

2. Standardization

在将数据提供给机器学习模型之前,标准化数据并确保所有输入特征都处于相同的规模也是一种很好的做法。考虑两个特征的示例:身高和体重。让我们考虑一下,我们将使用 ML 算法预测的输出变量是“户外活动”。我们知道身高可以用厘米(cm)来衡量,而体重可以用公斤(kg)来衡量。我们通常无法比较这两个特征,因为它们不在同一尺度上。但是,如果我们要转换这些特征以使它们代表相同的尺度,这可以确保我们可以比较它们并确定哪个特征对确定一个人的“户外活动”最有影响。

下面是如何在 Python 中进行标准化的代码片段。

# Using the StandardScaler() from Sklearn library
# Divided the data into X_train and X_cv
scaler = StandardScaler()
scaler.fit(X_train)
X_train_standardized = scaler.transform(X_train)
X_cv_standardized = scaler.transform(X_cv)

来源:Predicting-Loan-Default-Using-Machine-Learning/Home Credit Python Prediction.ipynb at main · suhasmaddali/Predicting-Loan-Default-Using-Machine-Learning (github.com)[0]

3. Normalization

正如我们在上述案例中看到的那样,以不同规模存在的数据可能会出现问题。还有一种替代策略来处理以不同规模存在的数据。一种方法是对数据进行归一化,这意味着我们从特定特征的最小值中减去现值,然后将结果除以感兴趣特征的最大值和最小值之间的差值。这也是转换数据的有效方法。下面是关于如何做到这一点以获得一个好主意的等式。

根据等式,让我们了解给出的值。

Xmin = 特征中存在的最小值

Xmax = 特征中存在的最大值

Xnorm = 作为执行此操作的结果获得的归一化值。

4. Binning

解决数据中存在的影响机器学习模型性能的异常值非常重要。减少这些异常值影响的方法之一是根据重要特征将数据点划分为不同的 bin。换句话说,它将广泛的数据集分类为更相似的更小的数据组。这可确保数据中的异常值对预测的总体影响最小。因此,这也是一种有效的数据转换方式。

5. Clustering

每当我们处理输出或目标变量未知的无监督机器学习时,使用此数据的流行方法之一就是聚类。虽然聚类可用于无监督机器学习,但它也可用于有监督机器学习。如果我们要根据特定特征对数据进行聚类,我们可以形成我们考虑过的数据组。由于这种方法,数据也可以被转换,我们能够更好地找到其中的模式。

处理不平衡的数据

在机器学习的大多数情况下,存在输出中发生事件的可能性很小的数据。考虑诸如银行中的欺诈检测、营销中的实时投标、贷款违约或入侵检测等示例,其中与结果可能不同的情况相比,事件中正面案例的发生是有限的。在这种情况下,重要的是要处理输出类的这种数据不平衡,以便与其他组相比,没有必要偏向一个组。

有各种算法、策略或技术通常用于处理不平衡数据。让我们看一下处理这种不平衡数据的各种方法。

1. Undersampling

这通过删除多数类中的数据点来减少数据的整体大小,从而使多数类和少数类中的数据点总数相同。在此过程中可以使用各种算法。让我们回顾一下处理这些数据的一些方法。

1a。差点欠采样

该方法的工作原理是考虑多数类与少数类之间的距离,并根据与少数类的最近距离对点进行采样。因此,我们将用于模型预测的数据会减少,具体取决于少数类的规模。有多种不同类型的未命中算法。它们可以是 NearMiss-1、NearMiss-2 和 NearMiss-3,它们在决定考虑特定示例之前考虑的点数的方式各不相同,依此类推。有关此技术的更多信息,请随时参考下面的文章,其中详细介绍了此技术以及许多其他技术。

不平衡分类的欠采样算法 (machinelearningmastery.com)[0]

1b。压缩最近邻规则欠采样

这是一种使用的技术,当数据中的训练点数量减少时,模型性能不会降低。这种技术的开发主要是因为使用 K-最近邻 (KNN) 导致的内存限制。因此,减少了数据点的总数,从而在使用 KNN 算法进行预测之前需要更少的内存。在我们的案例中,通过考虑少数类并考虑多数类示例来使用此方法,并对它们进行测试以了解在多数类中省略点如何导致模型性能的最小降低。

1c。用于欠采样的 Tomek 链接

这是一种有用的方法,它是对上述压缩最近邻方法的修改。它基本上计算多数类和少数类之间的欧几里德距离,并找到那些包含我们为我们的案例考虑的两个类之间的最小欧几里德距离的 tomek 对。因此,我们只得到那些对在多数类和少数类样本之间具有最低欧几里德距离的样本。有关此方法的更多信息,请随时访问下面给出的链接,以便您可以分别很好地理解该主题。

不平衡分类的欠采样算法 (machinelearningmastery.com)[0]

虽然抽样不足对于减少偏差或类别不平衡可能是一件好事,但它通过减少训练样本量来确保数据中存在类别平衡。但是我们正在从我们的训练数据中丢失信息。机器学习模型在使用大量训练示例进行训练时能够很好地泛化。在我们的案例中,我们正在减小数据的大小,这有时可能不是最佳选择。

2. Oversampling

在过采样的情况下,我们以多数类为基础,然后尝试增加少数类的数据点总数,以使多数类和少数类的数量相等。关于如何使用一些最流行的 SMOTE 和随机采样来完成此操作,有多种方法和方法。让我们回顾一下这些方法,以详细了解它们。

2a. SMOTE

SMOTE 代表合成少数过采样技术,可用于对数据进行过采样并创建相同数量的多数和少数类。它根据 k 近邻算法的原理工作,以创建合成数据点。将数据点转换为特征空间并找到它们的最近邻居。他们计算两个样本点之间的距离,并在连接两个点的线段中找到合成点,以获得数据中的附加点。因此,这会导致数据过采样并确保存在相同数量的多数类和少数类。

2b. Random Sampling

这是一种基于获取少数类并复制这些数据点来平衡输出类的技术,以获得具有相同数量的多数类和少数类的数据。这种方法的一个缺点是,由于复制或复制相同的信息以创建相同数量的类,ML 模型可能容易过度拟合数据。

现在让我们回顾一下代码,我们可以根据需要使用过采样或欠采样等技术。以下是我的信用贷款违约预测存储库之一的代码片段链接。

import imblearn 
from imblearn.over_sampling import RandomOverSampler
from imblearn.under_sampling import TomekLinks
from imblearn.over_sampling import SMOTE
from imblearn.under_sampling import NearMiss

“imblearn”是一个可用于过采样或欠采样的库。现在让我们回顾一下可用于修改数据的函数。

def sampler_function(data_x, data_y, sampler = 0, random_state = 101):

if sampler == 0:
sampler = RandomOverSampler(random_state = random_state)
elif sampler == 1:
sampler = TomekLinks()
elif sampler == 2:
sampler = SMOTE()
else:
sampler = NearMiss()
X_transformed, y_transformed = sampler.fit_resample(data_x, data_y)

print('Original dataset shape:', Counter(data_y))
print('Resample dataset shape:', Counter(y_transformed))

return X_transformed, y_transformed

来源:Predicting-Loan-Default-Using-Machine-Learning/Home Credit Python Prediction.ipynb at main · suhasmaddali/Predicting-Loan-Default-Using-Machine-Learning (github.com)[0]

在上面的代码片段中,我们定义了一个函数,它考虑了输入数据 (data_x)、输出数据 (data_y) 以及使用的采样技术 (sampler) 和随机状态。根据“采样器”的值,可以使用不同的采样技术来确定过采样或欠采样。选择采样器后,我们将拟合我们的数据并重新采样,如上面的代码片段所示,最后我们将获得相同数量的类。

Conclusion

我们已经看到了在将数据提供给 ML 模型之前执行数据预处理和数据转换的各种方法。请注意,这些是预处理数据的一些最佳方法,并且可能还有其他技术,我们在本文中没有讨论。但是这些技术应该提供足够的基线,以确保人们能够非常详细地学习预处理步骤。

以下是您可以联系我或查看我的工作的方式。谢谢。

GitHub: suhasmaddali (Suhas Maddali) (github.com)[0]

LinkedIn:(1) Suhas Maddali,东北大学,数据科学 |领英[0]

中:Suhas Maddali — 中[0]

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年5月13日
下一篇 2022年5月13日

相关推荐