数据标准化处理代码解析

在数据分析和机器学习领域,数据标准化是一个重要的预处理步骤,它可以使不同特征的数据具有可比性,提高模型的性能。本文将详细解析一段Python代码,该代码实现了对用户每月支出数据的三种标准化方法:离差标准化、标准差标准化和小数定标标准化。

课前预习

当然可以!下面为你详细解释离差标准化、标准差标准化和小数定标标准化,并给出简单的例子。

1. 离差标准化(Min - Max Scaling)

在这里插入图片描述

离差标准化是将数据缩放到[0, 1]区间的一种方法。其公式为:
[
X_{scaled} = \frac{X - X_{min}}{X_{max} - X_{min}}
]

示例
假设有一组数据:[10, 20, 30, 40, 50]

  • 首先,找出最小值 X m i n = 10 X_{min}=10 Xmin=10和最大值 X m a x = 50 X_{max}=50 Xmax=50
  • 对于数据点10,标准化后的值为: 10 − 10 50 − 10 = 0 \frac{10 - 10}{50 - 10} = 0 50101010=0
  • 对于数据点20,标准化后的值为: 20 − 10 50 − 10 = 0.25 \frac{20 - 10}{50 - 10} = 0.25 50102010=0.25
  • 对于数据点30,标准化后的值为: 30 − 10 50 − 10 = 0.5 \frac{30 - 10}{50 - 10} = 0.5 50103010=0.5
  • 对于数据点40,标准化后的值为: 40 − 10 50 − 10 = 0.75 \frac{40 - 10}{50 - 10} = 0.75 50104010=0.75
  • 对于数据点50,标准化后的值为: 50 − 10 50 − 10 = 1 \frac{50 - 10}{50 - 10} = 1 50105010=1

以下是使用Python实现的代码:

import numpy as np

data = np.array([10, 20, 30, 40, 50])
min_val = data.min()
max_val = data.max()
scaled_data = (data - min_val) / (max_val - min_val)
print("离差标准化后的数据:", scaled_data)

结果

在这里插入图片描述

2. 标准差标准化(Standard Scaling)

在这里插入图片描述

标准差标准化是将数据转换为均值为0,标准差为1的标准正态分布。其公式为:
[
X_{scaled} = \frac{X - \mu}{\sigma}
]
其中, μ \mu μ是数据的均值, σ \sigma σ是数据的标准差。

示例
假设有一组数据:[10, 20, 30, 40, 50]

  • 首先,计算均值 μ = 10 + 20 + 30 + 40 + 50 5 = 30 \mu = \frac{10 + 20 + 30 + 40 + 50}{5} = 30 μ=510+20+30+40+50=30
  • 然后,计算标准差 σ = ( 10 − 30 ) 2 + ( 20 − 30 ) 2 + ( 30 − 30 ) 2 + ( 40 − 30 ) 2 + ( 50 − 30 ) 2 5 ≈ 14.14 \sigma=\sqrt{\frac{(10 - 30)^2+(20 - 30)^2+(30 - 30)^2+(40 - 30)^2+(50 - 30)^2}{5}}\approx14.14 σ=5(1030)2+(2030)2+(3030)2+(4030)2+(5030)2 14.14
  • 对于数据点10,标准化后的值为: 10 − 30 14.14 ≈ − 1.41 \frac{10 - 30}{14.14}\approx - 1.41 14.1410301.41
  • 对于数据点20,标准化后的值为: 20 − 30 14.14 ≈ − 0.71 \frac{20 - 30}{14.14}\approx - 0.71 14.1420300.71
  • 对于数据点30,标准化后的值为: 30 − 30 14.14 = 0 \frac{30 - 30}{14.14}=0 14.143030=0
  • 对于数据点40,标准化后的值为: 40 − 30 14.14 ≈ 0.71 \frac{40 - 30}{14.14}\approx0.71 14.1440300.71
  • 对于数据点50,标准化后的值为: 50 − 30 14.14 ≈ 1.41 \frac{50 - 30}{14.14}\approx1.41 14.1450301.41

以下是使用Python实现的代码:

import numpy as np

data = np.array([10, 20, 30, 40, 50])
mean_val = data.mean()
std_val = data.std()
scaled_data = (data - mean_val) / std_val
print("标准差标准化后的数据:", scaled_data)

结果

在这里插入图片描述

3. 小数定标标准化(Decimal Scaling)

在这里插入图片描述

小数定标标准化通过移动小数点的位置来进行数据缩放。其公式为:
[
X_{scaled} = \frac{X}{10^j}
]
其中, j j j是满足 10 j ≥ max ⁡ ( ∣ X ∣ ) 10^j\geq\max(|X|) 10jmax(X)的最小整数。

示例
假设有一组数据:[10, 20, 30, 40, 50]

  • 首先,找出数据的绝对值的最大值 max ⁡ ( ∣ X ∣ ) = 50 \max(|X|)=50 max(X)=50
  • 因为 10 2 = 100 ≥ 50 10^2 = 100\geq50 102=10050,所以 j = 2 j = 2 j=2
  • 对于数据点10,标准化后的值为: 10 10 2 = 0.1 \frac{10}{10^2}=0.1 10210=0.1
  • 对于数据点20,标准化后的值为: 20 10 2 = 0.2 \frac{20}{10^2}=0.2 10220=0.2
  • 对于数据点30,标准化后的值为: 30 10 2 = 0.3 \frac{30}{10^2}=0.3 10230=0.3
  • 对于数据点40,标准化后的值为: 40 10 2 = 0.4 \frac{40}{10^2}=0.4 10240=0.4
  • 对于数据点50,标准化后的值为: 50 10 2 = 0.5 \frac{50}{10^2}=0.5 10250=0.5

以下是使用Python实现的代码:

import numpy as np

# 创建示例数据
data = np.array([10, 20, 30, 40, 50])

# 计算小数定标标准化所需的缩放指数 j
# 步骤:
# 1. np.abs(data).max():获取数据绝对值的最大值(50)
# 2. np.log10(...):计算以10为底的对数(约1.69897)
# 3. np.ceil(...):向上取整得到最小整数指数 j=2
j = np.ceil(np.log10(np.abs(data).max()))

# 执行小数定标标准化:将原始数据除以 10^j
# 此处 10^j = 10^2 = 100,因此每个数据点都除以100
scaled_data = data / (10 ** j)

# 输出标准化后的结果,范围在 [-1, 1] 之间
print("小数定标标准化后的数据:", scaled_data)

结果

在这里插入图片描述

这些标准化方法在数据预处理中非常有用,可以帮助提高机器学习模型的性能。

代码整体概述

代码主要使用了pandasnumpy库,从CSV文件中读取用户每月支出信息,对数据进行清洗和预处理,然后分别使用自定义的函数对每月支出数据进行三种标准化处理,并打印出标准化前后的数据。

代码详细解析

1. 导入必要的库

import pandas as pd
import numpy as np
  • 代码解释
    • import pandas as pd:导入pandas库并将其重命名为pdpandas是一个强大的数据处理和分析库,用于读取、处理和分析表格数据。
    • import numpy as np:导入numpy库并将其重命名为npnumpy是Python的一个科学计算库,提供了高效的数组操作和数学函数。

2. 读取数据并进行预处理

try:
    pay = pd.read_csv('./data/user_pay_info.csv', index_col=0)
    # 确保每月支出列是数值类型
    pay['每月支出'] = pd.to_numeric(pay['每月支出'], errors='coerce')
    pay = pay.dropna(subset=['每月支出'])
  • 代码解释
    • pd.read_csv('./data/user_pay_info.csv', index_col=0):使用pandasread_csv函数从CSV文件中读取数据,并将第一列作为索引列。
    • pd.to_numeric(pay['每月支出'], errors='coerce'):将每月支出列的数据转换为数值类型,errors='coerce'表示如果遇到无法转换的值,将其转换为NaN
    • pay.dropna(subset=['每月支出']):删除每月支出列中包含NaN值的行。

3. 离差标准化

    # 自定义离差标准化函数
    def min_max_scale(data):
        data = (data - data.min()) / (data.max() - data.min())
        return data

    # 对用户每月支出信息表的每月支出数据做离差标准化
    pay_min_max = min_max_scale(pay['每月支出'])
    print('离差标准化之前每月支出数据为:\n', pay['每月支出'].head())
    print('离差标准化之后每月支出数据为\n', pay_min_max.head())
  • 代码解释
    • min_max_scale函数:自定义的离差标准化函数,公式为 x s c a l e d = x − x m i n x m a x − x m i n x_{scaled}=\frac{x - x_{min}}{x_{max}-x_{min}} xscaled=xmaxxminxxmin,将数据缩放到[0, 1]区间。
    • min_max_scale(pay['每月支出']):调用min_max_scale函数对每月支出列的数据进行离差标准化。
    • print语句:打印离差标准化前后的每月支出数据的前几行。

4. 标准差标准化

    # 自定义标准差标准化函数
    def standard_scaler(data):
        std = data.std()
        if std == 0:
            return pd.Series([0] * len(data), index=data.index)
        data = (data - data.mean()) / std
        return data

    # 对用户每月支出信息表的每月支出数据做标准差标准化
    pay_standard = standard_scaler(pay['每月支出'])
    print('标准差标准化之前每月支出数据为:\n', pay['每月支出'].head())
    print('标准差标准化之后每月支出数据为:\n', pay_standard.head())
  • 代码解释
    • standard_scaler函数:自定义的标准差标准化函数,公式为 x s c a l e d = x − μ σ x_{scaled}=\frac{x - \mu}{\sigma} xscaled=σxμ,其中 μ \mu μ 是数据的均值, σ \sigma σ 是数据的标准差。如果标准差为0,则将所有数据置为0。
    • standard_scaler(pay['每月支出']):调用standard_scaler函数对每月支出列的数据进行标准差标准化。
    • print语句:打印标准差标准化前后的每月支出数据的前几行。

5. 小数定标标准化

    # 自定义小数定标标准化函数
    def decimal_scaler(data):
        data = data / 10 ** np.ceil(np.log10(data.abs().max()))
        return data

    # 对用户每月支出信息表的每月支出数据做小数定标标准化
    pay_decimal = decimal_scaler(pay['每月支出'])
    print('小数定标标准化之前的每月支出数据:\n', pay['每月支出'].head())
    print('小数定标标准化之后的每月支出数据:\n', pay_decimal.head())

except FileNotFoundError:
    print("错误:未找到文件,请检查文件路径。")
except Exception as e:
    print(f"发生未知错误:{e}")
  • 代码解释
    • decimal_scaler函数:自定义的小数定标标准化函数,公式为 x s c a l e d = x 10 j x_{scaled}=\frac{x}{10^j} xscaled=10jx,其中 j j j 是满足 10 j ≥ max ⁡ ( ∣ x ∣ ) 10^j \geq \max(|x|) 10jmax(x) 的最小整数。
    • decimal_scaler(pay['每月支出']):调用decimal_scaler函数对每月支出列的数据进行小数定标标准化。
    • print语句:打印小数定标标准化前后的每月支出数据的前几行。
    • except语句:捕获文件未找到错误和其他未知错误,并打印相应的错误信息。

结果

在这里插入图片描述

总结

通过本文的代码解析,我们学习了如何使用Python对数据进行三种常见的标准化处理:离差标准化、标准差标准化和小数定标标准化。读者在学习后能够掌握以下知识和技能:

  • 学会使用pandasnumpy库进行数据读取、处理和分析。
  • 理解离差标准化、标准差标准化和小数定标标准化的原理和实现方法。
  • 掌握自定义函数的编写和调用,以及异常处理的方法。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐