1. 机器学习数据准备七日速成课程
作为一名从业多年的数据科学家,我深知数据准备环节在机器学习项目中的重要性。今天我想分享一个经过实战检验的7天速成方案,帮助开发者系统掌握数据准备的核心技能。
数据准备是将原始数据转化为适合建模形式的过程,这通常占用了整个项目70%以上的时间。但令人惊讶的是,大多数教程都聚焦于算法本身,而忽视了这一基础但关键的环节。本课程将用Python带你快速掌握数据准备的完整流程。
1.1 课程适用对象
这个课程适合已经具备以下基础的开发者:
- 熟悉Python基础编程
- 了解NumPy数组基本操作
- 接触过scikit-learn建模流程
不需要你是数学专家或机器学习大牛,只要你想提升数据准备能力,这个课程就是为你设计的。
提示:建议使用Python 3和Anaconda环境,确保已安装NumPy、pandas和scikit-learn等基础库。
1.2 课程结构设计
课程采用渐进式学习路径,每天专注一个核心主题:
- 数据准备的重要性
- 缺失值填补技术
- 递归特征消除(RFE)
- 数据标准化
- 类别变量编码
- 数值离散化
- 主成分分析(PCA)
每个主题都包含理论讲解和Python实战,建议每天投入30-60分钟完成一个主题。当然,你也可以选择"硬核模式"一天完成全部内容。
2. 数据准备基础与缺失值处理
2.1 为什么数据准备如此关键
原始数据通常不能直接用于机器学习算法,主要原因有四个:
- 数据类型要求:大多数算法只接受数值输入
- 算法限制:某些算法对数据分布有特定要求
- 数据质量问题:噪声和错误需要修正
- 特征复杂性:需要提取非线性关系
常见的数据准备任务包括:
- 数据清洗:处理缺失值和异常值
- 特征选择:筛选相关特征
- 数据转换:调整数据分布
- 特征工程:创建新特征
- 降维:减少特征数量
2.2 缺失值处理实战
现实数据中缺失值很常见,我们以马绞痛数据集为例演示如何处理。该数据集包含医疗特征和马的存活结果,缺失值用"?"标记。
from numpy import isnan from pandas import read_csv from sklearn.impute import SimpleImputer # 加载数据并标记缺失值 url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/horse-colic.csv' dataframe = read_csv(url, header=None, na_values='?') # 分割特征和标签 data = dataframe.values ix = [i for i in range(data.shape[1]) if i != 23] X, y = data[:, ix], data[:, 23] # 统计缺失值 print('缺失值数量:', sum(isnan(X).flatten())) # 使用均值填充 imputer = SimpleImputer(strategy='mean') imputer.fit(X) Xtrans = imputer.transform(X) print('填充后缺失值:', sum(isnan(Xtrans).flatten()))关键点说明:
na_values='?'将问号识别为缺失值SimpleImputer支持多种填充策略(均值、中位数、众数等)- 填充前后务必检查缺失值数量变化
经验分享:对于时间序列数据,考虑使用前后值填充;分类数据更适合用众数填充。
3. 特征选择与数据标准化
3.1 递归特征消除(RFE)应用
特征选择能减少计算成本并可能提升模型性能。RFE通过递归地移除最不重要的特征来选择特征子集。
from sklearn.datasets import make_classification from sklearn.feature_selection import RFE from sklearn.tree import DecisionTreeClassifier # 创建含冗余特征的数据集 X, y = make_classification(n_samples=1000, n_features=10, n_informative=5, n_redundant=5, random_state=1) # 初始化RFE rfe = RFE(estimator=DecisionTreeClassifier(), n_features_to_select=5) rfe.fit(X, y) # 输出特征排名 for i in range(X.shape[1]): print(f'特征{i}: 选中={rfe.support_[i]}, 排名={rfe.ranking_[i]}')结果解读:
support_数组显示特征是否被选中ranking_数组给出特征重要性排名(1表示最重要)
3.2 数据标准化技术
许多算法(如KNN、SVM)对特征尺度敏感。归一化将特征缩放到[0,1]区间:
from sklearn.preprocessing import MinMaxScaler # 创建数据集 X, _ = make_classification(n_samples=1000, n_features=5, n_informative=5, n_redundant=0, random_state=1) # 归一化前 print("原始数据示例:\n", X[:3]) # 应用归一化 scaler = MinMaxScaler() X_norm = scaler.fit_transform(X) print("归一化后:\n", X_norm[:3])注意事项:
- 测试集应使用训练集的缩放参数
- 对离群值敏感,可考虑RobustScaler
- 稀疏数据适合MaxAbsScaler
4. 特征编码与离散化
4.1 类别变量编码
机器学习需要数值输入,类别变量必须转换。One-Hot编码为每个类别创建二元特征:
from sklearn.preprocessing import OneHotEncoder # 乳腺癌数据集(类别特征) url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/breast-cancer.csv" data = read_csv(url, header=None).values X = data[:, :-1].astype(str) print("原始类别数据:\n", X[:3]) # One-Hot编码 encoder = OneHotEncoder(sparse=False) X_encoded = encoder.fit_transform(X) print("编码后:\n", X_encoded[:3])编码效果: 原始值["40-49","premeno","15-19"]可能变为: [0,1,0,0, 1,0,0, 0,0,1,0,...]
4.2 数值离散化
有些算法(如决策树)处理离散特征更高效。等宽分箱示例:
from sklearn.preprocessing import KBinsDiscretizer # 创建数值数据集 X, _ = make_classification(n_samples=1000, n_features=5, random_state=1) # 离散化前 print("原始数值:\n", X[:3]) # 等宽分10箱 discretizer = KBinsDiscretizer(n_bins=10, encode='ordinal', strategy='uniform') X_discrete = discretizer.fit_transform(X) print("离散化后:\n", X_discrete[:3])策略选择:
- 'uniform': 等宽分箱
- 'quantile': 等频分箱
- 'kmeans': 基于聚类分箱
5. 降维技术与课程总结
5.1 PCA降维实战
高维数据易遭遇"维度灾难",PCA通过线性变换找到主成分:
from sklearn.decomposition import PCA # 创建高维数据 X, _ = make_classification(n_samples=1000, n_features=10, n_informative=3, n_redundant=7, random_state=1) # 降维前 print("原始维度:", X.shape) print("示例数据:\n", X[:3]) # 保留3个主成分 pca = PCA(n_components=3) X_pca = pca.fit_transform(X) print("降维后:\n", X_pca[:3]) print("解释方差比:", pca.explained_variance_ratio_)应用建议:
- 可视化前常降至2-3维
- 保留90%以上方差的主成分
- 标准化数据后再应用PCA
5.2 七日课程回顾
通过这七天学习,我们系统掌握了:
- 数据准备的核心价值与流程
- 缺失值识别与填补技术
- 基于RFE的特征选择
- 数据标准化方法
- 类别变量编码方案
- 数值离散化技术
- PCA降维原理与应用
实战建议:
- 建立可复用的数据预处理管道
- 对每个新数据集先进行探索性分析
- 记录所有转换步骤以便复现
- 考虑使用ColumnTransformer处理混合类型特征
数据准备既是科学也是艺术,需要理论指导加上经验积累。建议从简单方法开始,逐步尝试更复杂的转换技术,最终形成适合自己的数据处理流程。