机器学习中的最小-最大缩放器的完整指南

722 阅读5分钟

在这篇文章中,我们将了解Min-Max缩放器的基本知识。此外,我们还将关注如何在PandasDataFrame中扩展特定列。

什么是最小-最大缩放器?

最小-最大缩放是一种规范化技术,它使我们能够使用每个特征的最小值和最大值将数据集中的数据缩放到一个特定的范围。

与标准缩放不同的是,数据是根据标准正态分布(平均值=0标准差=1)进行缩放的,最小-最大缩放器使用每列的最小值最大值来缩放数据系列。

但为什么需要这样做呢?

  • 一些特征的数据尺度可能与其他特征的数据尺度有很大的不同,这可能会损害我们模型的性能。对于依赖距离测量的算法,如神经网络KNN,情况尤其如此。
  • 它也有助于优化机器学习过程,如梯度下降,并使收敛更快发生。
  • 它可以帮助提高算法的执行性能和速度。由于数据已经被缩减,主要用于优化算法的复杂计算会更快。
  • 在比较不同的数据集或模型的性能时,它也会有所帮助。

最小-最大标度器,在 [sklearn](https://blog.finxter.com/cheat-sheet-6-pillar-machine-learning-algorithms/)库中实现的最小-最大标度器已经被用于许多机器学习应用中,如计算机视觉、自然语言处理和语音识别。

我们将使用下面的sklearn 方法在熊猫的DataFrame的所有列上实现这一技术。

sklearn.preprocessing.MinMaxScaler().fit_transform()

在本教程中,我们还将展示如何使用两种方法在数据框架的特定列上实现这一功能。我将在下面用皮马印度糖尿病数据集的例子来描述所有这些。

方法1:sklearn.preprocessing MinMaxScaler()

我们将使用流行的糖尿病数据集--来自UCI的Pima Indian糖尿病数据集来展示我们可以实现最小-最大缩放的各种方法。

到目前为止,最简单的方法是使用sklearn 库包和它的prepossessing方法。

但首先,让我们使用pandas库将数据放入我们的数据框架,并执行一些EDA。

import pandas as pd
columns = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = pd.read_csv('pima-indians-diabetes.data.csv', names=columns)
data.head()

我们有九列,最后一列是我们试图用我们的模型来预测的类别。

级别为1的项目表明该用户患有糖尿病,级别为0的项目表明该用户的糖尿病测试结果为阴性。这些特征不是同一单位或规模的。

以前两列(pregplas)为例;很明显,preg--表示病人怀孕的次数是单位数,而plas--表示客户的血浆葡萄糖是几十或几百个单位。

我们来描述一下数据,看看每一列的分布情况。

data.describe()

从图形上看,我们可以看到下面的数据是如何分散的。

data[columns].hist(stacked=False, bins=100, figsize=(12,30), layout=(14,2));

上面的图形清楚地表明,这些特征不是同一尺度的。然而,通过sklearn min-max scaler,我们可以确保各列使用相同的比例。

让我们先把数据分成输入和输出。

# Separating the data into input and output components
X = data.drop('class', axis=1)
Y = data['class'] # class is the output
X.head()

让我们使用下面的sklearnMinMaxScaler ,将所有的特征缩放到相同的尺度和0到1的数值范围。

from sklearn.preprocessing import MinMaxScaler
X_copy = X.copy() #We create a copy so we can still refer to the original dataframe later
scaler = MinMaxScaler()
X_columns = X.columns
X_scaled = pd.DataFrame(scaler.fit_transform(X_copy), columns=X_columns)
X_scaled.head()

我们可以用X_scaled 来描述数据,显示每一列的最小值和最大值。

现在所有的列都分别是0和1,而且它们现在也是相同的比例。

X_scaled.describe()

现在我们假设只有整个列中的一个子集要被缩放。例如,让我们考虑这样一种情况:我们只需要调整列pregplas ,而其他列保留它们的比例;我们如何做到这一点?

同样,我们可以使用sklearn 包的最小-最大缩放器来做,如下所示。

from sklearn.preprocessing import MinMaxScaler
X_copy = X.copy()
scaler = MinMaxScaler()
X_copy[['preg', 'plas']] = scaler.fit_transform(X_copy[['preg', 'plas']])
X_copy.head()

我们可以看到只有pregplas 被缩放了。我们还可以看到,这两列的最小值和最大值分别为0和1,如下。

X_copy.describe()

方法2:显式计算

我们可以写出我们的函数来计算X 的比例值,如下所示。同样的计算方法实质上就是sklearn 的最小-最大缩放器方法在引擎盖下所做的。

def scale_column(df,column):
    column_max = df[column].max()
    column_min = df[column].min()
    for i in range(df[column].count()):
        df.loc[i,column] = (df.loc[i,column] - column_min) / (column_max - column_min)

我们再次创建一个数据框架的副本(我们想保留原始数据框架,以便以后展示更多的例子)。

然后,我们使用我们的方法来扩展数据库中的特定列,如下所示。

X_copy2 = X.copy()
scale_column(X_copy2,'preg')
scale_column(X_copy2,'plas')
X_copy2.head()

我们可以看到输出结果与我们在上面使用sklearn 包得到的相同。

我们也可以对数据框架进行描述,并显示被我们缩放的两列的值现在都在0和1之间。

X_copy2.describe()

总结

在这篇文章中,我们回顾了最小最大比例,为什么我们需要它来优化算法,以及如何在pandas数据框架中的整个数据集上应用最小最大比例器。

我们还探讨了在这样的数据框架中使用最小最大缩放器对特定列进行缩放。

我们讨论了两种方法,一种是专注于sklearn 包,另一种是使用预定义的函数。