南开大学人工智能学院机器学习课程作业解析与经验分享

一、课程作业设计背景与目标

南开大学人工智能学院机器学习课程以培养具备系统化机器学习工程能力的复合型人才为目标,课程作业设计覆盖从理论推导到实际建模的全流程。作业内容涵盖经典算法实现(如线性回归、决策树)、复杂模型调优(如神经网络超参数优化)以及真实场景下的数据建模实践,旨在通过阶梯式任务引导学生掌握以下核心能力:

  1. 数学基础与算法原理:理解损失函数优化、梯度下降等核心数学逻辑;
  2. 工程化实现能力:熟练使用编程语言(如Python)完成算法从零实现;
  3. 模型调优与评估:掌握交叉验证、正则化、早停法等工程化技巧;
  4. 真实数据适应能力:处理缺失值、特征缩放、类别不平衡等实际数据问题。

以某次作业为例,任务要求基于模拟数据集完成房价预测模型构建,需同时提交代码实现、模型评估报告及改进方案,覆盖了数据预处理、特征工程、模型训练与部署的全生命周期。

二、典型作业实现路径与关键技术点

1. 数据预处理:从原始数据到可用特征

数据质量直接影响模型性能,典型预处理步骤包括:

  • 缺失值处理:对数值型特征采用中位数填充(df.fillna(df.median())),对类别型特征采用众数填充;
  • 特征缩放:使用标准化(StandardScaler)或归一化(MinMaxScaler)消除量纲影响;
  • 类别编码:对离散特征采用独热编码(pd.get_dummies())或标签编码(LabelEncoder)。

示例代码片段:

  1. from sklearn.preprocessing import StandardScaler
  2. import pandas as pd
  3. # 假设df为原始数据框
  4. numeric_cols = ['area', 'bedrooms'] # 数值型特征列
  5. scaler = StandardScaler()
  6. df[numeric_cols] = scaler.fit_transform(df[numeric_cols])

2. 模型选择与实现:从线性回归到神经网络

课程作业覆盖多种模型类型,典型实现逻辑如下:

(1)线性回归实现

需手动实现梯度下降算法,核心步骤包括:

  1. 初始化参数(权重w与偏置b);
  2. 计算预测值与损失(均方误差);
  3. 更新参数(学习率alpha控制步长)。

示例代码:

  1. import numpy as np
  2. def linear_regression(X, y, alpha=0.01, epochs=1000):
  3. m = X.shape[0]
  4. w = np.zeros(X.shape[1])
  5. b = 0
  6. for _ in range(epochs):
  7. y_pred = np.dot(X, w) + b
  8. loss = np.mean((y_pred - y) ** 2)
  9. dw = (1/m) * np.dot(X.T, (y_pred - y))
  10. db = (1/m) * np.sum(y_pred - y)
  11. w -= alpha * dw
  12. b -= alpha * db
  13. return w, b

(2)神经网络实现

使用主流深度学习框架(如TensorFlow/PyTorch)构建多层感知机,关键步骤包括:

  • 定义网络结构(输入层、隐藏层、输出层);
  • 选择激活函数(ReLU、Sigmoid);
  • 配置优化器(Adam)与损失函数(交叉熵)。

示例代码(PyTorch):

  1. import torch
  2. import torch.nn as nn
  3. class MLP(nn.Module):
  4. def __init__(self, input_size, hidden_size, output_size):
  5. super(MLP, self).__init__()
  6. self.fc1 = nn.Linear(input_size, hidden_size)
  7. self.relu = nn.ReLU()
  8. self.fc2 = nn.Linear(hidden_size, output_size)
  9. def forward(self, x):
  10. out = self.fc1(x)
  11. out = self.relu(out)
  12. out = self.fc2(out)
  13. return out
  14. model = MLP(input_size=10, hidden_size=32, output_size=1)
  15. criterion = nn.MSELoss()
  16. optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

3. 模型评估与改进:从指标分析到调优策略

评估阶段需关注以下指标:

  • 回归任务:均方误差(MSE)、平均绝对误差(MAE)、R²分数;
  • 分类任务:准确率、精确率、召回率、F1分数。

改进策略包括:

  • 超参数调优:使用网格搜索(GridSearchCV)或随机搜索(RandomizedSearchCV);
  • 正则化:添加L1/L2正则项防止过拟合;
  • 早停法:监控验证集损失,提前终止训练。

示例调优代码:

  1. from sklearn.model_selection import GridSearchCV
  2. from sklearn.svm import SVR
  3. param_grid = {'C': [0.1, 1, 10], 'epsilon': [0.01, 0.1, 0.5]}
  4. grid_search = GridSearchCV(SVR(), param_grid, cv=5, scoring='neg_mean_squared_error')
  5. grid_search.fit(X_train, y_train)
  6. best_params = grid_search.best_params_

三、实践中的常见问题与解决方案

1. 模型收敛失败

原因:学习率过大、数据未标准化、初始化不当。
解决方案

  • 使用学习率衰减策略(如ReduceLROnPlateau);
  • 对输入数据进行标准化;
  • 采用Xavier初始化或He初始化。

2. 过拟合与欠拟合

过拟合表现:训练集损失低,验证集损失高。
解决方案

  • 增加正则化项(如L2正则);
  • 使用Dropout层(神经网络);
  • 减少模型复杂度(如减少决策树深度)。

欠拟合表现:训练集与验证集损失均高。
解决方案

  • 增加模型复杂度(如增加隐藏层神经元数量);
  • 减少正则化强度;
  • 扩展特征维度。

3. 类别不平衡问题

解决方案

  • 重采样:过采样少数类(SMOTE)或欠采样多数类;
  • 调整类别权重:在损失函数中为少数类分配更高权重;
  • 使用集成方法:如BalancedRandomForest。

四、课程作业对实际项目的启示

  1. 模块化设计:将数据预处理、模型训练、评估封装为独立模块,提升代码复用性;
  2. 自动化流程:构建Pipeline实现从数据加载到模型部署的全自动流程;
  3. 可解释性:对关键决策点(如特征选择、超参数)添加日志与可视化输出。

以某实际项目为例,团队基于课程作业经验构建了自动化机器学习平台,通过标准化数据接口与模型模板,将模型开发周期从2周缩短至3天,验证了课程知识在实际场景中的迁移价值。

五、总结与建议

南开大学人工智能学院机器学习课程作业通过高强度实践任务,系统培养了学生的理论推导、工程实现与问题解决能力。对于学习者,建议:

  1. 重视数学基础:深入理解梯度下降、优化目标等核心原理;
  2. 强化代码能力:从手动实现算法开始,逐步过渡到框架使用;
  3. 关注工程细节:如数据泄露、随机种子设置等易忽略问题;
  4. 参与开源社区:通过复现经典论文代码提升实战水平。

课程作业不仅是知识检验的载体,更是向工业级机器学习工程过渡的桥梁,其设计理念与实现方法对培养符合行业需求的AI人才具有重要参考价值。