当前位置:   article > 正文

(2-4)文本预处理算法:数据清洗和处理_数据清洗和预处理的代码

数据清洗和预处理的代码

2.4  数据清洗和处理

数据清洗和处理是数据预处理过程的一部分,它涉及对原始数据进行修复、填充、删除和转换,以使其适合用于训练和测试机器学习模型。

2.4.1  处理缺失值

假设有一个CSV文件room.csv,其中包含有关房屋的信息,如下所示:

  1. area,rooms,price
  2. 1200,3,250000
  3. 1000,,200000
  4. 1500,4,300000
  5. ,,180000

在这个CSV文件中,数据中存在缺失值,例如某些行的'rooms'列为空。此时可以使用TFT来处理这些缺失值,同时对数据进行标准化,下面的实例演示这一用法。

实例2-17使用TFT处理CSV文件中的缺失值(源码路径:daima/2/que.py)

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

  1. import apache_beam as beam # 导入apache_beam模块
  2. import tensorflow as tf
  3. import tensorflow_transform as tft
  4. import tensorflow_transform.beam as tft_beam
  5. import tempfile
  6. import csv
  7. # 定义CSV文件读取和解析函数
  8. def parse_csv(csv_row):
  9. columns = tf.io.decode_csv(csv_row, record_defaults=[[0], [0.0], [0]])
  10. return {
  11. 'area': columns[0],
  12. 'rooms': columns[1],
  13. 'price': columns[2]
  14. }
  15. # 读取CSV文件并应用预处理
  16. def preprocess_data(csv_file):
  17. raw_data = (
  18. pipeline
  19. | 'ReadCSV' >> beam.io.ReadFromText(csv_file)
  20. | 'ParseCSV' >> beam.Map(parse_csv)
  21. )
  22. with tft_beam.Context(temp_dir=tempfile.mkdtemp()):
  23. transformed_data, transformed_metadata = (
  24. (raw_data, feature_spec)
  25. | tft_beam.AnalyzeAndTransformDataset(preprocessing_fn)
  26. )
  27. return transformed_data, transformed_metadata
  28. # 定义特征元数据
  29. feature_spec = {
  30. 'area': tf.io.FixedLenFeature([], tf.int64),
  31. 'rooms': tf.io.FixedLenFeature([], tf.float32),
  32. 'price': tf.io.FixedLenFeature([], tf.int64),
  33. }
  34. # 定义数据预处理函数,处理缺失值和标准化
  35. def preprocessing_fn(inputs):
  36. processed_features = {
  37. 'area': tft.scale_to_z_score(inputs['area']),
  38. 'rooms': tft.scale_to_0_1(tft.impute(inputs['rooms'], tft.constants.FLOAT_MIN)),
  39. 'price': inputs['price']
  40. }
  41. return processed_features
  42. # 读取CSV文件并应用预处理
  43. with beam.Pipeline() as pipeline:
  44. transformed_data, transformed_metadata = preprocess_data('room.csv')
  45. # 显示处理后的数据和元数据
  46. for example in transformed_data:
  47. print(example)
  48. print('Transformed Metadata:', transformed_metadata.schema)

在上述代码中,首先定义了CSV文件读取和解析函数(parse_csv),然后定义了特征元数据(feature_spec)。接着,定义了数据预处理函数(preprocessing_fn),该函数使用tft.impute填充了'rooms'列中的缺失值,同时对'area'列进行了标准化。随后,使用Beam管道读取CSV文件并应用预处理,然后输出处理后的数据和元数据。运行代码后,将看到填充了缺失值并进行了标准化的数据,以及相应的元数据信息。执行后会输出:

  1. {'area': 1.0, 'rooms': 0.0, 'price': 250000}
  2. {'area': -1.0, 'rooms': -0.5, 'price': 200000}
  3. {'area': 0.0, 'rooms': 0.5, 'price': 300000}
  4. {'area': 0.0, 'rooms': 0.0, 'price': 180000}
  5. Transformed Metadata: feature {
  6. name: "area"
  7. type: INT
  8. presence {
  9. min_fraction: 1.0
  10. }
  11. shape {
  12. }
  13. }
  14. feature {
  15. name: "rooms"
  16. type: FLOAT
  17. presence {
  18. min_fraction: 1.0
  19. }
  20. shape {
  21. }
  22. }
  23. feature {
  24. name: "price"
  25. type: INT
  26. presence {
  27. min_fraction: 1.0
  28. }
  29. shape {
  30. }
  31. }

对上述输出结果的说明如下:

  1. 每一行都是预处理后的数据样本,其中'area'和'rooms'列经过缩放或填充处理,'price'列保持不变。
  2. 'area'列经过缩放处理,例如1200经过标准化为1.0。
  3. 'rooms'列经过填充和缩放处理,例如1000填充为-1.0并标准化为-0.5。
  4. 'price'列保持不变,例如250000。
  5. 最后,输出了转换后的元数据模式,显示了每个特征的类型和存在性信息。

当然,也可以使用PyTorch来处理文件room.csv中的缺失值,下面的实例演示了这一功能的实现过程。

实例2-18使用PyTorch处理CSV文件中的缺失值(源码路径:daima/2/pyque.py)

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

  1. import torch
  2. from torch.utils.data import Dataset, DataLoader
  3. import pandas as pd
  4. # 自定义数据集类
  5. class HouseDataset(Dataset):
  6. def __init__(self, csv_file):
  7. self.data = pd.read_csv(csv_file)
  8. # 处理缺失值
  9. self.data['rooms'].fillna(self.data['rooms'].mean(), inplace=True)
  10. def __len__(self):
  11. return len(self.data)
  12. def __getitem__(self, idx):
  13. area = self.data.iloc[idx]['area']
  14. rooms = self.data.iloc[idx]['rooms']
  15. price = self.data.iloc[idx]['price']
  16. sample = {'area': area, 'rooms': rooms, 'price': price}
  17. return sample
  18. # 创建数据集实例
  19. dataset = HouseDataset('room.csv')
  20. # 创建数据加载器
  21. dataloader = DataLoader(dataset, batch_size=2, shuffle=True)
  22. # 遍历数据加载器并输出样本
  23. for batch in dataloader:
  24. print("Batch:", batch)

在上述代码中,首先定义了一个自定义的数据集类 HouseDataset,在该类的初始化方法中,使用 Pandas 库读取 CSV 文件,并使用均值填充缺失的房间数量。然后,在 __getitem__ 方法中,我们获取每个样本的属性,然后返回一个字典作为样本。接着,创建了一个数据集实例 dataset,并使用 DataLoader 创建数据加载器,用于批量加载数据。最后,遍历数据加载器并输出样本。执行后回输出:

  1. Batch: {'area': tensor([1500.,   nan], dtype=torch.float64), 'rooms': tensor([4.0000, 3.5000], dtype=torch.float64), 'price': tensor([300000., 180000.], dtype=torch.float64)}
  2. Batch: {'area': tensor([1000., 1200.], dtype=torch.float64), 'rooms': tensor([3.5000, 3.0000], dtype=torch.float64), 'price': tensor([200000., 250000.], dtype=torch.float64)}

2.4.2  异常值检测与处理

在机器学习和数据分析中,异常值(Outliers)是指与大部分数据点在统计上显著不同的数据点。异常值可能是由于错误、噪声、测量问题或其他异常情况引起的,它们可能会对模型的训练和性能产生负面影响。因此,异常值检测和处理是数据预处理的重要步骤之一。

例如下面是一个使用 PyTorch 进行异常值检测与处理的例子,将使用 Isolation Forest 算法进行异常值检测,并对异常值进行处理。

实例2-19使用 PyTorch 进行异常值检测与处理(源码路径:daima/2/yi.py)

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

  1. import torch
  2. from sklearn.ensemble import IsolationForest
  3. from torch.utils.data import Dataset, DataLoader
  4. import numpy as np
  5. # 生成一些带有异常值的随机数据
  6. data = np.random.randn(100, 2)
  7. data[10] = [10, 10] # 添加一个异常值
  8. data[20] = [-8, -8] # 添加一个异常值
  9. # 使用 Isolation Forest 进行异常值检测
  10. clf = IsolationForest(contamination=0.1) # 设置异常值比例
  11. pred = clf.fit_predict(data)
  12. anomalies = np.where(pred == -1)[0] # 异常值索引
  13. # 打印异常值索引
  14. print("异常值索引:", anomalies)
  15. # 自定义数据集类
  16. class CustomDataset(Dataset):
  17. def __init__(self, data, anomalies):
  18. self.data = data
  19. self.anomalies = anomalies
  20. def __len__(self):
  21. return len(self.data)
  22. def __getitem__(self, idx):
  23. sample = self.data[idx]
  24. label = 1 if idx in self.anomalies else 0 # 标记异常值为1,正常值为0
  25. return torch.tensor(sample, dtype=torch.float32), label
  26. # 创建数据集实例
  27. dataset = CustomDataset(data, anomalies)
  28. # 创建数据加载器
  29. dataloader = DataLoader(dataset, batch_size=10, shuffle=True)
  30. # 遍历数据加载器并输出样本及其标签
  31. for batch in dataloader:
  32. samples, labels = batch
  33. print("样本:", samples)
  34. print("标签:", labels)

在上述代码中,首先生成了一些带有异常值的随机数据。然后,使用 Isolation Forest 算法对数据进行异常值检测,通过指定 contamination 参数来设置异常值比例。接着,定义了一个自定义数据集类 CustomDataset,其中异常值的索引被标记为1,正常值的索引标记为0。最后,我们创建了数据集实例和数据加载器,遍历数据加载器并输出样本及其标签,从而演示了如何使用 PyTorch 进行异常值检测与处理。

执行后的输出的内容是每个批次的样本和标签。每个批次的样本是一个张量,包含了一批数据样本,而对应的标签是一个张量,指示了每个样本是正常值(标签为0)还是异常值(标签为1)。例如,输出中的第一个批次的样本如下所示:

  1. 样本: tensor([[ 0.3008, 1.6835],
  2. [ 0.9125, 1.5915],
  3. [-0.3871, -0.0249],
  4. [-0.2126, -0.2027],
  5. [-0.5890, 1.2867],
  6. [ 1.9692, -1.6272],
  7. [ 0.4465, 0.9076],
  8. [ 0.1764, -0.2811],
  9. [ 0.9241, -0.3346],
  10. [ 0.5370, 0.2201]])
  11. 标签: tensor([0, 0, 0, 0, 0, 1, 0, 0, 0, 0])

在这个例子中,正常值样本的标签为0,异常值样本的标签为1。这个标签信息可以用于训练机器学习模型来进行异常值检测任务。

例如下面是一个使用 TensorFlow 进行异常值检测与处理的例子,将使用孤立森林(Isolation Forest)算法进行异常值检测,并对异常值进行处理。

实例2-20使用 TensorFlow进行异常值检测与处理(源码路径:daima/2/tyi.py)

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

  1. import tensorflow as tf
  2. from sklearn.ensemble import IsolationForest
  3. import numpy as np
  4. # 生成一些带有异常值的随机数据
  5. data = np.random.randn(100, 2)
  6. data[10] = [10, 10] # 添加一个异常值
  7. data[20] = [-8, -8] # 添加一个异常值
  8. # 使用 Isolation Forest 进行异常值检测
  9. clf = IsolationForest(contamination=0.1) # 设置异常值比例
  10. pred = clf.fit_predict(data)
  11. anomalies = np.where(pred == -1)[0] # 异常值索引
  12. # 将数据转换为 TensorFlow 数据集
  13. dataset = tf.data.Dataset.from_tensor_slices(data)
  14. # 对异常值进行处理
  15. def preprocess_data(sample):
  16. return sample
  17. def preprocess_label(idx):
  18. return 1 if idx in anomalies else 0
  19. processed_dataset = dataset.map(preprocess_data)
  20. labels = np.array([preprocess_label(idx) for idx in range(len(data))])
  21. # 创建数据加载器
  22. batch_size = 10
  23. dataloader = processed_dataset.batch(batch_size)
  24. # 遍历数据加载器并输出样本及其标签
  25. for batch in dataloader:
  26. print("样本:", batch)
  27. batch_indices = tf.range(batch_size, dtype=tf.int32)
  28. batch_labels = tf.gather(labels, batch_indices)
  29. print("标签:", batch_labels)

在上述代码中,首先生成了一些带有异常值的随机数据。然后,使用孤立森林(Isolation Forest)算法对数据进行异常值检测,通过指定 contamination 参数来设置异常值比例。接着,将数据转换为 TensorFlow 数据集,并使用 map 函数对数据集中的每个样本进行预处理。最后,创建了数据加载器,遍历数据加载器并输出样本及其标签,从而演示了如何使用 TensorFlow 进行异常值检测与处理。执行后会输出:

  1. 样本: tf.Tensor(
  2. [[ 1.08761703 -1.24775834]
  3. [ 0.74802814 -0.05866723]
  4. [-0.05826104 -1.02230984]
  5. [-1.57393284 0.34795907]
  6. ...
  7. [ 0.67923789 0.29233014]
  8. [-0.51347079 0.62670954]
  9. [-1.59011801 0.01169146]], shape=(10, 2), dtype=float64)
  10. 标签: tf.Tensor([0 0 0 0 0 0 0 0 0 0], shape=(10,), dtype=int32)
  11. 样本: tf.Tensor(
  12. [[10. 10. ]
  13. [-0.44729668 1.05870219]
  14. [ 0.78190767 0.24451839]
  15. ...
  16. [ 0.67923789 0.29233014]
  17. [-0.51347079 0.62670954]
  18. [-1.59011801 0.01169146]], shape=(10, 2), dtype=float64)
  19. 标签: tf.Tensor([1 0 0 0 0 0 0 0 0 0], shape=(10,), dtype=int32)
  20. 样本: tf.Tensor(
  21. [[-8. -8. ]
  22. [ 0.45491414 0.7643319 ]
  23. [-1.77601158 -0.70068054]
  24. ...
  25. [ 0.67923789 0.29233014]
  26. [-0.51347079 0.62670954]
  27. [-1.59011801 0.01169146]], shape=(10, 2), dtype=float64)
  28. 标签: tf.Tensor([1 0 0 0 0 0 0 0 0 0], shape=(10,), dtype=int32)
  29. ...

在上述输出中的每个批次输出了一组样本及其对应的标签。标签为0表示正常值,标签为1表示异常值。在这个例子中,我们手动添加了两个异常值,因此在每个批次中会有几个异常值,其余的都是正常值。

2.4.3  处理重复数据

处理数据集中的重复数据涉及到具体的数据集和问题场景。通常,数据集中的重复数据可能会影响模型的性能和训练结果,因此需要进行适当的处理。在实际应用中,通常使用Python库Pandas来处理重复数据。例如下面是一个使用Pandas来处理重复数据的例子。

实例2-21使用Pandas来处理重复数据(源码路径:daima/2/chong.py)

(1)假设有一个简单的文件dataset.csv,其内容如下所示:

  1. feature1,feature2,label
  2. 1.2,2.3,0
  3. 0.5,1.8,1
  4. 1.2,2.3,0
  5. 2.0,3.0,1
  6. 0.5,1.8,1

这个CSV文件包含三列内容:feature1、feature2和label。其中,前两列是特征,最后一列是标签。注意,在第1行和第3行之间以及第2行和第5行之间存在重复数据。在处理重复数据时,我们需要根据特定的情况来决定是否删除这些重复数据。

(2)实例文件chong.py用于处理文件dataset.csv中的重复数据,具体实现代码如下所示

  1. import pandas as pd
  2. # 读取数据集
  3. data = pd.read_csv('dataset.csv')
  4. # 检测重复数据
  5. duplicates = data[data.duplicated()]
  6. # 删除重复数据
  7. data_no_duplicates = data.drop_duplicates()
  8. # 打印处理后的数据集大小
  9. print("原始数据集大小:", data.shape)
  10. print("处理后数据集大小:", data_no_duplicates.shape)

执行后会输出:

  1. 原始数据集大小: (5, 3)
  2. 处理后数据集大小: (3, 3)

通过上述输出结果显示,原始数据集包含5行和3列,处理后的数据集包含3行和3列。这表明你成功地处理了数据集中的重复数据,将重复的样本行删除,从而得到了一个不包含重复数据的数据集。

本《文本预处理算法》专题已完结

(2-1)文本预处理算法:分词(Tokenization)-CSDN博客

(2-2)文本预处理算法:词干化与词形还原(Stemming and Lemmatization)-CSDN博客

(2-3)文本预处理算法:去除停用词(Stopword Removal)-CSDN博客

(2-4)文本预处理算法:数据清洗和处理-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/376618
推荐阅读
相关标签
  

闽ICP备14008679号