当前位置: 首页 > news >正文

机器学习-数据预处理

数据预处理

数据预处理(Data Preprocessing)是指对原始数据进行清洗、转换和规整的过程,目的是提高数据质量,使其更适合用于模型训练。数据预处理是机器学习流程中的关键步骤,直接影响模型的性能和可靠性。

为什么需要数据预处理?

  1. 原始数据通常存在问题
    • 缺失值、噪声(错误或异常值)、不一致(如单位不统一)。
    • 数据尺度差异(如年龄范围是0-100,而收入范围是0-1,000,000)。
    • 非数值型数据(如文本、类别标签)需要转换为数值形式。
    • 数据冗余或无关特征(如ID列)。
  1. 模型的要求
    • 大多数算法(如SVM、神经网络、KNN)对输入数据的尺度和分布敏感。
    • 低质量数据会导致模型过拟合、欠拟合或训练效率低下。

数据预处理步骤:

1. 导入必要的库

  • NumPy:用于数学计算
  • Pandas:用于数据导入和管理

2. 导入数据集

  • 通常处理.csv格式文件
  • 使用Pandas的read_csv()方法读取数据
  • 将数据分为自变量矩阵和因变量向量

3. 处理缺失数据

  • 使用sklearn.preprocessing.Impute
  • 用平均值或中位数填充缺失值
  • 确保不降低模型性能

SimpleImputer 是 scikit-learn 中用于处理数据集中缺失值的工具,它提供了多种填充缺失值的策略

基本语法
from sklearn.impute import SimpleImputer
import numpy as npimputer = SimpleImputer(missing_values=np.nan,  # 指定缺失值的表示形式strategy="mean",       # 填充策略fill_value=None,       # 当strategy="constant"时使用的填充值copy=True             # 是否创建数据副本
)
参数详解
  1. missing_values:
    • 指定数据中表示缺失值的形式,默认是 np.nan
    • 也可以设置为其他值,如 0-1
  1. strategy (填充策略):
    • "mean": 使用每列的均值填充(仅适用于数值数据)
    • "median": 使用每列的中位数填充
    • "most_frequent": 使用每列的众数(出现频率最高的值)填充,适用于分类数据
    • "constant": 使用 fill_value 参数指定的固定值填充
  1. fill_value:
    • strategy="constant" 时使用的填充值
    • 可以是标量值或字典(为每列指定不同的填充值)
  1. copy:
    • 如果为 True(默认),会创建数据的副本
    • 如果为 False,会直接在原始数据上进行填充

4. 解析分类数据

  • 使用sklearn.preprocessing.LabelEncoder
  • 将文本标签("Yes"/"No")转换为数值
  • 使数据适合数学计算

5. 拆分数据集

  • 使用sklearn.crossvalidation.train_test_split()
  • 常见比例:80%训练集,20%测试集
  • 分别用于模型训练和验证

6. 特征缩放

  • 使用sklearn.preprocessing.StandardScalar
  • 解决不同特征的幅度和单位差异问题
  • 通过标准化或Z值归一化处理

数据集:Data.csv

#第1步:导入库
import numpy as np
import pandas as pd#第2步:导入数据集
dataset = pd.read_csv('../doc/Data.csv')
# 从数据集中提取特征值
# iloc用于通过位置索引获取数据
# [ : , :-1]表示获取所有行,除了最后一列的所有列
# .values将数据转换为NumPy数组
X = dataset.iloc[ : , :-1].values# 从数据集中提取目标变量
# iloc用于通过位置索引获取数据
# [ : , 3]表示获取所有行,第4列(索引从0开始)
# .values将数据转换为NumPy数组
Y = dataset.iloc[ : , 3].valuesprint("第2步:导入数据集")
print("X")
print(X)
print("Y")
print(Y)#第3步:处理丢失数据
# 如果您使用的是最新版本的 sklearn,请使用注释掉的代码行
# 导入SimpleImputer类,用于处理缺失值
from sklearn.impute import SimpleImputer# 创建SimpleImputer对象,指定缺失值为np.nan,策略为"mean"表示用列均值填充缺失值
imputer = SimpleImputer(missing_values=np.nan, strategy="mean")# 使用imputer对象对X数组的第1到第2列(不包括第3列)进行拟合
# 这一步计算出需要变换的列的均值,为后续填充做准备
imputer = imputer.fit(X[ : , 1:3])# 对X数组的第1到第2列应用变换,即用均值填充这些列中的缺失值
# 这里实际上完成了对缺失值的替换,使得数据集可以用于后续的机器学习模型训练
X[ : , 1:3] = imputer.transform(X[ : , 1:3])print("---------------------")
print("第3步:处理丢失数据")
print("X")
print(X)# 第4步:解析分类数据
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.compose import ColumnTransformer# 初始化LabelEncoder对象,用于编码分类变量
labelencoder_X = LabelEncoder()# 对数据集X中的第一列(通常代表分类变量)进行编码转换
X[:, 0] = labelencoder_X.fit_transform(X[:, 0])
print(X)# 初始化ColumnTransformer对象,用于对指定列进行OneHot编码
# 这里对第一列进行操作,同时保留其他列不变
ct = ColumnTransformer([("", OneHotEncoder(), [0])], remainder='passthrough')
# 使用ColumnTransformer对象对数据集X进行转换,即将第一列的标签编码进一步转换为OneHot编码
X = ct.fit_transform(X)
# 初始化另一个LabelEncoder对象,用于编码目标变量Y
labelencoder_Y = LabelEncoder()
# 对目标变量Y进行编码转换
Y = labelencoder_Y.fit_transform(Y)print("---------------------")
print("第4步:解析分类数据")
print("X")
print(X)
print("Y")
print(Y)#第5步:拆分数据集为训练集合和测试集合
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split( X , Y , test_size = 0.2, random_state = 0)
print("---------------------")
print("第5步:拆分数据集为训练集合和测试集合")
print("X_train")
print(X_train)
print("X_test")
print(X_test)
print("Y_train")
print(Y_train)
print("Y_test")
print(Y_test)#第6步:特征量化
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
print("---------------------")
print("第6步:特征量化")
print("X_train")
print(X_train)
print("X_test")
print(X_test)

http://www.dtcms.com/a/288958.html

相关文章:

  • 闲庭信步使用图像验证平台加速FPGA的开发:第二十六课——正弦波DDS的FPGA实现
  • leetcode75【经典动态规划】之:最长公共子序列
  • nginx源码解读-------整体架构
  • 30天打牢数模基础-LightGBM讲解
  • 网络地址和主机地址之间进行转换的类
  • springboot电影推荐网站—计算机毕业设计源码—30760
  • 在Ubutu22系统上面离线安装Go语言环境【教程】
  • 【开源项目】基于RuoYi-Vue-Plus的开源进销存管理系统
  • Spring之AOP面向切面编程详解
  • 软件工程学概述:从危机到系统化工程的演进之路
  • MySQL详解三
  • Java 字符集(Charset)详解:从编码基础到实战应用,彻底掌握字符处理核心机制
  • 文件编码概念|文件的读取操作|文件读取的课后练习讲解
  • 数据治理,治的是什么?
  • 0719代码调试记录
  • 【星海出品】python安装调试篇
  • 网络安全隔离技术解析:从网闸到光闸的进化之路
  • Spring Boot总结
  • RabbitMQ核心组件浅析:从Producer到Consumer
  • 深入理解设计模式:访问者模式详解
  • 深入理解浏览器解析机制和XSS向量编码
  • Java中List<int[]>()和List<int[]>[]的区别
  • React-Native开发环境配置-安装工具-创建项目教程
  • 数据并表技术全面指南:从基础JOIN到分布式数据融合
  • Pinia 核心知识详解:Vue3 新一代状态管理指南
  • 六边形滚动机器人cad【7张】三维图+设计书明说
  • [数据库]Neo4j图数据库搭建快速入门
  • 反激电源中的Y电容--问题解答
  • Python类中方法种类与修饰符详解:从基础到实战
  • linux shell从入门到精通(一)——为什么要学习Linux Shell