🗒️FIT 1043 ASGN 1

Cs, Go!

FIT 1043|2025-9-15|最后更新: 2025-9-24|
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) 删除这些异常行。
 

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
💡 解决方法:
  • 使用 matplotlibplt.pie(...) 绘制;
 

A2.3 饼图显示详细数据

目标:用饼图显示各 GradeClass 的占比,并进行简短观察描述。
💡 解决方法:
  • 使用 matplotlibplt.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 分组,计算 GPAAbsences 的统计指标(平均数、中位数、标准差、四分位距)。
💡 解决方法:
  • 使用 df.groupby('GradeClass').agg({...}) 在一次调用里完成。
  • 对 GPA 和 Absences 同时计算:
    • mean, median, std
    • IQR 可用 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
      • StudentID
      • GPA
    • Keep (Features)
      • Age
      • StudyTimeWeekly
      • Absences
      • ParentalSupport
     

    3.3 数据集切分(训练集与测试集)

    目标:将数据按 70/30 的比例分为训练集和测试集,并报告各自的样本量。如果数据量很小,讨论是否仍适用该比例。
    💡 解决方法:
    • 使用 train_test_split(..., test_size=0.3, stratify=y) 保持类别分布一致。
    直接参考Applied课件
    notion image
    • 输出训练集与测试集的样本量: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)。
    • 需要缩放的列:
      • Age
      • StudyTimeWeekly
      • Absences
      • ParentalSupport
    • 不需要缩放的列:GradeClass(标签)。

    4.2 SVM 学习

    🎦
    学习视频:
    Video preview
    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

    目标:展示 SVMRandom 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

    目标:展示 SVMRandom Forest 的 5×5 混淆矩阵,识别一个常见的误分类模式,并解释可能原因。
    💡 解决方法:
    • 使用 confusion_matrix(y_test, y_pred) 得到 5×5 矩阵。
    • 观察矩阵中最大或频繁的误分类(如 B↔C 或 D↔F)。
    • 解释原因:
      • 相邻等级边界模糊 → GPA 区间接近,特征重叠;
      • 特征影响不显著 → 学习时间、缺勤和家长支持的差异不足以明显区分;
      • 类别不平衡 → F 占多数,导致模型更容易预测成 F。

    5.3

    由于每个同学的model不一样,这里只列出几个注意事项
    • 考虑到需要测量的数据如果每个数量相同,两个模型的最终结果 - 注意结果要均衡,不能某一类完全为0。
    • 准确率大不代表一切
     

    5.3

    目标:分别判断 SVMRandom Forest 在本数据集上更可能受到“高偏差”还是“高方差”的影响,并给出依据。
    💡 解决方法:
    • 比较 训练 vs 测试 准确率
    • 结合混淆矩阵
      • 相邻等级长期混淆、少数类几乎抓不住 → 模型过于简单(偏差高)
      • 少数类能抓到,但整体波动较大、不同随机种子差异明显 → 方差高

    Part 6

    6.1

    目标:使用在 A4/A5 中选定的最佳模型对 Student_List_A2_Submission.csv 做预测,导出 StudentID, GradeClass 两列的 CSV(行数=提交文件中的全部学生数)。
    💡 解决方法:
    • 拿着训练好的模型,预测一下新的数据就好了
    • 想要拿到高成绩?模型推荐?🤔神秘关键词:GradientBoostingClassifier
     
    Task B 由于每个人的理论上都不一样,这里就不写了防止查重了。有问题可以来私信、群里问我。
    Loading...