引言:

上期我们讲了什么是逻辑回归,了解了它如何利用Sigmoid函数将线性回归的输出转化为概率,并通过最大似然估计来寻找最佳参数。今天,我们将继续这段旅程,学习如何训练这个

模型、如何评估它的表现,以及如何在真实世界中应用它。

回顾第一篇结尾,我们得到了(对数)似然函数,目标是找到使其最大化的参数θ。但如何找到呢—— 梯度下降,如果模型训练好了,如何衡量它的好坏?—— 评估指标,在本篇文章当中我们用鸢尾花分类这个经典案例讲解如何运用我们之前所学的知识,构建一个预测模型。

(找到使其最大化的参数θ所用到的梯度下降在这篇文章【机器学习十大算法】线性回归(二)中有详细的理论解释。)

Step1:下载数据集
链接: https://pan.baidu.com/s/1yIMbV6xO_P_3TdTNLGs4NQ?pwd=732q提取码: 732q 

先简单观察一下这个数据集

特征说明:

列名含义数据类型说明
S_L花萼长度数值型Sepal Length
S_W花萼宽度数值型Sepal Width
P_L花瓣长度数值型Petal Length
P_W花瓣宽度数值型Petal Width
response鸢尾花种类文本型分类标签

 类别分布:

数据集中包含三种鸢尾花:

类别样本数量
山鸢尾50
杂色鸢尾50
维吉尼亚鸢尾50

(这给数据集只是方便教学使用,在实际开发当中我们并不总能找到这么完美的数据集)

Step2:导入必要的库(我用的软件是pycharm,用conda管理环境,具体可参考这篇Conda 环境管理与 PyCharm 集成实战:从创建到包安装的全方位指南)

pip install pandas numpy matplotlib seaborn scikit-learn openpyxl

或者激活conda环境后:

conda install pandas numpy matplotlib seaborn scikit-learn openpyxl

分析一下这些库:

  • pandas: 数据分析和处理的“瑞士军刀”,提供 DataFrame 来轻松处理表格数据。
  • numpy: 用于高效数值计算的底层库,核心是多维数组 (ndarray)。
  • matplotlib: Python 中最基础、最通用的数据可视化库,用于创建各种图表。
  • seaborn: 基于 Matplotlib,提供更美观、更强大的统计图表,尤其适合探索性数据分析。
  • scikit-learn: 机器学习的标准库,提供易于使用的算法和工具,用于模型训练和评估。
  • openpyxl: 用于读取和写入 .xlsx 格式 Excel 文件的库。

Step3:数据加载和探索

这步主要是让你清楚数据集的结构等等,在数据集较为庞大的时候尤为重要

# -*- coding: gbk -*- #编码声明,防止非 UTF-8 报错
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号# 加载数据(记得将数据集导入pycharm项目,最简单的方法就是拖进去)
df = pd.read_excel('Data1-train.xlsx', sheet_name='Sheet1')# 数据探索
print("数据集形状:", df.shape)
print("\n前5行数据:")
print(df.head())
print("\n数据基本信息:")
print(df.info())
print("\n描述性统计:")
print(df.describe())
print("\n类别分布:")
print(df['response'].value_counts())

结果:

数据集形状: (154, 5)前5行数据:S_L  S_W  P_L  P_W response
0  5.1  3.5  1.4  0.2      山鸢尾
1  4.9    3  1.4  0.2      山鸢尾
2  4.7  3.2  1.3  0.2      山鸢尾
3  4.6  3.1  1.5  0.2      山鸢尾
4    5  3.6  1.4  0.2      山鸢尾数据基本信息:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 154 entries, 0 to 153
Data columns (total 5 columns):#   Column    Non-Null Count  Dtype 
---  ------    --------------  ----- 0   S_L       151 non-null    object1   S_W       151 non-null    object2   P_L       151 non-null    object3   P_W       151 non-null    object4   response  151 non-null    object
dtypes: object(5)
memory usage: 6.1+ KB
None描述性统计:S_L  S_W    P_L    P_W response
count   151  151  151.0  151.0      151
unique   36   24   44.0   23.0        4
top       5    3    1.5    0.2      山鸢尾
freq     10   26   14.0   28.0       50类别分布:
response
山鸢尾         50
杂色鸢尾        50
维吉尼亚鸢尾      50
response     1
Name: count, dtype: int64Process finished with exit code 0

这样我们不仅对数据集有个大概的了解还能及时发现异常,看完之后我们就可以将数据探索这部分的代码注释掉了,结果会决定我们后面对数据进行预处理的方法(前面我们提到,数据集不总是完美的,可能会有数据缺失,类别不平衡的问题,这个时候我们就可以根据需要选择重采样等方法去进行数据预处理)

观察后我们发现了异常,类别分布中显示将response错误认为是一种类别并且显示数量为1,在Step4我们做些处理删掉这一行。

Step4:数据预处理

#删除异常值
df_0 = df[df['response'] != 'response']
# 删除空行,删除缺失值
df_0 = df_0.dropna()# 确认数据清理后的形状
print("清理后数据集形状:", df_0.shape)# 分离特征和目标变量
X = df_0.iloc[:, :-1].values  # 所有行,除最后一列外的所有列
y = df_0.iloc[:, -1].values   # 所有行,只取最后一列# 将类别标签转换为数值
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)# 查看编码映射
print("类别编码:", list(le.classes_))
print("编码对应:", dict(zip(le.classes_, le.transform(le.classes_))))# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)print(f"训练集大小: {X_train.shape}") # (样本数, 特征数)
print(f"测试集大小: {X_test.shape}")# 特征标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

结果如下:

代码解析:

# 分离特征和目标变量:

x = df_0.iloc[:, :-1].values

 iloc 是基于整数位置的索引。 : 表示选择所有行。 :-1 表示选择从第一列到倒数第二列(不包含最后一列)。.values 将选取的 DataFrame 部分转换为 NumPy 数组。(这部分代码用于提取所有特征列,并将它们存储在 NumPy 数组  x 中)

y = df_0.iloc[:, -1].values  

其他同上,.values 将选取的 最后一列转换为 NumPy 数组。(这部分代码用于提取目标变量列(通常是分类标签),并存储在 NumPy 数组  y 中。)

简单来说就是这么选的:

# 将类别标签转换为数值:

from sklearn.preprocessing import Label

le = LabelEncoder( )

(LabelEncoder 的作用是将分类的文本标签(如 '山鸢尾', '杂色鸢尾')转换为机器可以理解的数字格式(如 0, 1, 2)。) 

y = le.fit_transform(y)

le.fit(y) :LabelEncoder会扫描  y  数组,找出所有唯一的类别标签,并学习它们之间的映射关系。 le.transform(y) :根据学习到的映射关系,将  y 数组中的每个文本标签替换为对应的数字。 fit_transform(y) 结合了上述两个步骤,一步完成学习和转换。 转换后的数值型 y 已经被重新赋值,供后续模型使用。

# 查看并打印编码映射:

list(le.classes_)

le.classes_ 是  LabelEncoder  在  fit  过程中学习到的所有唯一类别标签(按字母顺序排序)。这里将其转换为列表,方便查看。

dict(zip(le.classes_, le.transform(le.classes_)))

le.transform(le.classes_) : 将所有唯一的类别标签再次进行转换,得到它们对应的数字编码。  zip(le.classes_, le.transform(le.classes_)) : 将原始类别标签和它们的数字编码一 一配对。  dict(...): 将这些配对转换成一个字典,例如 `{'山鸢尾': 0, '杂色鸢尾': 1, '维吉尼亚鸢尾': 2}`。 ( 这段代码的作用是清晰地展示原始文本标签和它们被转换后的数字标签之间的对应关系。)

#划分训练集和测试集

from sklearn.model_selection import train_test_split : 导入用于划分数据集的函数。

 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y) : 

test_size=0.2 : 指定将 20% 的数据用作测试集,剩下的 80% 用作训练集。

 random_state=42 : 这是一个种子值,用于确保每次运行代码时,数据集的划分都是相同的,这有助于复现实验结果。如果省略,每次划分都会不同。

stratify = y: 这是非常重要的一点。它表示在划分训练集和测试集时,保持原始  y  数组中各类别的比例分布。 (例如,如果原始数据中有 50% 的 '山鸢尾',那么训练集和测试集中的 '山鸢尾' 比例也应该大致是 50%。 这样做对于处理类别不平衡的数据集非常重要,可以确保模型的训练和评估在各个类别上都尽可能公平。)

# 特征标准化

scaler = StandardScaler()X_train = scaler.fit_transform(X_train)X_test = scaler.transform(X_test)

scaler = StandardScaler(): 创建一个标准化工具,准备好进行标准化的“算法”。

scaler.fit_transform(X_train):

学习 (fit) 训练集 X_train 的每个特征的均值和标准差。

应用 (transform) 学习到的均值和标准差,将 X_train 的数值标准化。

scaler.transform(X_test):

应用 (transform) 之前从 X_train 中学习到的相同的均值和标准差,将测试集 X_test 的数值标准化。

最终的效果:
X_train 和 X_test 中的所有数值都被缩放到一个共同的尺度(均值为 0,标准差为 1)。这样,在后续的机器学习模型训练和预测中,各个特征之间的数值差异就不会因为其原始的量级不同而造成不公平的影响,模型可以更有效地学习。

本文总结

在本篇文章中,我们以一个经典的鸢尾花分类数据集为例,完整地演示了构建一个机器学习预测模型的第一步和第二步:

  1. 数据加载与探索 (Data Loading & Exploration)

    • 使用 pandas 库读取 Excel 格式的数据集。

    • 通过 .shape.head().info().describe().value_counts() 等方法快速了解数据集的全貌,包括数据规模、特征类型、缺失值、统计信息和类别分布。

    • 关键发现:在探索过程中,我们敏锐地发现了数据中的异常行(‘response‘ 被错误地当作了一个类别标签)和数据缺失问题。

  2. 数据预处理 (Data Preprocessing)

    • 数据清洗 (Data Cleaning):果断地删除了包含异常值和缺失值的行,保证了数据质量。

    • 特征与标签分离 (Feature/Target Split):使用 .iloc 将数据明确划分为特征矩阵 X 和目标变量 y

    • 标签编码 (Label Encoding):利用 LabelEncoder 将文本形式的花卉种类标签(如‘山鸢尾’)转换为数值形式(如 0, 1, 2),这是模型能够处理的前提。

    • 数据集划分 (Train-Test Split):使用 train_test_split 方法将数据划分为训练集和测试集,并设置了 stratify 参数以确保训练集和测试集中各类别的比例一致,这对于获得可靠的模型评估结果至关重要。

    • 特征标准化 (Feature Standardization):使用 StandardScaler 对特征数据进行标准化处理,将不同尺度的特征缩放到同一标准正态分布下,从而大幅提升许多机器学习模型(如逻辑回归、SVM)的性能和训练速度。

至此,我们已经拥有了一个干净、规整、且经过预处理的训练集 (X_trainy_train) 和测试集 (X_testy_test),为下一步的模型训练做好了万全准备。


下一步预告:数据准备就绪后,我们将进入下一个环节——数据可视化。在下一篇文章中,我们将:

  • 使用预处理好的数据集进行可视化。

  • 详细分析可视化图标所蕴含的信息

  • 详细分析每一条代码的含义一步步敲出数据可视化

  • 深入讲解并运用三种可视化图标来全面观察数据集,对比分析不同模型反映出什么样的数据信息。

敬请期待:逻辑回归(三):从原理到实战 - 训练、评估与应用指南  (链接将在文章发布后更新)

作者本人水平有限,非常欢迎任何反馈和指正,请随时指出我可能存在的误解、遗漏或表述不当之处。

我将继续深入学习机器学习和统计学领域,并持续更新我的理解和最佳实践。我愿意虚心接受反馈,不断打磨和完善我的内容,以便为读者提供更可靠、更有价值的信息。

感谢您提供的建议,它们对我至关重要!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/97969.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/97969.shtml
英文地址,请注明出处:http://en.pswp.cn/web/97969.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

9.8C++作业

思维导图#include <iostream> #include <vector> #include <fstream> using namespace std;class Stu {friend ofstream &operator<<(ofstream &ofs,const Stu &stu); private:string name;string id;int age;double score; public:Stu(){…

Linux内存管理章节十六:非均匀的内存访问:深入Linux NUMA架构内存管理

引言 在传统的SMP&#xff08;对称多处理&#xff09;系统中&#xff0c;所有CPU核心通过一条共享总线访问同一块内存&#xff0c;所有内存访问延迟是均匀的&#xff08;UMA&#xff09;。然而&#xff0c;随着CPU核心数量的增加&#xff0c;共享总线成为了巨大的性能和 scalab…

【论文翻译】Seg-Zero: Reasoning-Chain Guided Segmentation via Cognitive Reinforcement

0. 摘要Traditional methods for reasoning segmentation rely on supervised fine-tuning with categorical labels and simple descriptions, limiting its out-of-domain generalization and lacking explicit reasoning processes. To address these limitations, we propo…

Playwright MCP浏览器自动化教程

你是否曾厌倦在编程软件和浏览器之间反复切换&#xff0c;只为了检查AI生成的代码能否正常运行&#xff1f;现在&#xff0c;有了Playwright MCP&#xff08;Model Context Protocol&#xff09;&#xff0c;你可以直接让AI自己操作浏览器&#xff0c;查看自己写的代码运行效果…

矩阵中遍历某个点周围的九个点

又是学习新知识的一天,以下为Java版本部分关键代码int[] neighbors {0, 1, -1};int rows board.length;int cols board[0].length;int[][] copyBoard new int[rows][cols];for (int row 0; row < rows; row) {for (int col 0; col < cols; col) {int liveNeighbors…

单例模式:只有一个对象

目录 什么是单例模式 能解决什么问题 使用场景 如何实现 __new__ 方法&#xff1a;经典又直接 装饰器&#xff1a;不改类本身&#xff0c;也能单例 模块本身就是单例 注意事项 总结 你有没有过这样的困扰&#xff1a; “为什么我明明只创建了一次数据库连接&#xff0…

AI大模型学习(6)Yolo V8神经网络的基础应用

Yolo V8神经网络的基础应用2024-2025年最火的目标检测神器&#xff0c;一篇文章让你彻底搞懂&#xff01;&#x1f929;大家好呀&#xff01;今天我们要聊一聊计算机视觉领域的「明星模型」——YOLO神经网络&#xff01;&#x1f3af; 如果你对「目标检测」这个词还比较陌生&am…

C++:imagehlp库

imagehlp库1. 简介2. 主要函数与用途2.1PE 文件解析相关2.2 符号处理相关2.3 崩溃转储相关2.4 版本资源相关3. 使用示例3.1 解析内存地址对应的函数名和行号3.2 创建目录使用示例1. 简介 imagehlp 是 Windows 系统提供的一个图像处理与调试辅助 API 库&#xff08;Image Helpe…

如何在Anaconda中配置你的CUDA Pytorch cuNN环境(2025最新教程)

目录 一、简介 二、下载CUDA 三、下载Pytorch-GPU版本 四、下载CUDNN 五、总结 六、测试代码 一、简介 啥是Anaconda?啥是CUDA?啥是CUDNN&#xff1f;它们和Pytorch、GPU之间有啥关系? 怎么通俗解释它们三者的用途和关系&#xff1f; 1.GPU(图形处理单元&#xff09…

算法面试(1)-----目标检测和图像分类、语义分割的区别

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 目标检测&#xff08;Object Detection&#xff09;、图像分类&#xff08;Image Classification&#xff09;、语义分割&#xff08;Semantic Segmentation&#xff09; 是计算机视…

电脑散热风扇有噪音怎么解决

一、初步检查与清理断电并拆机关闭电脑并拔掉电源&#xff0c;打开机箱侧板&#xff08;笔记本需先拆除后盖螺丝&#xff09;。操作前建议佩戴防静电手环&#xff0c;避免静电损坏硬件。清理风扇及散热片灰尘使用压缩空气罐从风扇进风口吹走灰尘&#xff0c;或用软毛刷轻轻刷去…

SeaweedFS深度解析(九):k8s环境使用helm部署Seaweedfs集群

上一篇&#xff1a;《SeaweedFS深度解析&#xff08;八&#xff09;&#xff1a;k8s环境使用Operator部署Seaweedfs集群》 链接: link #作者&#xff1a;闫乾苓 文章目录k8s环境使用helm部署Seaweedfs集群准备镜像seaweed-master-localpv-storageclass.yamlseaweed-volume-lo…

MATLAB绘制一个新颖的混沌图像(新四翼混沌系统)

新四翼混沌系统:dx/dt a(y - x) yz dy/dt cx - y - xz dz/dt -bz xyMATLAB代码:function plot_novel_chaotic_system() % 参数设置 a 10; b 8/3; c 28;% 初始条件 x0 [1, 1, 1];% 时间范围 tspan [0 100];% 求解微分方程 [t, x] ode45((t, x) chaotic_system(t, x, …

金融数据---获取股票日线数据

获取股票日线的数据方式有很多&#xff0c;包括东方财富&#xff0c;同花顺&#xff0c;tushare&#xff0c;这里我们就利用东方财富的数据&#xff0c;是免费的开源获取&#xff0c;第一步先安装akshare&#xff0c;pip安装就可以py -m pip install akshareAkshare 股票数据获…

Mac 真正多显示器支持:TESmart USB-C KVM(搭载 DisplayLink 技术)如何实现

多显示器已经不再是奢侈品&#xff0c;而是专业人士提升生产力的必需工具。无论是创意设计师、股票交易员还是软件开发人员&#xff0c;多屏幕都能让工作流程更高效、更有条理。 然而&#xff0c;Mac 用户长期以来面临一个主要障碍&#xff1a;macOS 原生不支持多流传输&#x…

【实时Linux实战系列】静态链接与libc选择:musl vs glibc的时延权衡

背景与重要性 在实时系统开发中&#xff0c;选择合适的C标准库&#xff08;libc&#xff09;和链接方式对系统的启动时间、线程性能和内存分配效率有着显著影响。glibc和musl是两种流行的C标准库实现&#xff0c;它们在设计目标和性能表现上存在差异。通过对比这两种libc在启动…

Altium Designer(AD24)的三种文件组织形式,工程文件,自由文件与存盘文件

🏡《专栏目录》 目录 1,概述 2,工程文件 3,自由文件 4,存盘文件 5,文件转换 5.1,工程文件于自由文件互转换 5.2,工程文件于存盘文件互转换 6,注意事项 1,概述 本文介绍Altium Designer 24软件(后文简称AD24或软件)的三种文件组织形式,工程文件,自由文件和存盘文…

Python+Selenium实现自动化测试

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快安装selenium打开命令控制符输入&#xff1a;pip install -U selenium火狐浏览器安装firebug&#xff1a;www.firebug.com&#xff0c;调试所有网站语言&#xff0…

2024年CSP-X初赛真题及答案解析(6-10)

2024年CSP-X初赛真题及答案解析(6-10) 字符串abcabcabc有多少不同的非空子串?( )。 A. 24 B. 36 C. 45 D. 46 答案:A 解析: 长度 1: 3 个(a, b, c) 长度 2: 3 个(ab, bc, ca) 长度 3: 3 个(abc, bca, cab) 长度 4: 3 个(abca, bcab, cabc) 长度 5: 3 个(a…

缓存与数据库一致性的4大坑及终极解决方案

缓存雪崩、击穿、穿透全中招&#xff1f;别让缓存与数据库的“爱恨情仇”毁了你的系统&#xff01; 你有没有经历过这样的深夜告警&#xff1a;Redis 响应延迟飙升&#xff0c;数据库 CPU 直冲 100%&#xff0c;接口大面积超时&#xff1f;一查日志&#xff0c;发现大量请求绕过…