news 2026/9/10 9:45:48

ML-For-Beginners 逻辑回归结业作业实战:用全量南瓜数据重建分类模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ML-For-Beginners 逻辑回归结业作业实战:用全量南瓜数据重建分类模型

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 曲线评估的全部步骤,是核对答案的最佳参照。
  • 依赖库:pandasnumpyseabornmatplotlibscikit-learnpreprocessingcomposemodel_selectionlinear_modelmetrics等子模块)。

数据加载方式与课程一致:

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 列中大量字段(如TypeGradeLow Price等)与「南瓜颜色」分类目标无关或缺失严重,只保留与建模相关的列:

columns_to_select = ['City Name', 'Package', 'Variety', 'Origin', 'Item Size', 'Color'] pumpkins = full_pumpkins.loc[:, columns_to_select]

第二步:删除缺失值。课程已提示,数据集中的striped(条纹)类别样本极少,且会在删除空值后自然消失,因此目标变量天然收敛为ORANGEWHITE的二分类:

pumpkins.dropna(inplace=True)

清洗后可通过pumpkins.info查看 DataFrame 概况,并确认Color列仅剩两种取值。

关于「标准化(standardized)」的说明

作业原文明确要求对数据进行清洗和标准化。需要说明的是:仓库解题笔记本在预处理阶段采用的标准化手段是编码(encoding)——即将City NamePackageVarietyOriginItem 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 NamePackageVarietyOrigin之间不存在大小关系,采用独热编码为每个类别生成一个二值列(属于该类别为 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 的catplotswarmplot等可视化手段检查Item SizeVarietyColor的关系,观察特征与标签的分布,判断模型的可预测性。

五、构建并评估逻辑回归模型

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):

实际 \ 预测01
0TN(真阴性)FP(假阳性)
1FN(假阴性)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:

  1. 是否使用了全部数据?数据源应为 2-Regression/data/US-pumpkins.csv 的完整清洗结果,而非课程中的子集。
  2. 是否完成了清洗与标准化?应包含缺失值处理(dropna)、字段选择、特征/标签编码;如需数值标准化,可补充StandardScaler等步骤。
  3. 模型是否可运行且被良好描述?Notebook 中应包含从数据加载、预处理到模型训练、评估的完整可复现代码,并用 Markdown 单元对每一步作出解释——这是「优秀」档「well-explained」的要求。
  4. 模型性能如何?至少应达到课程子集模型的水平(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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 9:45:39

S7-1200大型PLC项目实战:数据规划、Modbus通信与调试经验

把西门子博图(TIA Portal)里的自学Demo升级成真正能稳定运行在现场的大型项目程序,这个跨度比很多人想象的大得多。我接手过一套超市储藏环境自动控制项目,程序里二十多个FB、上百个DB变量、五路Modbus轮询,还要同时处…

作者头像 李华
网站建设 2026/9/10 9:44:37

三维WSN覆盖优化:基于麻雀搜索算法的空洞修复方案

1. 项目概述:三维WSN覆盖优化与空洞修复 在无线传感器网络(WSN)部署中,三维空间下的节点覆盖优化一直是个棘手问题。传统二维平面部署方案无法满足无人机监测、立体仓储等真实三维场景需求。我们团队最近用Matlab实现了一套基于麻…

作者头像 李华
网站建设 2026/9/10 9:43:17

CANN/ge LLM数据分发API

# TransferWithCacheKeyConfig 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE …

作者头像 李华
网站建设 2026/9/10 9:43:11

TVBoxOSC 新手上手指南:电视盒子控制与管理应用

TVBoxOSC 新手上手指南:电视盒子控制与管理应用 【免费下载链接】TVBoxOSC TVBoxOSC - 一个基于第三方项目的代码库,用于电视盒子的控制和管理。 项目地址: https://gitcode.com/GitHub_Trending/tv/TVBoxOSC TVBoxOSC 是一个面向电视盒子的开源控…

作者头像 李华
网站建设 2026/9/10 9:42:00

Arduino ESP32 开发环境搭建:四层拆解,首次烧录一次跑通

Arduino ESP32 开发环境搭建:四层拆解,首次烧录一次跑通 【免费下载链接】arduino-esp32 Arduino core for the ESP32 family of SoCs 项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32 搭 Arduino ESP32 开发环境时最常见的卡点…

作者头像 李华