6.1.1 问题定义与数据准备
机器学习项目的成功始于清晰的问题定义。首先需要明确任务类型:监督学习(Supervised Learning)处理带有标签的数据,包括分类(预测离散类别)和回归(预测连续值)两种主要形式;无监督学习(Unsupervised Learning)处理无标签数据,主要任务包括聚类和降维;强化学习(Reinforcement Learning)则通过与环境交互来学习最优策略。
数据收集阶段需要考虑数据的代表性、质量和规模。代表性确保训练数据能够覆盖实际应用中可能遇到的各种情况;数据质量直接影响模型性能,包括准确性、完整性和一致性;数据规模则需要与模型复杂度相匹配,避免欠拟合或过拟合。
数据准备的核心步骤包括:
数据清洗:处理缺失值(删除、填充或插值)、异常值检测与处理、重复数据删除。对于缺失值,数值型特征常用均值或中位数填充,类别型特征可采用众数填充或创建"未知"类别。
数据转换:类别特征编码(One-Hot编码、标签编码)、数值特征标准化或归一化。标准化将数据转换为均值为0、标准差为1的分布:;归一化则将数据缩放到[0,1]区间:。
数据集划分:典型的划分比例为训练集70%、验证集15%、测试集15%。训练集用于模型参数学习,验证集用于超参数调优和模型选择,测试集用于最终性能评估。
6.1.2 特征工程基础
特征工程是将原始数据转换为更适合机器学习算法处理的特征表示的过程,被业界公认为机器学习项目中最重要的环节之一。良好的特征工程能够显著提升模型性能,有时甚至超过算法选择的影响。
特征选择旨在从原始特征集中筛选出最相关的子集,主要方法包括:
- 过滤法(Filter):基于统计检验选择特征,如方差阈值、卡方检验、互信息等
- 包装法(Wrapper):使用模型性能作为特征子集的评价标准,如递归特征消除(RFE)
- 嵌入法(Embedded):在模型训练过程中自动进行特征选择,如L1正则化、树模型的特征重要性
特征构造通过领域知识或数据变换创建新特征:
- 多项式特征:将特征进行乘积组合,捕捉特征间交互
- 统计特征:基于时间窗口计算均值、方差、最大值等统计量
- 编码特征:对类别特征进行目标编码、频率编码等
6.1.3 模型训练与评估
模型训练是通过优化算法调整模型参数以最小化损失函数的过程。损失函数衡量模型预测与真实值之间的差异,不同任务类型采用不同的损失函数:
- 回归任务:均方误差(MSE)、平均绝对误差(MAE)、Huber损失
- 分类任务:交叉熵损失、 hinge损失
训练过程中需要监控的关键指标包括训练损失、验证损失和学习曲线。训练损失持续下降而验证损失上升是过拟合的典型信号。
6.1.4 交叉验证与调参
**K折交叉验证(K-Fold Cross-Validation)**是评估模型泛化能力的标准方法。将数据集划分为K个子集,每次使用K-1个子集训练,剩余1个子集验证,重复K次确保每个子集都作为验证集一次。最终性能取K次验证结果的平均。

图6-1:5折交叉验证示意图。每行代表一个fold,蓝色点为训练集,红色点为验证集
K折交叉验证的优势在于:充分利用有限数据、减少划分随机性影响、提供更稳健的性能估计。常用K值为5或10,K越大计算成本越高但估计越稳定。
超参数调优的常用方法包括:
- 网格搜索(Grid Search):在预定义的参数空间中进行穷举搜索
- 随机搜索(Random Search):在参数空间中随机采样,效率通常优于网格搜索
- 贝叶斯优化:基于已评估点的结果构建代理模型,智能选择下一个评估点

图6-2:验证曲线和学习曲线。左下为5折交叉验证示意图,中下为学习曲线,右下为验证曲线
6.2 监督学习算法
6.2.1 线性回归与逻辑回归
**线性回归(Linear Regression)**是最基础的回归算法,假设目标变量与特征之间存在线性关系:
其中为截距,为各特征的系数,为误差项。模型参数通过最小二乘法估计,即最小化残差平方和:
最小二乘法的闭式解为:
**逻辑回归(Logistic Regression)**是处理二分类问题的线性模型。通过sigmoid函数将线性组合映射到(0,1)区间:
其中。模型输出可解释为样本属于正类的概率:
参数估计采用最大似然法,损失函数为对数似然的负值(交叉熵损失):
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.datasets import make_regression, make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, accuracy_score
# 线性回归示例
X_reg, y_reg = make_regression(n_samples=1000, n_features=5, noise=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X_reg, y_reg, test_size=0.2)
lr_model = LinearRegression()
lr_model.fit(X_train, y_train)
y_pred = lr_model.predict(X_test)
print(f"MSE: {mean_squared_error(y_test, y_pred):.4f}")
print(f"Coefficients: {lr_model.coef_}")
# 逻辑回归示例
X_clf, y_clf = make_classification(n_samples=1000, n_features=10, n_classes=2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X_clf, y_clf, test_size=0.2)
log_reg = LogisticRegression(max_iter=1000)
log_reg.fit(X_train, y_train)
y_pred = log_reg.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred):.4f}")