ML-For-Beginners 逻辑回归结业作业实战:用全量南瓜数据重建分类模型
【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners
本篇技术指南围绕 ML-For-Beginners 项目回归模块第 4 课(Logistic regression to predict categories)的课后作业展开。作业要求读者不再局限于课堂示例使用的数据子集,而是回到原始南瓜数据集 2-Regression/data/US-pumpkins.csv,在完成清洗(cleaned)与标准化(standardized)后,用全部数据重新构建一个逻辑回归(Logistic Regression)模型,并以 Notebook 形式提交。读完本文,你将掌握从全量原始数据出发完成数据清洗、特征/标签编码、模型训练、指标评估到对照评分标准自查的完整闭环。
一、作业任务解读:从子集走向全量数据
课程 2-Regression/4-Logistic/README.md 在讲解逻辑回归时,只使用了US-pumpkins.csv中经筛选的一小部分字段与样本,用于演示「给定若干变量,预测南瓜颜色是橙色还是白色」这一二分类问题。而作业 translations/da/2-Regression/4-Logistic/assignment.md(英文原版见 translations/en/2-Regression/4-Logistic/assignment.md)明确提出:
在本课中你使用了南瓜数据的子集。现在回到原始数据集,使用全部数据——经过清洗与标准化——来构建一个逻辑回归模型。
这与课程正文反复强调的一个要点直接呼应:逻辑回归在数据量越大时结果越准确,课堂上约 1000 行的小样本并非该任务的最优配置。因此本次作业的本质是一次「扩展实验」:验证在更大、更完整的数据集上,逻辑回归的分类性能能否进一步提升。
评分标准(Rubric)原文
作业给出了三档评分标准,是自检完成度的直接依据:
| 标准 | 优秀(Outstanding) | 合格(Satisfactory) | 需改进(Needs Improvement) |
|---|---|---|---|
| 交付物 | 提供一个 Notebook,其中模型描述清晰且性能良好 | 提供一个 Notebook,模型能够最低限度地工作 | 提供一个 Notebook,模型表现不佳,或根本没有模型 |
二、准备工作:复现课堂环境
在开始之前,你需要确认以下仓库资源就绪:
- 数据集:2-Regression/data/US-pumpkins.csv——原始南瓜交易数据,包含城市、品种、产地、包装、规格、颜色等 26 列,是本次作业的数据源。
- 课堂起点笔记本:2-Regression/4-Logistic/notebook.ipynb——课程中加载数据与预览的起点。
- 完整解题参考:2-Regression/4-Logistic/solution/notebook.ipynb——本作业对应的完整实现,展示了从读取数据到 ROC 曲线评估的全部步骤,是核对答案的最佳参照。
- 依赖库:
pandas、numpy、seaborn、matplotlib与scikit-learn(preprocessing、compose、model_selection、linear_model、metrics等子模块)。
数据加载方式与课程一致:
import pandas as pd import numpy as np full_pumpkins = pd.read_csv('../data/US-pumpkins.csv') full_pumpkins.head()三、数据清洗:从全量原始数据到可用数据集
作业要求「清洗并使用全部数据」。参照解题笔记本 2-Regression/4-Logistic/solution/notebook.ipynb 的实现,清洗分两步:
第一步:字段选择。原始数据 26 列中大量字段(如Type、Grade、Low Price等)与「南瓜颜色」分类目标无关或缺失严重,只保留与建模相关的列:
columns_to_select = ['City Name', 'Package', 'Variety', 'Origin', 'Item Size', 'Color'] pumpkins = full_pumpkins.loc[:, columns_to_select]第二步:删除缺失值。课程已提示,数据集中的striped(条纹)类别样本极少,且会在删除空值后自然消失,因此目标变量天然收敛为ORANGE与WHITE的二分类:
pumpkins.dropna(inplace=True)清洗后可通过pumpkins.info查看 DataFrame 概况,并确认Color列仅剩两种取值。
关于「标准化(standardized)」的说明
作业原文明确要求对数据进行清洗和标准化。需要说明的是:仓库解题笔记本在预处理阶段采用的标准化手段是编码(encoding)——即将City Name、Package、Variety、Origin、Item Size等字符串类别字段转换为数值(详见下一节),这正是 scikit-learn 语境下对类别型数据的常规处理方式;课程正文亦强调「机器学习算法对数值友好,编码是数据预处理中非常关键的一步」。如果你的实现希望进一步对数值型特征做尺度归一(例如用sklearn.preprocessing.StandardScaler将连续特征缩放到均值为 0、方差为 1),这属于在仓库示例基础上的合理延伸,可按作业要求自行补充,并注意逻辑回归对特征尺度敏感这一特性。
四、特征与标签编码:让机器读懂南瓜
这是课程的核心内容,也是作业模型能否「性能良好」的关键前提。南瓜数据集所有列都是字符串,需要编码为数值。仓库采用了两类编码器组合:
1. 顺序编码(OrdinalEncoder)——用于有逻辑顺序的名义变量。数据集中的Item Size(规格:sml → med → med-lge → lge → xlge → jbo → exjbo)存在天然的大小次序,适合用整数映射表示:
from sklearn.preprocessing import OrdinalEncoder item_size_categories = [['sml', 'med', 'med-lge', 'lge', 'xlge', 'jbo', 'exjbo']] ordinal_features = ['Item Size'] ordinal_encoder = OrdinalEncoder(categories=item_size_categories)注意categories参数显式指定了类别的先后顺序,这是保证映射稳定、符合业务语义的关键。
2. 类别编码(OneHotEncoder)——用于无逻辑顺序的名义变量。City Name、Package、Variety、Origin之间不存在大小关系,采用独热编码为每个类别生成一个二值列(属于该类别为 1,否则为 0):
from sklearn.preprocessing import OneHotEncoder categorical_features = ['City Name', 'Package', 'Variety', 'Origin'] categorical_encoder = OneHotEncoder(sparse_output=False)3. 用 ColumnTransformer 组合编码器。将上述两步合并为一次流水线变换,分别作用于各自对应的列:
from sklearn.compose import ColumnTransformer ct = ColumnTransformer(transformers=[ ('ord', ordinal_encoder, ordinal_features), ('cat', categorical_encoder, categorical_features) ]) ct.set_output(transform='pandas') encoded_features = ct.fit_transform(pumpkins)4. 标签编码(LabelEncoder)。目标列Color用 scikit-learn 的LabelEncoder归一化为 0/1(0 与 1 之间取值):
from sklearn.preprocessing import LabelEncoder label_encoder = LabelEncoder() encoded_label = label_encoder.fit_transform(pumpkins['Color'])5. 合并特征与标签,得到可直接建模的encoded_pumpkins数据框:
encoded_pumpkins = encoded_features.assign(Color=encoded_label)编码完成后,课程还建议用 Seaborn 的catplot、swarmplot等可视化手段检查Item Size、Variety与Color的关系,观察特征与标签的分布,判断模型的可预测性。
五、构建并评估逻辑回归模型
5.1 划分训练集与测试集
沿用课程做法,用train_test_split按 8:2 划分数据,并固定随机种子以保证结果可复现:
from sklearn.model_selection import train_test_split X = encoded_pumpkins[encoded_pumpkins.columns.difference(['Color'])] y = encoded_pumpkins['Color'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)5.2 训练模型并输出分类报告
from sklearn.metrics import f1_score, classification_report from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X_train, y_train) predictions = model.predict(X_test) print(classification_report(y_test, predictions)) print('Predicted labels: ', predictions) print('F1-score: ', f1_score(y_test, predictions))课程在约 1000 行子集上得到的参考输出如下(全量数据上的结果会因数据规模与分布变化而不同,应以你实际运行结果为准):
precision recall f1-score support 0 0.94 0.98 0.96 166 1 0.85 0.67 0.75 33 accuracy 0.92 199 macro avg 0.89 0.82 0.85 199 weighted avg 0.92 0.92 0.92 199其中几个关键指标的含义(这也是作业评估中判断「性能良好」的依据):
- Precision(精确率):TP / (TP + FP),检索到的实例中相关实例的比例(预测为白色的南瓜中有多少真的是白色)。
- Recall(召回率):TP / (TP + FN),相关实例中被正确检索到的比例(真实的白色南瓜中被预测出来的比例)。
- F1-score:(2 × precision × recall) / (precision + recall),精确率与召回率的加权平均,最佳为 1,最差为 0。
- Support:每个标签在测试集中的实际出现次数。
- Accuracy:(TP + TN) / (TP + TN + FP + FN),预测正确的样本占比。
- Macro Avg / Weighted Avg:各标签指标的无加权平均 / 按 support 加权的平均。
5.3 用混淆矩阵深入理解模型
分类报告之外,混淆矩阵能更直观地呈现模型的真实正负类表现:
from sklearn.metrics import confusion_matrix confusion_matrix(y_test, predictions)课程示例输出为:
array([[162, 4], [ 11, 22]])scikit-learn 中混淆矩阵的行为真实标签(axis 0),列为预测标签(axis 1):
| 实际 \ 预测 | 0 | 1 |
|---|---|---|
| 0 | TN(真阴性) | FP(假阳性) |
| 1 | FN(假阴性) | TP(真阳性) |
以「白色南瓜」为正类(1)为例:左上角是正确预测为「非白色」的真阴性;右上角是实际非白色却被预测为白色的假阳性;左下角是实际白色却被预测为非白色的假阴性;右下角是正确预测为白色的真阳性。理想模型应追求 TN 与 TP 尽量大、FP 与 FN 尽量小。混淆矩阵与 precision/recall 存在直接换算关系:
- Precision = tp / (tp + fp) = 22 / (22 + 4) ≈ 0.846
- Recall = tp / (tp + fn) = 22 / (22 + 11) ≈ 0.667
这恰好与分类报告中类别 1 的 precision(0.85)与 recall(0.67)吻合,可作为验证你理解正确性的自测题。
5.4 用 ROC 曲线与 AUC 收尾
课程最后用 ROC(Receiver Operating Characteristic)曲线直观评估分类器在「真阳性率 vs 假阳性率」上的表现,并计算 AUC(Area Under the Curve):
from sklearn.metrics import roc_curve, roc_auc_score import matplotlib import matplotlib.pyplot as plt %matplotlib inline y_scores = model.predict_proba(X_test) fpr, tpr, thresholds = roc_curve(y_test, y_scores[:, 1]) fig = plt.figure(figsize=(6, 6)) plt.plot([0, 1], [0, 1], 'k--') plt.plot(fpr, tpr) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('ROC Curve') plt.show() auc = roc_auc_score(y_test, y_scores[:, 1]) print(auc)课程示例的 AUC 约为0.9749908725812341。AUC 取值区间为 [0, 1],越接近 1 说明模型越接近「100% 正确预测」,课程结论是「模型相当不错」(pretty good)。完成作业时,可将全量数据模型与课程子集模型的 AUC、F1 等指标对比,作为「数据量更大、模型更好」的直接证据。
六、对照评分标准自查清单
提交前,用作业的 Rubric 逐项核对你的 Notebook:
- 是否使用了全部数据?数据源应为 2-Regression/data/US-pumpkins.csv 的完整清洗结果,而非课程中的子集。
- 是否完成了清洗与标准化?应包含缺失值处理(
dropna)、字段选择、特征/标签编码;如需数值标准化,可补充StandardScaler等步骤。 - 模型是否可运行且被良好描述?Notebook 中应包含从数据加载、预处理到模型训练、评估的完整可复现代码,并用 Markdown 单元对每一步作出解释——这是「优秀」档「well-explained」的要求。
- 模型性能如何?至少应达到课程子集模型的水平(accuracy 约 0.92 量级);如果混淆矩阵、分类报告或 ROC/AUC 指标明显退化,应回到数据清洗与编码环节排查(例如检查缺失值是否引入偏差、编码顺序是否正确)。可参照 2-Regression/4-Logistic/solution/notebook.ipynb 逐单元比对。
完成以上四点,你的 Notebook 即满足「优秀」档的交付标准。本次作业同时是回归模块的收官任务——在后续分类课程中,你还会学到更多迭代提升模型分数的技术,而基于全量数据重建逻辑回归模型正是理解「数据规模与预处理质量如何影响分类性能」的最佳实验起点。
【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考