(3-3-01)数据标准化与归一化

数据标准化和归一化是常用的数据预处理技术,用于将数据调整为特定范围或分布,以便于模型的训练和优化。

3.3.1  标准化与其重要性

标准化是数据预处理中的一项重要技术,它对于训练和优化机器学习模型具有重要作用。下面列出了标准化的重要性及其影响信息:

  1. 消除量纲差异: 不同特征的单位和范围可能会导致模型受到某些特征的影响更大。标准化可以将所有特征调整为相同的尺度,消除量纲差异,使得模型更能关注特征的本质信息。
  2. 提高模型收敛速度: 标准化可以使特征的值分布在相对小的范围内,有助于模型的优化算法更快地收敛。这对于迭代算法,如梯度下降,尤其重要。
  3. 降低异常值影响: 标准化可以降低异常值的影响,因为异常值通常与其他数据差异较大。标准化后,异常值的影响将减小。
  4. 提高模型表现: 一些机器学习算法对数据的分布和尺度敏感,标准化可以帮助模型更好地拟合数据,提高模型的性能。
  5. 增强特征重要性: 在一些模型中,特征的重要性是根据其值的范围来计算的。标准化可以确保所有特征都对模型的预测具有相似的影响。
  6. 加速模型训练: 数据标准化可以提高模型的训练速度,因为优化算法在标准化后的数据上更容易收敛。

总之,数据标准化对于提高模型的训练效率和性能非常重要。在训练机器学习模型之前,通常建议对数据进行标准化,以获得更好的结果。不过,需要根据具体情况考虑是否进行标准化,因为某些模型可能对数据的尺度和分布不敏感。

3.3.2  特征缩放和归一化

特征缩放和归一化是数据预处理中常用的技术,用于将特征的值范围调整到一定范围内,以便提高模型的训练效果。在TensorFlow Transform中,可以使用tft.scale_to_z_score和tft.scale_to_0_1等函数来实现特征缩放和归一化。

1. 特征缩放

特征缩放是将特征的值缩放到一定的范围,通常是将特征值映射到均值为0,标准差为1的正态分布。这有助于减少特征值之间的差异,使模型更稳定地进行训练。在TensorFlow Transform中,函数tft.scale_to_z_score()用于将特征缩放到标准正态分布,使用格式如下:

processed_features = {
    'feature1': tft.scale_to_z_score(inputs['feature1']),
    # 其他特征处理
}

2. 归一化

归一化是将特征的值映射到0到1的范围内,通常通过将特征值减去最小值,再除以最大值与最小值之差。这有助于保持特征值之间的相对关系,并且适用于一些模型(例如神经网络)的输入。在TensorFlow Transform中,函数tft.scale_to_0_1()用于将特征归一化到0到1的范围,使用格式如下:

processed_features = {
    'feature2': tft.scale_to_0_1(inputs['feature2']),
    # 其他特征处理
}

在实际应用中,我们可以根据数据的特点和模型的需求,选择适当的特征缩放或归一化方法。这些预处理技术有助于提高模型的收敛速度和稳定性,从而改善模型的性能。在使用TensorFlow Transform进行数据预处理时,可以将这些函数嵌入到preprocessing_fn中,以便对特征进行合适的处理。

请看下面的实例,演示了TensorFlow Transform使用函数scale_to_z_score和函数scale_to_0_1进行特征缩放和归一化处理的过程。

实例3-3:使用TensorFlow选择鸢尾花分类的最佳模型(源码路径:daima/3/suogui.py)

实例文件suogui.py的具体实现代码如下所示

# 定义CSV文件读取和解析函数
def parse_csv(csv_row):
    columns = tf.io.decode_csv(csv_row, record_defaults=[[0], [0.0], [0]])
    return {
        'area': columns[0],
        'rooms': columns[1],
        'price': columns[2]
    }


# 定义特征元数据
feature_spec = {
    'area': tf.io.FixedLenFeature([], tf.int64),
    'rooms': tf.io.FixedLenFeature([], tf.float32),
    'price': tf.io.FixedLenFeature([], tf.int64),
}


# 定义数据预处理函数,处理特征缩放和归一化
def preprocessing_fn(inputs):
    processed_features = {
        'area_scaled': tft.scale_to_z_score(inputs['area']),
        'rooms_normalized': tft.scale_to_0_1(inputs['rooms']),
        'price': inputs['price']
    }
    return processed_features


# 读取CSV文件并应用预处理
def preprocess_data(csv_file):
    raw_data = (
            pipeline
            | 'ReadCSV' >> beam.io.ReadFromText(csv_file)
            | 'ParseCSV' >> beam.Map(parse_csv)
    )

    with tft_beam.Context(temp_dir=tempfile.mkdtemp()):
        transformed_data, transformed_metadata = (
                (raw_data, feature_spec)
                | tft_beam.AnalyzeAndTransformDataset(preprocessing_fn)
        )

    return transformed_data, transformed_metadata


# 定义数据管道
with beam.Pipeline() as pipeline:
    transformed_data, transformed_metadata = preprocess_data('data.csv')

# 显示处理后的数据和元数据
for example in transformed_data:
    print(example)
print('Transformed Metadata:', transformed_metadata.schema)

在这个例子中,'area'特征被缩放到标准正态分布,'rooms'特征被归一化到0到1的范围内。其余的'price'特征保持不变。执行代码后,将看到处理后的数据样本以及转换后的元数据模式:

{'area_scaled': -0.331662684, 'rooms_normalized': 0.6, 'price': 250000}
{'area_scaled': -0.957780719, 'rooms_normalized': 0.0, 'price': 200000}
{'area_scaled': 0.294811219, 'rooms_normalized': 0.8, 'price': 300000}
{'area_scaled': 1.378632128, 'rooms_normalized': 0.0, 'price': 180000}
Transformed Metadata: (schema definition)

在上面的输出结果中,'area_scaled'特征已经被缩放到标准正态分布范围内,'rooms_normalized'特征已经归一化到0到1的范围内,'price'特征保持不变。同时,您还会看到转换后的元数据模式。请注意,实际输出可能会因数据和处理方式而有所不同。这些处理后的数据可以作为输入供机器学习模型进行训练,从而提高模型的稳定性和性能。

请看下面的例子,展示了使用PyTorch进行特征缩放和归一化处理的过程。

实例3-3使用PyTorch进行特征缩放和归一化处理(源码路径:daima/3/tsuogui.py)

实例文件tsuogui.py的具体实现代码如下所示

import torch
# 原始数据
data = torch.tensor([[1.0, 2.0, 3.0],
                     [4.0, 5.0, 6.0],
                     [7.0, 8.0, 9.0]])

# 特征缩放:将数据缩放到0-1范围
min_val = data.min()
max_val = data.max()
scaled_data = (data - min_val) / (max_val - min_val)

# 归一化:将数据归一化到均值0、标准差1
mean = scaled_data.mean()
std = scaled_data.std()
normalized_data = (scaled_data - mean) / std

print("原始数据:\n", data)
print("特征缩放和归一化后的数据:\n", normalized_data)

在本实例中,使用手动方式进行了特征缩放和归一化处理。特征缩放通过计算数据的最小值和最大值,并将数据缩放到0-1范围。归一化通过计算数据的均值和标准差,然后将数据减去均值并除以标准差,使数据归一化到均值0、标准差1的范围。最终,打印输出原始数据和处理后的数据。这样的处理可以提供更好的数据分布,有助于模型的训练和性能提升。执行后会输出:

原始数据:
 tensor([[1., 2., 3.],
        [4., 5., 6.],
        [7., 8., 9.]])
特征缩放和归一化后的数据:
 tensor([[-1.4606, -1.0954, -0.7303],
        [-0.3651,  0.0000,  0.3651],
        [ 0.7303,  1.0954,  1.4606]])

你可能感兴趣的:(大模型从入门到实战,人工智能,大数据,python,算法,机器学习)