2种在Python中标准化数据的简便方法

时间:2020-02-23 14:42:20  来源:igfitidea点击:

在本教程中,我们将学习如何在Python中标准化数据。
规范化时,我们更改数据规模。
数据通常会重新调整为介于0-1之间。

为什么我们需要在Python中规范化数据?

当不同的特征(变量)规模较小时,机器学习算法往往会表现更好或者收敛更快。
因此,通常的做法是在训练机器学习模型之前对数据进行标准化。

规范化还使训练过程对要素的规模不那么敏感。
这导致训练后获得更好的系数。

通过重新缩放使特征更适合训练的过程称为特征缩放。

归一化的公式如下:

我们从每个条目中减去最小值,然后将结果除以范围。
范围是最大值和最小值之差。

在Python中标准化数据的步骤

我们将讨论两种不同的方式来标准化python中的数据。

第一个是通过使用sklearn下的" normalize()"方法。

使用sklearn的normalize()

首先,从sklearn导入处理。

from sklearn import preprocessing

现在,让我们使用Numpy创建一个数组。

import numpy as np
x_array = np.array([2,3,5,6,7,4,8,7,6])

现在我们可以在数组上使用normalize()方法。
此方法沿行对数据进行规范化。
让我们看看实际的方法。

normalized_arr = preprocessing.normalize([x_array])
print(normalized_arr)

完整的代码

这是此部分中的完整代码:

from sklearn import preprocessing
import numpy as np
x_array = np.array([2,3,5,6,7,4,8,7,6])
normalized_arr = preprocessing.normalize([x_array])
print(normalized_arr)

输出:

[0.11785113, 0.1767767 , 0.29462783, 0.35355339, 0.41247896,
      0.23570226, 0.47140452, 0.41247896, 0.35355339]

我们可以看到所有值现在都在0到1之间。
这就是sklearn下的normalize()方法的工作方式。

您也可以使用此方法规范化数据集中的列。
让我们看看接下来如何做。

使用normalize()标准化数据集中的列

由于normalize()仅对沿行的值进行标准化,因此在应用该方法之前,需要将列转换为数组。

为了演示我们将使用加利福尼亚住房数据集。

首先导入数据集。

import pandas as pd
housing = pd.read_csv("/content/sample_data/california_housing_train.csv")

接下来,我们需要选择一列并将其转换为数组。
我们将使用" total_bedrooms"列。

from sklearn import preprocessing
x_array = np.array(housing['total_bedrooms'])
normalized_arr = preprocessing.normalize([x_array])
print(normalized_arr)

输出:

[[0.01437454 0.02129852 0.00194947 ... 0.00594924 0.00618453 0.00336115]]

如何在不将列转换为数组的情况下标准化数据集?

让我们看看当我们尝试规范化数据集而不将要素转换为数组进行处理时会发生什么。

from sklearn import preprocessing
import pandas as pd
housing = pd.read_csv("/content/sample_data/california_housing_train.csv")
d = preprocessing.normalize(housing)
scaled_df = pd.DataFrame(d, columns=names)
scaled_df.head()

输出:
Normalize a dataset

其中这些值沿行进行了归一化,这可能非常不直观。
沿行归一化意味着对每个示例进行归一化,而不是对特征进行归一化。

但是,可以在调用方法以沿特征(列)进行归一化时指定轴。

默认情况下,轴参数的值设置为1。
如果将值更改为0,则标准化过程将沿着列进行。

from sklearn import preprocessing
import pandas as pd
housing = pd.read_csv("/content/sample_data/california_housing_train.csv")
d = preprocessing.normalize(housing, axis=0)
scaled_df = pd.DataFrame(d, columns=names)
scaled_df.head()

您可以看到输出中的total_bedrooms列与将其转换为数组然后进行归一化后所获得的结果相匹配。

使用MinMaxScaler()在Python中规范化数据

关于数据标准化,Sklearn提供了另一个选项:MinMaxScaler。

这是标准化数据集的更流行的选择。

这是使用MinMaxScaler标准化房屋数据集的代码:

from sklearn import preprocessing
import pandas as pd
housing = pd.read_csv("/content/sample_data/california_housing_train.csv")
scaler = preprocessing.MinMaxScaler()
names = housing.columns
d = scaler.fit_transform(housing)
scaled_df = pd.DataFrame(d, columns=names)
scaled_df.head()

您可以看到输出中的值介于(0和1)之间。

MinMaxScaler还为您提供了选择特征范围的选项。
默认情况下,范围设置为(0,1)。
让我们看看如何将范围更改为(0,2)。

from sklearn import preprocessing
import pandas as pd
housing = pd.read_csv("/content/sample_data/california_housing_train.csv")
scaler = preprocessing.MinMaxScaler(feature_range=(0, 2))
names = housing.columns
d = scaler.fit_transform(housing)
scaled_df = pd.DataFrame(d, columns=names)
scaled_df.head()

现在,输出中的值介于(0,2)之间。