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 课程 Regression 章节的第 4 课2-Regression/4-Logistic/README.md为骨架完整讲解如何使用 Scikit-learn 构建逻辑回归模型预测南瓜是橙色还是白色白色 / 非白色二元分类。你将掌握从数据清洗、特征与标签编码、Seaborn 可视化到模型训练、混淆矩阵解读与 ROC 曲线评估的完整闭环并能在配套的 Starter Notebook2-Regression/4-Logistic/notebook.ipynb与完整解法2-Regression/4-Logistic/solution/notebook.ipynb中复现每一步结果。课程背景为什么在回归章节讨论分类在接触了线性回归、多项式回归并处理过美国南瓜批发价格数据2-Regression/data/US-pumpkins.csv之后本课是 Regression 系列的最后一课。逻辑回归虽然名字里带回归但正如 Scikit-learn 官方文档所指出的它本质上是一种基于线性模型的分类方法——本课之所以放在回归专题中讨论更多是出于语言习惯上的便利。逻辑回归的典型应用场景包括这块糖果是不是巧克力这种疾病是否具有传染性这位顾客是否会选择这个产品在本课程的具体项目中我们要回答的问题是给定一些变量某个南瓜更可能是橙色还是白色。南瓜数据中存在一个天然的二元类别列Color因此非常适合用来演示逻辑回归。趣味事实白色南瓜有时被称为幽灵南瓜它们不易雕刻因此不如橙色南瓜受欢迎但外观很酷。所以我们的问题也可以表述为幽灵还是非幽灵。定义问题在开始建模之前先把任务形式化为一个二元问题White白或 Not White非白。数据集中其实还有一类 striped条纹但由于它的样本量极少我们不使用它而且一旦删除数据中的空值这类样本自然就消失了。逻辑回归的核心概念逻辑回归与前面学过的线性回归有几个重要区别。二元分类与连续预测线性回归预测连续值例如根据南瓜产地和采收时间预测其价格会上涨多少。逻辑回归预测二元类别白或非白。其他类型的逻辑回归除了二元逻辑回归还有两种扩展形式多项逻辑回归Multinomial涉及多于一个类别例如橙色、白色和条纹。有序逻辑回归Ordinal涉及有逻辑顺序的类别例如按有限个尺寸等级mini、sm、med、lg、xl、xxl排序的南瓜。变量不需要相关还记得吗线性回归在变量相关性较强时效果更好。逻辑回归恰恰相反——变量之间不需要相互对齐相关。这对本数据集很合适因为南瓜数据中各变量间的相关性本就较弱。需要大量干净数据逻辑回归在数据量更大时给出的结果更准确本课所用的小数据集约 1000 行对此任务而言并非最优这一点需要牢记。练习一数据清洗首先对数据做轻量清洗删除空值行并只选取部分需要的列。columns_to_select [City Name,Package,Variety, Origin,Item Size, Color] pumpkins full_pumpkins.loc[:, columns_to_select] pumpkins.dropna(inplaceTrue)其中full_pumpkins来自 Starter Notebook 中的加载逻辑full_pumpkins pd.read_csv(../data/US-pumpkins.csv)数据实际存放于 2-Regression/data/US-pumpkins.csv原始数据共 26 列包含 City Name、Type、Package、Variety、Grade、Date、价格等多类字段。清洗后我们保留了 6 个字段其中Color即标签列。随时可以查看新的 DataFramepumpkins.info从解法 Notebook2-Regression/4-Logistic/solution/notebook.ipynb中可以看到清洗后的数据形如City Name Package Variety Origin Item Size Color 2 BALTIMORE 24 inch bins HOWDEN TYPE DELAWARE med ORANGE 3 BALTIMORE 24 inch bins HOWDEN TYPE VIRGINIA med ORANGE 4 BALTIMORE 24 inch bins HOWDEN TYPE MARYLAND lge ORANGE练习二用 Seaborn 绘制类别图catplot本课引入一个新的可视化库Seaborn它构建在之前用过的 Matplotlib 之上。Seaborn 提供了一些很实用的数据可视化方式例如在类别图中对比每种Variety品种与Color颜色的数据分布。使用catplot函数并为每个南瓜类别橙色或白色指定颜色映射import seaborn as sns palette { ORANGE: orange, WHITE: wheat, } sns.catplot( datapumpkins, yVariety, hueColor, kindcount, palettepalette, )通过观察这张图可以直观看出颜色数据与品种之间的关系。对应的示例图保存在 2-Regression/4-Logistic/images/pumpkins_catplot_1.png。练习三数据预处理——特征与标签编码南瓜数据集的所有列都是字符串值。人类处理类别数据很直观但机器学习算法只擅长处理数字。**编码Encoding**是数据预处理中非常重要的一步它让我们在不丢失信息的前提下把类别数据转换成数值数据。好的编码是构建好模型的前提。特征编码有两种主要类型1. 序数编码器OrdinalEncoder适用于有序变量ordinal variables——数据遵循逻辑顺序的类别变量例如本数据集中的Item Size列。它会建立映射让每个类别用一个数字表示该数字即该类别在列中的顺序。from sklearn.preprocessing import OrdinalEncoder item_size_categories [[sml, med, med-lge, lge, xlge, jbo, exjbo]] ordinal_features [Item Size] ordinal_encoder OrdinalEncoder(categoriesitem_size_categories)解法 Notebook 中先通过pumpkins[Item Size].unique()查看该列的全部取值[med, lge, sml, xlge, med-lge, jbo, exjbo]这正是上面item_size_categories中定义顺序的依据。2. 类别编码器OneHotEncoder适用于名义变量nominal variables——数据没有逻辑顺序的类别变量例如本数据集中除Item Size外的所有特征。它执行的是 One-Hot 编码每个类别用一列二进制列表示南瓜属于该类别时编码为 1否则为 0。from sklearn.preprocessing import OneHotEncoder categorical_features [City Name, Package, Variety, Origin] categorical_encoder OneHotEncoder(sparse_outputFalse)3. 用 ColumnTransformer 组合多个编码器ColumnTransformer用于在单一步骤中组合多个编码器并把它们应用到对应列上from sklearn.compose import ColumnTransformer ct ColumnTransformer(transformers[ (ord, ordinal_encoder, ordinal_features), (cat, categorical_encoder, categorical_features) ]) ct.set_output(transformpandas) encoded_features ct.fit_transform(pumpkins)ct.set_output(transformpandas)让输出直接以 pandas DataFrame 形式返回。从解法 Notebook 的输出可以看到编码后的特征表列名形如ord__Item Size、cat__City Name_BALTIMORE、cat__Origin_VIRGINIA等最终是48 列1 列序数编码 47 列 One-Hot 编码。4. 编码标签LabelEncoder编码标签时我们使用 Scikit-learn 的LabelEncoder工具类它帮助把标签归一化为 0 到 n_classes-1此处即 0 和 1之间的值from sklearn.preprocessing import LabelEncoder label_encoder LabelEncoder() encoded_label label_encoder.fit_transform(pumpkins[Color])5. 合并特征与标签编码完成后将特征与标签合并进新的 DataFrameencoded_pumpkinsencoded_pumpkins encoded_features.assign(Colorencoded_label)此时encoded_pumpkins共49 列48 个特征列 1 个 Color 标签列。解法 Notebook 还演示了反向映射验证list(label_encoder.inverse_transform([0, 1]))返回[ORANGE, WHITE]确认 0 代表橙色、1 代表白色。练习四分析变量之间的关系数据预处理完成后可以分析特征与标签之间的关系判断模型根据特征预测标签的效果。最佳分析方式是绘制数据。我们再次使用 Seaborn 的catplot在类别图中可视化Item Size、Variety与Color三者的关系。为了画图更清晰这里使用编码后的Item Size列与未编码的Variety列palette { ORANGE: orange, WHITE: wheat, } pumpkins[Item Size] encoded_pumpkins[ord__Item Size] g sns.catplot( datapumpkins, xItem Size, yColor, rowVariety, kindbox, orienth, sharexFalse, margin_titlesTrue, height1.8, aspect4, palettepalette, ) g.set(xlabelItem Size, ylabel).set(xlim(0,6)) g.set_titles(row_template{row_name})参数说明kindbox表示绘制箱线图orienth水平方向sharexFalse允许各子图独立 x 轴范围xlim(0,6)将横轴限制在 0 到 6正好覆盖Item Size的 7 个序数编码值06。结果图见 2-Regression/4-Logistic/images/pumpkins_catplot_2.png。使用 Swarm Plot蜂群图由于Color是二元类别白或非白它需要一种专门的可视化方法。你可以用 Seaborn 将变量并排可视化尝试用 swarm蜂群图展示值的分布palette { 0: orange, 1: wheat } sns.swarmplot(xColor, yord__Item Size, dataencoded_pumpkins, palettepalette)结果见 2-Regression/4-Logistic/images/swarm_2.png。注意上述代码可能会产生一条警告因为 Seaborn 难以把这么多数据点完整表示在一个蜂群图中。一个可行方案是使用size参数减小标记尺寸但要注意这会影响图的可读性。解法 Notebook 中的做法是warnings.filterwarnings(actionignore, categoryUserWarning, moduleseaborn)并在swarmplot中同时传入hueColor以保持调色板一致性。需要强调的是忽略警告并非最佳实践这里只是为了保证绘图的可读性而做出的权衡正常开发中应优先通过调整参数如减小 marker 尺寸来解决问题。数学原理Sigmoid 函数与最大似然逻辑回归建立在**最大似然Maximum Likelihood**概念之上核心工具是Sigmoid 函数。Sigmoid 函数在图上呈 S 形它接受一个值并将其映射到 0 与 1 之间其曲线也被称为逻辑曲线。公式如下其中Sigmoid 的中点位于 x 0 处L 是曲线的最大值k 是曲线的陡峭程度。判类规则是如果函数的输出大于 0.5则将对应标签归为二元选择中的类别 1否则归类为 0。构建逻辑回归模型在 Scikit-learn 中构建这样一个二元分类模型出乎意料地简单。1. 选择变量并划分训练/测试集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_size0.2, random_state0)X是除Color外的所有编码特征y是编码后的标签。test_size0.2表示留出 20% 的数据用于测试random_state0保证结果可复现。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 Predicted labels: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1] F1-score: 0.7457627118644068其中测试集共 199 个样本类别 0橙色166 个、类别 1白色33 个。整体准确率 0.92加权平均 F1 为 0.92。用混淆矩阵理解模型表现虽然可以通过打印上述各项输出获得评估报告但使用**混淆矩阵Confusion Matrix**能更直观地理解模型的表现。 混淆矩阵又称误差矩阵是一种表格它表达模型预测的真/假阳性和真/假阴性从而衡量预测的准确性。调用confusion_matrix()from sklearn.metrics import confusion_matrix confusion_matrix(y_test, predictions)查看模型的混淆矩阵array([[162, 4], [ 11, 22]])在 Scikit-learn 中混淆矩阵的行axis 0是真实标签列axis 1是预测标签010TNFP1FNTP假设模型要在白色和非白色两个二元类别之间对南瓜分类模型预测为非白实际也属于非白类别 →True NegativeTN即左上角数字 162。模型预测为白实际属于非白类别 →False NegativeFN即左下角数字 11。模型预测为非白实际属于白类别 →False PositiveFP即右上角数字 4。模型预测为白实际也属于白类别 →True PositiveTP即右下角数字 22。可以想象我们期望 True Positives 和 True Negatives 数量更大、False Positives 和 False Negatives 数量更小这意味着模型表现更好。混淆矩阵如何关联精确率与召回率回顾前面打印的分类报告精确率precision为 0.85召回率recall为 0.67。利用混淆矩阵中的数字可以验证精确率 tp / (tp fp) 22 / (22 4) 0.8461538461538461 召回率 tp / (tp fn) 22 / (22 11) 0.6666666666666666与报告中的 0.85、0.67 一致保留两位小数。评估指标速查借助混淆矩阵中 TP/TN 与 FP/FN 的映射回顾此前出现过的术语精确率PrecisionTP / (TP FP)检索到的实例中相关实例所占比例即哪些标签被正确标记。召回率RecallTP / (TP FN)被检索到的相关实例所占比例无论是否正确标记。F1 分数(2 × precision × recall) / (precision recall)精确率与召回率的加权平均1 最好、0 最差。Support每个被检索标签的出现次数。准确率Accuracy(TP TN) / (TP TN FP FN)对一个样本正确预测标签的百分比。宏平均Macro Avg对每个标签计算指标的未加权平均不考虑标签不平衡。加权平均Weighted Avg对每个标签计算指标的平均值通过按 support每个标签的真实实例数加权来考虑标签不平衡。思考题如果希望模型减少 False Negatives 的数量应该重点关注哪个指标提示召回率 Recall用 ROC 曲线评估模型再做一个可视化看看所谓的 ROC 曲线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()用 Matplotlib 绘制模型的Receiver Operating CharacteristicROC曲线。ROC 曲线常用于从真阳性与假阳性的角度观察分类器的输出典型 ROC 曲线以 Y 轴为真阳性率True Positive RateX 轴为假阳性率False Positive Rate。因此曲线的陡峭程度以及中线与曲线之间的间隔很重要你希望曲线快速上升并越过对角线。本例中起初有一些假阳性随后曲线正确地向上并越过了对角线最后使用 Scikit-learn 的roc_auc_scoreAPI 计算实际的曲线下面积AUCauc roc_auc_score(y_test,y_scores[:,1]) print(auc)结果为0.9749908725812341。由于 AUC 的取值范围是 0 到 1我们希望得到高分——一个 100% 正确预测的模型 AUC 为 1就本例而言这个模型的表现相当不错。总结与延伸恭喜至此你已完成了 ML-For-Beginners 课程中全部的回归Regression课程并用逻辑回归独立完成了预测南瓜颜色的二元分类任务覆盖了数据清洗、类别编码、可视化探索、模型训练与评估分类报告、混淆矩阵、ROC/AUC的完整流程。在后续的分类课程中你将继续学习如何迭代改进模型分数。当前模型约 1000 行数据即可达到 0.92 的准确率与 0.975 的 AUC这说明在特征选择与编码到位的情况下逻辑回归对小数据集同样能给出不错的基准结果。挑战关于逻辑回归还有更多值得探索的内容但最好的学习方式就是动手实验。找一个适合此类分析的数据集用它构建一个模型看看你能学到什么。本课对应的官方作业见 2-Regression/4-Logistic/assignment.md回到原始数据尝试使用全部数据清洗并标准化来构建逻辑回归模型。评分标准为提交一个解释充分且表现良好的 Notebook优秀、表现勉强合格合格、表现欠佳或缺失待改进。复习与自学建议阅读 Stanford 大学关于逻辑回归实际应用的论文开头部分思考此前学过的各类回归任务中哪些更适合使用哪一种回归/分类方法——哪种方案效果最好另外本课还提供了 R 语言版本的完整实现可参考 2-Regression/4-Logistic/solution/R/lesson_4.htmlScikit-learn 版本的逐单元可运行代码见 2-Regression/4-Logistic/solution/notebook.ipynb。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考