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

3.3.3  数据转换和规范化

数据转换和规范化是数据预处理的重要步骤,用于将原始数据转化为适合机器学习模型训练的格式,同时对数据进行标准化和处理,以提高模型的性能和稳定性。下面是实现数据转换和规范化的一些常见步骤和方法:

  1. 特征缩放:特征缩放是将特征的值范围缩放到一定范围内,常用的方法有标准化(Z-Score标准化)和归一化(Min-Max归一化)。
  2. 数据转换:数据转换包括将分类特征转换为数值特征、进行独热编码、创建多项式特征等操作,以便模型能够更好地处理这些特征。
  3. 处理缺失值:缺失值是现实世界数据中常见的问题,可以通过删除、填充或者使用插值等方法进行处理。
  4. 离群值处理:离群值可能会影响模型的训练结果,可以使用截尾、替换或者离群值检测算法进行处理。
  5. 特征构造:创建新的特征可以提供更多有用的信息,例如从时间戳中提取小时、工作日等。
  6. 文本处理:对于文本数据,可以进行分词、停用词处理、词向量化等操作。
  7. 降维:对于高维数据,可以使用降维方法(如主成分分析PCA)减少特征数量。
  8. 数据标准化:对于数值特征,可以进行标准化,使其均值为0,方差为1,以减少不同特征之间的差异。
  9. 数据归一化:将数据映射到特定范围,常用于深度学习中的图像数据。
  10. 时间序列处理:时间序列数据可以进行滑动窗口、lag特征等处理。

数据转换和规范化的具体方法会根据数据的类型和问题的需求而有所不同。使用工具如TensorFlow Transform可以帮助自动化这些步骤,以保证数据的一致性和准确性。例如下面是一个使用TensorFlow Transform实现数据转换和规范化的例子,假设我们有一个包含数值特征的CSV文件data.csv的内容如下:

feature1,feature2,label
10,0.5,1
20,,0
30,0.2,1
,,0

实例3-4实现数据转换和规范化处理(源码路径:daima/3/zhuangui.py)

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

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

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

# 定义数据预处理函数,进行特征缩放和归一化处理
def preprocessing_fn(inputs):
    processed_features = {
        'feature1_scaled': tft.scale_to_z_score(inputs['feature1']),
        'feature2_normalized': tft.scale_to_0_1(tft.impute(inputs['feature2'], tft.constants.INT_MIN)),
        'label': inputs['label']
    }
    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)

对上述代码的具体说明如下:

  1. 定义CSV文件读取和解析函数:parse_csv函数用于解析CSV行,将其解码为特征字典。这里假设CSV文件的每一行包含3个字段:feature1、feature2和label。
  2. 定义特征元数据:feature_spec指定了特征的名称和数据类型。
  3. 定义数据预处理函数:preprocessing_fn函数对输入特征进行预处理。在这个例子中,'feature1'特征被缩放到标准正态分布(Z-Score标准化),'feature2'特征被缩放到0到1的范围内(归一化),并且对缺失值进行处理(用tft.constants.INT_MIN填充)。
  4. 读取CSV文件并应用预处理:preprocess_data函数使用Beam数据管道读取CSV文件数据,并将数据应用到预处理函数中。使用TensorFlow Transform的AnalyzeAndTransformDataset函数进行数据转换和规范化处理,同时生成转换后的元数据。
  5. 定义数据管道:使用Beam库创建数据管道,并调用preprocess_data函数进行数据预处理。
  6. 显示处理后的数据和元数据:遍历处理后的数据,打印每个样本的处理结果,以及转换后的元数据模式。

执行后会输出:

{'feature1_scaled': 0.0, 'feature2_normalized': 0.5, 'label': 1}
{'feature1_scaled': 0.7071067690849304, 'feature2_normalized': 0.0, 'label': 0}
{'feature1_scaled': 1.4142135381698608, 'feature2_normalized': 0.1, 'label': 1}
{'feature1_scaled': -0.7071067690849304, 'feature2_normalized': 0.0, 'label': 0}
Transformed Metadata: Schema(feature {
  name: "feature1_scaled"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
}
feature {
  name: "feature2_normalized"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
}
feature {
  name: "label"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
}
, generated_feature {
  name: "feature1_scaled"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
}
generated_feature {
  name: "feature2_normalized"
  type: FLOAT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
}
generated_feature {
  name: "label"
  type: INT
  presence {
    min_fraction: 1.0
    min_count: 1
  }
}
)

上述输出显示了经过处理的数据样本和转换后的元数据。注意,处理后的特征值和元数据模式可能会因实际数据的不同而有所变化。

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