尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于 ML-For-Beginners 的逻辑回归分类实战:用 Scikit-learn 预测南瓜颜色

基于 ML-For-Beginners 的逻辑回归分类实战:用 Scikit-learn 预测南瓜颜色 基于 ML-For-Beginners 的逻辑回归分类实战用 Scikit-learn 预测南瓜颜色【免费下载链接】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系列的最后一课——逻辑回归Logistic Regression为骨架展开。该课程使用美国南瓜市场数据2-Regression/data/US-pumpkins.csv训练一个二元分类模型根据城市、包装、品种、产地和尺寸等变量预测南瓜颜色橙色或白色。读完本文你将掌握 Seaborn 分类可视化、OrdinalEncoder/OneHotEncoder 特征编码、ColumnTransformer流水线组装以及基于LogisticRegression的建模、混淆矩阵解读和 ROC/AUC 评估的完整流程。一、为什么回归课程中要讲分类问题逻辑回归虽然名字里带着回归但它本质上是一种分类方法——这是本课要首先厘清的概念。在本系列回归课程中讨论它更多是出于语言习惯的便利逻辑回归在 Scikit-learn 中被归入sklearn.linear_model模块且其数学基础是线性的但它解决的问题却是预测二元类别。典型应用场景包括这颗糖果是巧克力还是不是这种疾病是否具有传染性这位顾客是否会选择这个产品与之对比此前课程介绍的线性回归用于预测连续数值例如给定南瓜的产地和收获时间价格会上涨多少。而逻辑回归输出的则是一个二元类别例如白色或非白色。1.1 二元分类Binary Classification逻辑回归不提供线性回归那样的连续值预测能力它给出的是一个二元类别判定。在本课场景中问题被表述为给定一些变量预测某个南瓜更可能是橙色还是白色。1.2 其他类型的逻辑回归多分类与有序分类除二元分类外逻辑回归还存在两种扩展形式Multinomial多分类涉及多于一个类别例如橙色、白色和条纹Ordinal有序分类涉及有序类别适用于需要对结果按逻辑顺序排列的场景。例如本数据集中的南瓜尺寸Item Sizemini、sm、med、lg、xl、xxl就是典型的序数变量。1.3 与线性回归的两点关键差异变量之间不需要相关。线性回归在自变量相关性更强时表现更好逻辑回归恰恰相反变量之间不必强相关因此它适合本数据集这类相关性较弱的场景。需要大量干净的数据。逻辑回归在数据量更大时能给出更精确的结果。本课使用的数据集只有约 1000 行并不算最优规模这一点需要在评估模型时牢记。二、定义问题从南瓜数据中提取二元标签继续沿用此前课程反复处理的南瓜数据。通过观察可以发现数据中存在一个天然的二元类别Color颜色。课程将预测目标定义为二元问题白色或非白色。数据集中虽然也存在striped条纹类别但样本量极少并且在去除空值后自然消失因此不在建模范围内。小知识白色南瓜有时被称为幽灵南瓜ghost pumpkin因为它们不太容易雕刻不如橙色南瓜受欢迎但外观很酷。因此这个问题也可以重新表述为幽灵或非幽灵。三、数据清洗与准备首先对数据进行整理删除空值并只保留建模所需的列。对应代码位于课程的起始笔记本 2-Regression/4-Logistic/notebook.ipynb 中columns_to_select [City Name,Package,Variety, Origin,Item Size, Color] pumpkins full_pumpkins.loc[:, columns_to_select] pumpkins.dropna(inplaceTrue)City Name城市、Package包装、Variety品种、Origin产地是名义变量nominalItem Size尺寸是序数变量ordinalColor颜色是待预测的标签。随时可以查看清洗后的数据框pumpkins.info四、数据可视化用 Seaborn 绘制分类图本课引入一个新的可视化库Seaborn它构建在之前用过的 Matplotlib 之上提供了更高级的统计绘图接口。通过catplot的kindcount计数图可以直观对比每种Variety品种与Color颜色的数据分布import seaborn as sns palette { ORANGE: orange, WHITE: wheat, } sns.catplot( datapumpkins, yVariety, hueColor, kindcount, palettepalette, )通过观察图形可以看出Color与Variety之间的关系不同品种在颜色分布上存在明显差异这正是建模时值得利用的信号。五、数据预处理特征编码与标签编码南瓜数据集的全部列都是字符串值。人类处理分类数据很直观但机器学习算法只擅长处理数字因此编码是数据预处理阶段至关重要的一步——它能把类别数据转化为数值数据而不丢失信息。好的编码是构建好模型的前提。5.1 特征编码的两种主要编码器① OrdinalEncoder序数编码器——适合序数变量序数变量是数据遵循逻辑顺序的类别变量如本数据集中的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)注意这里显式传入了categories参数明确了从小到大的 7 档尺寸顺序sml → med → med-lge → lge → xlge → jbo → exjbo确保编码后的数字真实反映尺寸的大小次序。② OneHotEncoder独热编码器——适合名义变量名义变量的数据不遵循逻辑顺序如除Item Size外的所有特征。独热编码为每个类别生成一个二元列若南瓜属于该品种则该列为 1否则为 0from sklearn.preprocessing import OneHotEncoder categorical_features [City Name, Package, Variety, Origin] categorical_encoder OneHotEncoder(sparse_outputFalse)5.2 用 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 返回。从解决方案笔记本 2-Regression/4-Logistic/solution/notebook.ipynb 中可以看到编码后的列结构ord__Item Size一列以及cat__City Name_ATLANTA、cat__Origin_TEXAS等大量独热列——列名_类别的命名方式正是 ColumnTransformer 对每列编码来源的标注。5.3 标签编码对标签列Color使用LabelEncoder将类别规范化到 0 到n_classes-1之间的整数值本任务为 0 和 1from sklearn.preprocessing import LabelEncoder label_encoder LabelEncoder() encoded_label label_encoder.fit_transform(pumpkins[Color])最后将编码后的特征与标签合并成新数据框encoded_pumpkinsencoded_pumpkins encoded_features.assign(Colorencoded_label)六、分析特征与标签的关系预处理完成后可以通过绘图分析特征与标签的关系评估模型利用特征预测标签的潜力。再次使用 Seaborn 的catplot这次以kindbox绘制箱线图观察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})由于Color是二元类别还可以使用swarm 图蜂群图从另一视角展示数值分布。swarm 图会把每个数据点铺开避免重叠适合观察点集的密度与范围palette { 0: orange, 1: wheat } sns.swarmplot(xColor, yord__Item Size, dataencoded_pumpkins, palettepalette)⚠️ 注意上述代码可能产生警告因为当数据点过多时 Seaborn 难以在 swarm 图中完整表示所有点。一种可行的解决方法是使用size参数减小标记尺寸但这会影响图的可读性需要权衡。6.1 背后的数学Sigmoid 函数与最大似然逻辑回归的核心是**最大似然maximum likelihood**概念借助Sigmoid 函数实现。Sigmoid 函数在图中呈S形它接收一个值并将其映射到 0 到 1 之间的某个位置其曲线也被称为逻辑曲线logistic curve公式中Sigmoid 的中点位于 x 的 0 点处L是曲线最大值k是曲线陡峭程度。如果函数输出大于 0.5该标签被赋予二元选择中的类别 1否则被分类为 0。这正是逻辑回归能把线性输出压缩成概率并据此完成二元决策的机理。七、构建与训练逻辑回归模型在 Scikit-learn 中构建二元分类模型非常直接。7.1 划分训练集与测试集选取建模变量并调用train_test_split()划分数据。特征矩阵X取encoded_pumpkins中除Color外的所有列标签y为Colorfrom 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)这里test_size0.2表示 20% 数据留作测试random_state0固定随机种子以保证结果可复现。7.2 训练与预测用训练数据调用fit()训练模型并用predict()对测试集预测随后打印分类报告与 F1 分数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 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从结果可见类别 0非白色有很高的 precision0.94和 recall0.98而类别 1白色样本量较少support33recall 相对偏低0.67说明模型对白色南瓜的召回还有提升空间。八、用混淆矩阵深入理解模型表现仅看分数报告可能不够直观**混淆矩阵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结合本课白色 / 非白色的二分类场景逐一解读模型预测为非白色、实际也是非白色 →真负例TN对应左上角数字 162模型预测为白色、实际是非白色 →假正例FP对应右上角数字 4模型预测为非白色、实际是白色 →假负例FN对应左下角数字 11模型预测为白色、实际也是白色 →真正例TP对应右下角数字 22。显然我们希望真负例与真正例数量尽可能多、假正例与假负例尽可能少——这代表模型性能更好。8.1 混淆矩阵与 Precision、Recall 的换算回顾分类报告中类别 1 的 precision0.85和 recall0.67它们恰好可以由混淆矩阵的数字推导出来Precision tp / (tp fp) 22 / (22 4) 0.8461538461538461 Recall tp / (tp fn) 22 / (22 11) 0.66666666666666668.2 评估指标速查表借助 TP/TN 与 FP/FN 的映射可以重新审视此前见到的全部术语Precision精确率TP / (TP FP)检索到的实例中相关实例所占比例即哪些标签被正确标记Recall召回率TP / (TP FN)被检索到的相关实例所占比例无论是否被正确标记F1-score(2 × precision × recall) / (precision recall)精确率与召回率的加权平均最好为 1、最差为 0Support每个被检索标签的出现次数Accuracy准确率(TP TN) / (TP TN FP FN)样本中被正确预测标签的百分比Macro Avg宏平均每个标签指标的未加权平均不考虑标签不均衡Weighted Avg加权平均每个标签指标按其 support该标签的真实实例数加权后的平均考虑了标签不均衡。思考题如果希望模型减少假负例的数量应该重点盯住哪个指标九、可视化 ROC 曲线并计算 AUC最后通过ROC 曲线受试者工作特征曲线观察分类器的输出质量。ROC 曲线常以真正例率TPR为 Y 轴、假正例率FPR为 X 轴展示分类器在真实正例与假正例之间的权衡。用 Matplotlib 绘制 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()曲线的陡峭程度以及曲线与中间对角线之间的面积都很有意义我们希望曲线迅速向上并越过中间线。在本例中曲线一开始存在一些假正例随后迅速爬升越过对角线说明模型判别能力良好最后用 Scikit-learn 的roc_auc_score计算曲线下面积AUCauc roc_auc_score(y_test,y_scores[:,1]) print(auc)结果为0.9749908725812341。由于 AUC 取值范围为 0 到 1我们希望它尽可能大——预测 100% 正确的模型 AUC 为 1。本例中模型表现相当不错。十、延伸练习与作业挑战练习逻辑回归还有大量值得探索的内容但最好的学习方式是动手实验。可以寻找一个适合此类分析的公开数据集用同样的流程构建模型观察能学到什么。课后作业在 2-Regression/4-Logistic/assignment.md 中课程要求回到原始数据尝试使用全部数据清洗并标准化后重新构建逻辑回归模型评估标准为是否呈现一个解释充分且性能良好的模型Exemplary、性能勉强达标的模型Adequate还是表现不佳或无模型的笔记本Needs Improvement。对照参考本课在 R 语言中也有完整实现 2-Regression/4-Logistic/solution/R/lesson_4.htmlPython 的完整带输出版见 2-Regression/4-Logistic/solution/notebook.ipynb其中可核对ColumnTransformer编码后的列结构、train_test_split划分、LogisticRegression训练、confusion_matrix与roc_auc_score的完整调用链。小结至此ML-For-Beginners 回归系列课程全部完成。本课以南瓜颜色预测为载体走完了逻辑回归分类的完整链路定义二元问题 → 清洗数据 → Seaborn 可视化探索 → 特征/标签编码 → 建模训练 → 混淆矩阵与指标解读 → ROC/AUC 评估。这套流程直接复用于后续课程中的分类任务——在接下来的课程中你将学习如何通过迭代进一步优化模型分数。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表