6 数据预处理之数据转换与归一化

在数据挖掘的过程中,数据预处理是一个不可或缺的环节。我们在上一篇中讨论了如何处理缺失值,确保数据集中每一个样本都有尽可能完整的信息。这一部分将重点介绍数据预处理中的一个重要方面——数据转换与归一化。我们会探讨这些步骤如何帮助提高后续建模的效果,并结合实例和代码更好地理解这些概念。

数据转换

数据转换是指对数据进行某种形式的变换,以便使其更加适合于模型的训练或分析。常见的转换操作包括:

  1. 对数变换:通常用于处理右偏分布的数值特征,能够减小极端值的影响。

    例如,考虑某企业的收入数据,其分布可能高度右偏。这时,我们可以使用对数变换:

    $$ X’ = \log(X + 1) $$

    这里的 ‘+1’ 是为了避免对数零不能计算的问题。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import pandas as pd
    import numpy as np

    # 创建数据框
    df = pd.DataFrame({'收入': [5000, 10000, 150000, 2000000]})

    # 进行对数变换
    df['收入_log'] = np.log(df['收入'] + 1)
    print(df)
  2. 平方根变换:另一种常见的处理偏态数据的方法,尤其对于数据都为正的情况。

    $$ X’ = \sqrt{X} $$

  3. 标准化:标准化是对特征进行线性变换,使其均值为 0,方差为 1,这一过程使得不同尺度的特征可以比较。

    $$ X’ = \frac{X - \mu}{\sigma} $$

    其中 $\mu$ 是特征的均值,$\sigma$ 是特征的标准差。

    1
    2
    3
    4
    5
    6
    7
    from sklearn.preprocessing import StandardScaler

    # 示例数据
    data = np.array([[1, 2], [2, 3], [3, 4]])
    scaler = StandardScaler()
    standardized_data = scaler.fit_transform(data)
    print(standardized_data)

归一化

与标准化相似,归一化是另一种常用的数据预处理技术,特别适用于在一个固定范围内缩放特征。归一化的常见方法是 Min-Max 归一化,它将特征缩放到 [0, 1] 区间。

$$ X’ = \frac{X - X_{min}}{X_{max} - X_{min}} $$

这种方式尤其适用于需要保持原特征分布形态的情况,并且在使用一些基于距离的算法(如 KNN、SVM 等)时,归一化会显著提高模型的表现。

1
2
3
4
5
6
7
from sklearn.preprocessing import MinMaxScaler

# 示例数据
data = np.array([[1, 2], [2, 3], [3, 4]])
scaler = MinMaxScaler()
normalized_data = scaler.fit_transform(data)
print(normalized_data)

实际案例

假设我们在开展客户离职预测的项目,在数据集中我们有多种特征,例如客户的年龄、年收入、账户余额等。这些特征的取值范围与数据分布差异较大,直接投入模型可能导致模型的性能不佳。因此,适当地进行数据转换与归一化是非常必要的。

  1. 数据转换:我们首先对年收入进行对数变换,以便减小其与其它特征的差异。
  2. 数据归一化:我们使用 Min-Max 归一化对年龄和账户余额进行处理,这样做能够保证每个特征的数值范围更为一致。

下面是一个完整的数据预处理示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler

# 创建客户数据集
data = pd.DataFrame({
'客户ID': [1, 2, 3, 4],
'年龄': [25, 45, 35, 23],
'年收入': [5000, 10000, 150000, 2000000],
'账户余额': [100, 1500, 3000, 50000]
})

# 年收入对数变换
data['年收入_log'] = np.log(data['年收入'] + 1)

# 对年龄和账户余额进行 Min-Max 归一化
scaler = MinMaxScaler()
data[['年龄', '账户余额']] = scaler.fit_transform(data[['年龄', '账户余额']])

print(data)

小结

在这部分中,我们详细介绍了数据转换与归一化的概念以及常用的方法。通过对数据进行适当的变换与缩放,能够让后续的模型训练更加高效,提高数据的可预测性,同时也能够减少不同特征之间的干扰。在数据处理完成后,我们可以进入下一步,进行探索性数据分析的描述性分析,以深入理解数据的特征与趋势,为模型选择提供支持。

接下来,我们将探讨探索性数据分析之描述性分析的内容。

6 数据预处理之数据转换与归一化

https://zglg.work/data-mining-zero/6/

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-11

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论