Place
人员
如果有任何错误,或者改进地方请私信一下我!
任何更新请留意群公告
Task A
Part 1
A1.1 读取数据并列出列名
目标:从
Student_List_A2.csv 中读取数据,并准确列出列名。💡 解决方法:
- 使用
pandas.read_csv()读取 CSV 文件。
- 使用
df.columns输出列名。
A1.2 替换 GradeClass 数值为字母等级
目标:把
GradeClass 列中的数值(0,1,2,3,4)转换成对应的字母等级(A,B,C,D,F)。💡 解决方法:
- 建立一个映射字典,例如
{0:'A',1:'B',2:'C',3:'D',4:'F'}。
- 使用
df['GradeClass'].map()或replace()完成替换。
A1.3 检查并填补缺失值
目标:识别数据集中是否存在缺失值,并用相应列的中位数进行填补。
💡 解决方法:
- 使用
df.isnull().sum()统计各列缺失值数量,并且输出
- 使用
df[column].median()来计算对应column的median
- 对有缺失的列,用
fillna(值)填补。
- 再次运行
df.isnull().sum()确认缺失值已处理完毕,并且输出
A1.4 检测并清理 Absences 列数据质量问题
目标:检查
Absences 列是否存在异常值(如不合理的大值),并删除这些有问题的行。比如负数,或者特别大的数字
💡 解决方法:
- 使用
df['Absences'].describe()查看最大值、最小值、分布。
- 通过逻辑条件(例如
df[df['Absences'] > 某阈值])找出异常行。
- 使用
df.drop(index, inplace=True)删除这些异常行。
- 解释逻辑可以参考 Week3 Lecture PPT 👇
A1.5 审核 GPA 与 GradeClass 一致性
目标:检查
GPA 数值与 GradeClass 字母是否匹配,并修正不一致的情况。💡 解决方法:
- 根据 GPA 区间重新推导出对应的等级:
- A: GPA ≥ 3.5
- B: 3.0–3.49
- C: 2.5–2.99
- D: 2.0–2.49
- F: GPA < 2.0
- 比较推导结果与现有
GradeClass是否一致。
- 输出不一致样例的 StudentID 和数量。
- 选择一个可信来源(建议
GPA为准,用它来修正GradeClass)。
- 再次检查确认无不一致。
- 注意解释为什么
Part 2
A2.1 计算各 GradeClass 的百分比
目标:统计每个
GradeClass 学生人数占总人数的百分比。💡 解决方法:
- 使用
df['GradeClass'].value_counts(normalize=True) * 100计算比例。
- 可选:用
.round(2)四舍五入到小数点后两位,方便展示。
A2.2 绘制 GradeClass 饼图
目标:用饼图显示
GradeClass💡 解决方法:
- 使用
matplotlib的plt.pie(...)绘制;
A2.3 饼图显示详细数据
目标:用饼图显示各
GradeClass 的占比,并进行简短观察描述。💡 解决方法:
- 使用
matplotlib的plt.pie(..., autopct='%1.1f%%')绘制;
- 设置
labels为等级顺序(如['A','B','C','D','F'],与数据对齐);
- 添加标题
plt.title(...),保持图表清晰可读。
A2.4 用散点图探索 WeeklyStudyTime 与 GPA 的关系
目标:观察学生的学习时间与 GPA 之间是否存在线性或其他关系,并计算相关系数。
💡 解决方法:
- 使用
plt.scatter(df['WeeklyStudyTime'], df['GPA'])绘制散点图;
- 给坐标轴加上标签:
plt.xlabel(...),plt.ylabel(...);
- 添加标题
plt.title(...);
- 使用
df['WeeklyStudyTime'].corr(df['GPA'])计算相关系数;
- 在 Notebook Markdown 单元格里解释相关性是正相关、负相关还是几乎无关。
A2.5 其他数据对比
目标:观察一个其他数据对GPA的影响
💡 解决方法:
- 挑个喜欢的数据重复A2.4就好了
- 推荐
Absences
A2.6 相关性与因果关系的讨论
目标:解释为什么相关性不能直接推出因果关系,并提出需要哪些额外数据来增强论证。
💡 解决方法:
- 相关性 ≠ 因果关系,可能受到 混杂因素(如家庭条件、健康、教师质量)、反向因果(成绩差导致缺勤多)、或 测量偏差 的影响。
- 要加强因果论证,可以收集更多数据:
- 学生的 历史成绩/基线水平(例如上一学期 GPA);
- 课程/教师信息(难度、评分政策、班级大小);
- 学生背景(健康状况、缺勤原因、社会经济条件);
- 学习参与度(作业提交、线上学习平台登录次数、测验记录);
- 时间序列数据(学期内多时间点记录,能看出先后顺序)。
A2.7 Grade分组,数据计算
目标:按照
GradeClass 分组,计算 GPA 和 Absences 的统计指标(平均数、中位数、标准差、四分位距)。💡 解决方法:
- 使用
df.groupby('GradeClass').agg({...})在一次调用里完成。
- 对 GPA 和 Absences 同时计算:
mean,median,stdIQR可用lambda x: x.quantile(0.75) - x.quantile(0.25)
- 记得输出检查
A2.8 表格优化整理
目标:把 A2.7 中多层索引(MultiIndex)的结果列名整理为单层,并且保证命名清晰。
💡 解决方法:
- 使用
.agg()得到的 DataFrame 会产生两层列名,例如('GPA','mean')。
- 通过列表推导式或
map将它们合并成单层字符串:
- 重新命名
<lambda_0>→IQR
- 这样列名就会变成
GPA_mean,GPA_median,Absences_iqr等。
- 最后用
reset_index()恢复普通索引,便于展示和导出。
Part 3
A3.1 监督学习概念理解
目标:理解并解释监督学习 (Supervised ML) 的概念,并说明训练集与测试集的区别,以及如果没有测试集会带来的风险。
💡 解决方法:
- 解释监督学习:用已有的输入特征(如
Age,StudyTimeWeekly,Absences,ParentalSupport)去预测已知的标签GradeClass。
- 训练集 (Training set):用于“教”模型学习规律。
- 测试集 (Testing set):用于在模型没见过的数据上验证表现。
- 风险:如果没有测试集,模型可能只记住训练数据(过拟合),导致在新数据上的预测能力差。
A3.2 数据特征标签分析
目标:区分数据里的 特征 (features) 和 标签 (label),并解释为什么要保留或排除某些列。
💡 解决方法:分类结果 - 注意解释原因
- Exclude:
StudentIDGPA
- Keep (Features):
AgeStudyTimeWeeklyAbsencesParentalSupport
3.3 数据集切分(训练集与测试集)
目标:将数据按 70/30 的比例分为训练集和测试集,并报告各自的样本量。如果数据量很小,讨论是否仍适用该比例。
💡 解决方法:
- 使用
train_test_split(..., test_size=0.3, stratify=y)保持类别分布一致。直接参考Applied课件
- 输出训练集与测试集的样本量:
X_train.shape[0]与X_test.shape[0]。
- 当数据集很小,70/30 可能导致测试集样本过少,评估不稳定。可改为 80/20 来提高可靠性。
Part 4
4.1 标准与归一化
目标:在训练分类模型之前,对特征进行标准化/归一化,并解释原因。
4.1A
💡 解决方法:
- 为什么要标准化?
- 不同特征的量纲和范围差异很大(如
Age在十几到二十几之间,而Absences可能达到数百)。- 没有标准化时,距离度量的模型(如 SVM、KNN)会被数值范围大的特征主导。
4.1B
💡 解决方法:
- 选择
StandardScaler(常见做法,均值=0,标准差=1)。
- 拟合训练集 (
fit_transform),并对测试集应用相同变换 (transform)。
- 需要缩放的列:
AgeStudyTimeWeeklyAbsencesParentalSupport
- 不需要缩放的列:
GradeClass(标签)。
4.2 SVM 学习
学习视频:

4.2A
目标:用自己的语言解释什么是支持向量机 (SVM),以及它是如何工作的。
💡 解决方法:
- SVM 定义:一种监督学习分类算法,通过找到一个最佳超平面 (hyperplane) 将不同类别分开。
- 核心思想:最大化类别之间的“间隔 (margin)” → 边界两侧最近的点叫“支持向量 (support vectors)”。
- 优点:适用于高维数据,能处理非线性问题(结合核函数)。
- 局限:对大规模数据训练开销大,对噪声敏感。
4.2B
目标:解释 SVM kernel 的概念和作用。
💡 解决方法:
- Kernel 的作用:把原始特征映射到更高维的空间,使数据在该空间中可以线性分离。
- 常见核函数:
- Linear kernel:保持原空间,适合线性可分的数据。
- Polynomial kernel:允许多项式边界,处理更复杂关系。
- 直观理解:kernel 就像一种“转换工具”,帮助模型在原本无法分开的数据中找到更清晰的分界。
4.3C
目标:使用
sklearn.svm.SVC 在训练数据上建立一个预测模型。💡 解决方法:
- 导入
SVC模型:from sklearn.svm import SVC。
- 初始化 SVM 模型
4.4
目标:在 SVM 之外,再训练至少一个其他分类器,并与 SVM 进行比较。
💡 解决方法:
- 选择一个额外的模型:
- DecisionTreeClassifier(易于解释,能处理非线性关系);
- RandomForestClassifier(集成模型,通常比单棵树更稳健)。
4.5
目标:展示 SVM 与 Random Forest 的 5×5 混淆矩阵,识别一个常见的误分类模式,并解释可能原因。
💡 解决方法:
- 使用
confusion_matrix(y_test, y_pred)得到 5×5 矩阵。
- 观察矩阵中最大或频繁的误分类(如 B↔C 或 D↔F)。
- 解释原因:
- 相邻等级边界模糊 → GPA 区间接近,特征重叠;
- 特征影响不显著 → 学习时间、缺勤和家长支持的差异不足以明显区分;
- 类别不平衡 → F 占多数,导致模型更容易预测成 F。
Part 5
5.1
目标:用测试集同时评估 SVM 模型 和 其他模型 的预测效果。
💡 解决方法:
- 使用
predcit(X_test_scaled)来进行预测
5.2
目标:展示 SVM 与 Random Forest 的 5×5 混淆矩阵,识别一个常见的误分类模式,并解释可能原因。
💡 解决方法:
- 使用
confusion_matrix(y_test, y_pred)得到 5×5 矩阵。
- 观察矩阵中最大或频繁的误分类(如 B↔C 或 D↔F)。
- 解释原因:
- 相邻等级边界模糊 → GPA 区间接近,特征重叠;
- 特征影响不显著 → 学习时间、缺勤和家长支持的差异不足以明显区分;
- 类别不平衡 → F 占多数,导致模型更容易预测成 F。
5.3
由于每个同学的model不一样,这里只列出几个注意事项
- 考虑到需要测量的数据如果每个数量相同,两个模型的最终结果 - 注意结果要均衡,不能某一类完全为0。
- 准确率大不代表一切
5.3
目标:分别判断 SVM 与 Random Forest 在本数据集上更可能受到“高偏差”还是“高方差”的影响,并给出依据。
💡 解决方法:
- 比较 训练 vs 测试 准确率
- 结合混淆矩阵:
- 相邻等级长期混淆、少数类几乎抓不住 → 模型过于简单(偏差高);
- 少数类能抓到,但整体波动较大、不同随机种子差异明显 → 方差高。
Part 6
6.1
目标:使用在 A4/A5 中选定的最佳模型对
Student_List_A2_Submission.csv 做预测,导出 StudentID, GradeClass 两列的 CSV(行数=提交文件中的全部学生数)。💡 解决方法:
- 拿着训练好的模型,预测一下新的数据就好了
- 想要拿到高成绩?模型推荐?🤔神秘关键词:
GradientBoostingClassifier
Task B 由于每个人的理论上都不一样,这里就不写了防止查重了。有问题可以来私信、群里问我。
