摘要:欢迎来到使用 Python pandas 进行数据预处理教程系列的第三部分——数据规范化。预处理是对数据进行预分析的过程,目的是将数据转换为标准且规范的格式。
数据预处理通常包括以下几个方面:
在本教程中我们主要关注数据规范化。前面的教程中,我们学习了缺失值处理(Python Pandas数据预处理—Part 1:缺失值处理)和数据格式化(Python Pandas数据预处理—Part 2:数据格式化)。
数据规范化包括将不同尺度的测量值调整到一个共同尺度。在处理数据框时,数据规范化允许将引用不同列的值调整为公共比例。当数据框的列被用作机器学习算法的输入特征时,强烈建议进行规范化操作,因为它允许为所有特征赋予相同的权重,消除异常值对模型训练结果的影响。
规范化仅适用于数值列。常见的规范化方法有以下五种:
在本教程的剩余部分中,为了学习目的,我们会对单个列应用不同的规范化方法。然而,在实际项目中,如果你想将数据集的每一列用作机器学习算法的输入特征,你应该对所有列应用相同的规范化方法。
在本教程中,我们使用 pandas 库来执行规范化操作。还有另一种替代方法,你可以使用 scikit-learn 库的预处理方法。Tips:如果有读者想学习如何使用 scikit-learn 的预处理包,请留言告诉我。
作为示例数据集,在本教程中,我们使用意大利 Protezione Civile 提供的 COVID-19 数据集,该数据集是新冠肺炎大规模流行开始以来登记的新冠病例数,获取方式见文末。
首先,我们需要导入 Python pandas 库,并通过 read_csv() 函数读取数据集。然后我们可以删除所有具有 NaN 值的列。这可以通过 dropna() 函数来完成:
import pandas as pd
df = pd.read_csv('datasets/dpc-covid19-ita-regioni.csv')
df.dropna(axis=1, inplace=True)
df.head(10)
单特征缩放会将列的每个值转换为0到1之间的数字。新值是通过用当前值除以列的最大值计算得来。例如,如果我们考虑列 tamponi,我们可以通过对列应用函数 max() 来应用单特征缩放,该函数计算列的最大值:
df['tamponi'] = df['tamponi'] / df['tamponi'].max()
df
与单特征缩放类似,最小最大化将列的每个值转换为0到1之间的数字。新值是用当前值和最小值之间的差除以列值的范围(列的最大和最小值之间的差)计算得来的。例如,我们可以对列 totale_casi 应用最小最大化方法。
df['totale_casi'] = (df['totale_casi'] - df['totale_casi'].min()) / (df['totale_casi'].max() - df['totale_casi'].min())
df
z 分数将列的每个值转换为0左右的数字。通过z 分数转换得到的值范围通常是-3到3之间。新值是用当前值与平均值之差除以标准差计算得来的。平均值可以通过 mean() 函数得到,标准差可以通过 std() 函数得到。例如,我们可以计算列 deceduti 的 z 分数。
df['deceduti'] = (df['deceduti'] - df['deceduti'].mean()) / df['deceduti'].std()
df
现在我们可以计算由 z-score 变换得到的最小值和最大值:
print(f"The minimum: {df['deceduti'].min()}")
print(f"The maximum: {df['deceduti'].max()}")
对数缩放涉及将列转换为对数尺度。如果我们想使用自然对数,我们可以使用 numpy 库的 log() 函数。例如,我们可以对列 dimessi_guariti 应用日志缩放。这个过程中我们必须处理 log(0) 因为它不存在。我们使用 lambda 运算符来选择列的单行。
import numpy as np
df['dimessi_guariti'] = df['dimessi_guariti'].apply(lambda x: np.log(x) if x != 0 else 0)
df
裁剪涉及对低于或高于某一值的所有值进行封顶。当列中包含一些异常值时,剪切非常有用。我们可以设置最大值 vmax 和最小值 vmin,并将所有大于最大值的离群值设置为 vmax,将所有小于最小值的离群值设置为 vmin。例如,我们可以考虑列 ricoverati_con_sintomi,我们可以设置 vmax = 10000 和 vmin = 10。
vmax = 10000
vmin = 10
df['ricoverati_con_sintomi'] = df['ricoverati_con_sintomi'].apply(
lambda x: vmax if x > vmax else vmin if x < vmin else x)
df
在本教程中,我与你分享了用于执行数据规范化的不同技术:单特征缩放、最小最大化、z-score、对数缩放,裁剪。那么,你可能会问?什么是最好的技术?实际上,不存在一种绝对最好的技术,最好与否是相对的,选择取决于我们想要的输出。因此:
如果你觉得这篇文章对你有用,请分享➕点赞支持我,也让更多的人一起加入学习。如果你想了解数据预处理的其他方面,如数据分组(分箱)和数据标准化,请持续关注我......
示例数据获取:关注我,在公众号窗口回复关键字“covid-19”即可免费获取。赶快行动起来吧👏👏👏!


原文作者:数据派探险家;如有侵权,请联系管理员删除。