ITPub博客

首页 > 数据库 > 数据库开发技术 > Python Pandas数据预处理—Part 3:数据规范化

Python Pandas数据预处理—Part 3:数据规范化

原创 数据库开发技术 作者:jackzhang 时间:2023-11-26 07:00:00 0 删除 编辑

摘要:欢迎来到使用 Python pandas 进行数据预处理教程系列的第三部分——数据规范化。预处理是对数据进行预分析的过程,目的是将数据转换为标准且规范的格式。

数据预处理通常包括以下几个方面:

  • 缺失值处理
  • 数据格式化
  • 数据规范化
  • 数据标准化
  • 数据分箱

在本教程中我们主要关注数据规范化。前面的教程中,我们学习了缺失值处理(Python Pandas数据预处理—Part 1:缺失值处理)和数据格式化(Python Pandas数据预处理—Part 2:数据格式化)。

数据规范化包括将不同尺度的测量值调整到一个共同尺度。在处理数据框时,数据规范化允许将引用不同列的值调整为公共比例。当数据框的列被用作机器学习算法的输入特征时,强烈建议进行规范化操作,因为它允许为所有特征赋予相同的权重,消除异常值对模型训练结果的影响。

规范化仅适用于数值列。常见的规范化方法有以下五种:

  • 单特征缩放(single feature scaling)
  • 最小最大化(min max)
  • z 分数(z-score)
  • 对数缩放(log scaling)
  • 裁剪(clipping)

在本教程的剩余部分中,为了学习目的,我们会对单个列应用不同的规范化方法。然而,在实际项目中,如果你想将数据集的每一列用作机器学习算法的输入特征,你应该对所有列应用相同的规范化方法。

在本教程中,我们使用 pandas 库来执行规范化操作。还有另一种替代方法,你可以使用 scikit-learn 库的预处理方法。Tips:如果有读者想学习如何使用 scikit-learn 的预处理包,请留言告诉我。

一、数据准备(Data Preparation)

作为示例数据集,在本教程中,我们使用意大利 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)

二、单特征缩放(Single Feature Scaling)

单特征缩放会将列的每个值转换为0到1之间的数字。新值是通过用当前值除以列的最大值计算得来。例如,如果我们考虑列 tamponi,我们可以通过对列应用函数 max() 来应用单特征缩放,该函数计算列的最大值:

df['tamponi'] = df['tamponi'] / df['tamponi'].max()
df

三、最小最大化(Min Max)

与单特征缩放类似,最小最大化将列的每个值转换为0到1之间的数字。新值是用当前值和最小值之间的差除以列值的范围(列的最大和最小值之间的差)计算得来的。例如,我们可以对列 totale_casi 应用最小最大化方法。

df['totale_casi'] = (df['totale_casi'] - df['totale_casi'].min()) / (df['totale_casi'].max() - df['totale_casi'].min())
df

四、z 分数(z-score)

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()}")

五、对数缩放(Log Scaling)

对数缩放涉及将列转换为对数尺度。如果我们想使用自然对数,我们可以使用 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

六、裁剪(Clipping)

裁剪涉及对低于或高于某一值的所有值进行封顶。当列中包含一些异常值时,剪切非常有用。我们可以设置最大值 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

七、总结(Summary)

在本教程中,我与你分享了用于执行数据规范化的不同技术:单特征缩放、最小最大化、z-score、对数缩放,裁剪。那么,你可能会问?什么是最好的技术?实际上,不存在一种绝对最好的技术,最好与否是相对的,选择取决于我们想要的输出。因此:

  • 如果你想要一个介于0和1之间的输出,你应该使用单特征缩放或最小最大化。
  • 如果你希望输出在0左右,其中也包括负值,则应该使用 z-score。
  • 如果数据包含许多异常值,则可以使用裁剪。
  • 如果想更改数据的尺度(比例),可以使用对数缩放。

如果你觉得这篇文章对你有用,请分享➕点赞支持我,也让更多的人一起加入学习。如果你想了解数据预处理的其他方面,如数据分组(分箱)和数据标准化,请持续关注我......

示例数据获取:关注我,在公众号窗口回复关键字“covid-19”即可免费获取。赶快行动起来吧👏👏👏!


往期推荐⬇️⬇️⬇️
Python Pandas数据预处理—Part 2:数据格式化
Python Pandas数据预处理—Part 1:缺失值处理
7个实用示例让你轻松玩转SQL中的GROUP BY
关系数据库中的存储过程
掌握SQL:小项目—应用你的SQL技能

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

请登录后发表评论 登录
全部评论

注册时间:2017-12-19

  • 博文量
    119
  • 访问量
    55956