当前位置: 首页 > article >正文

【Python机器学习】1.8. 逻辑回归实战(基础):建立一阶边界模型、画分类散点图、逻辑回归模型的代码实现、可视化决策边界

喜欢的话别忘了点赞、收藏加关注哦(关注即可查看全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
在这里插入图片描述

1.8.1. 使用matplotlib画分类散点图

我想大家都知道未分类别的散点图是怎么画的:
请添加图片描述

plt.scatter(x1, x2)

但在分类问题中你会需要把不同的类别的点体现出来,你可以改颜色,也可以改形状,也可以两者都改:

假设我们有两个特征x1x2,以及类别标签y(0和1)。其中,类别0用红色圆点(o 表示,类别1用蓝色三角形(^ 表示。

import numpy as np
import matplotlib.pyplot as plt

# 生成随机数据
np.random.seed(42)
x1 = np.random.randn(20)
x2 = np.random.randn(20)
y = np.random.randint(0, 2, 20)  # 随机分类 0 或 1

# 过滤数据
class_0 = (y == 0)
class_1 = (y == 1)

# 绘制散点图
plt.figure(figsize=(6, 5))

# 绘制类别 0(红色圆形)
plt.scatter(x1[class_0], x2[class_0], c='red', marker='o', label="Class 0")

# 绘制类别 1(蓝色三角形)
plt.scatter(x1[class_1], x2[class_1], c='blue', marker='^', label="Class 1")

# 添加图例和标签
plt.xlabel("Feature x1")
plt.ylabel("Feature x2")
plt.title("Scatter Plot of Two Classes")
plt.legend()
plt.grid(True)

# 显示图形
plt.show()
  • 生成数据

    • 使用np.random.randn()生成两个特征x1x2(随机正态分布)
    • np.random.randint(0, 2, 20)生成20个随机分类标签(0或1)
  • 数据筛选

    • 通过class_0 = (y == 0)class_1 = (y == 1)选取不同类别的数据
  • 绘制散点图

    • plt.scatter()分别绘制类别0和1,并设定不同的 颜色(c形状(marker:类别 0(红色圆形o)、类别 1(蓝色三角形^
  • 增强可视化

    • 通过plt.legend()添加图例,使类别区分更清晰
    • plt.grid(True)添加网格,提高可读性

输出图片:
请添加图片描述

1.8.2. 逻辑回归的代码实现

接下来,请你确保你的Python环境中有pandasmatplotlibscikit-learnnumpy这几个包,如果没有,请在终端输入指令以下载和安装:

pip install pandas matplotlib scikit-learn numpy

Step 1: 准备数据

这里需要使用到我的csv文件,我把它上传到了GitCode,你点击链接即可查看和下载。

它有3栏信息,一栏是x1,一栏是x2,这两栏代表两个输入变量。另一栏是success_or_fail,这一栏数据要么是0要么是1,1代表成功,0代表失败。

下载好后把它移到你的Python项目文件夹里即可。

Step 2: 读取数据

我们依旧使用pandas库来读取数据:

# 读取数据  
import pandas as pd  
data = pd.read_csv('Logistic_Regression_Data.csv')  
  
print(data.head())

输出:

   x1  x2  success_or_fail
0   6   2                0
1  19  11                1
2  14   7                1
3  10   2                0
4   7   0                0

如果你有一样的输出就代表没问题。

我们还可以用上文我们介绍过的画分类别的散点图的知识来可视化这些数据:

# 可视化数据  
import matplotlib.pyplot as plt  
  
x1 = data.loc[:,'x1'].to_numpy()  
x2 = data.loc[:,'x2'].to_numpy()  
y = data.loc[:,'success_or_fail'].to_numpy()  
  
class_0 = (y == 0)  
class_1 = (y == 1)  
  
# 绘制类别 0(红色圆形)  
plt.scatter(x1[class_0], x2[class_0], c='red', marker='o', label="Class 0")  
  
# 绘制类别 1(蓝色三角形)  
plt.scatter(x1[class_1], x2[class_1], c='blue', marker='^', label="Class 1")  
  
# 添加图例和标签  
plt.xlabel("Feature x1")  
plt.ylabel("Feature x2")  
plt.title("Scatter Plot of Two Classes")  
plt.legend()  
  
# 显示图形  
plt.show()

输出图片:
请添加图片描述

Step 2: 给xy赋值

我们要首先明确xy代表什么:

  • x代表的是输入变量,也就是x1x2
  • ysuccess_or_fail这一栏的数据
# 给x和y赋值  
x = data.drop(['success_or_fail'], axis=1)  
y = data.loc[:,'success_or_fail']
  • 使用drop函数丢弃指定的字段,保留其它字段。这里写的是'success_or_fail',那就丢弃它,axis=1告诉程序丢弃的是'success_or_fail'这一列而不是行。

Step 3: 训练模型

把数据喂给scikit-learn下的逻辑回归模型进行训练即可:

# 训练模型  
from sklearn.linear_model import LogisticRegression  
model = LogisticRegression()  
model.fit(x, y)

Step 4: 获取决策边界

我们可以通过coef_intercept_两个方法分别获得截距和系数:

# 获取决策边界  
theta1, theta2 = model.coef_[0]  
theta0 = model.intercept_[0]

print(f"Decision Boundary: y = {theta1}x1 + {theta2}x2 + {theta0}")
  • 由于我们有两个输入变量,所以就有两个系数theta1theta2

这些值也就对应了上一篇文章 1.7. 逻辑回归理论(进阶) 中所讲的公式的各个参数:
g ( x ) = θ 0 + θ 1 x 1 + θ 2 x 2 g(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2 g(x)=θ0+θ1x1+θ2x2
输出:

Decision Boundary: y = 0.5729567667358711x1 + 0.5997810709872152x2 + -9.324928012209842

Step 5: 获取预测值

# 获取预测值  
prediction = model.predict(x)

print(prediction)

输出:

[0 1 1 0 0 0 1 1 1 0]

Step 6: 可视化决策边界

我们现在来把决策边界画出来:

# 可视化数据  
import matplotlib.pyplot as plt  
  
x1 = data.loc[:, 'x1'].to_numpy()  
x2 = data.loc[:, 'x2'].to_numpy()  
y = data.loc[:, 'success_or_fail'].to_numpy()  
  
class_0 = (y == 0)  
class_1 = (y == 1)  
  
# 绘制类别 0(红色圆形)  
plt.scatter(x1[class_0], x2[class_0], c='red', marker='o', label="Class 0")  
  
# 绘制类别 1(蓝色三角形)  
plt.scatter(x1[class_1], x2[class_1], c='blue', marker='^', label="Class 1")  
  
# 绘制决策边界  
import numpy as np  
  
# 计算 x1 的范围  
x1_min, x1_max = x1.min() - 1, x1.max() + 1  
x1_range = np.linspace(x1_min, x1_max, 100)  
  
# 使用决策边界公式计算 x2
x2_boundary = -(theta1 * x1_range + theta0) / theta2  
  
# 绘制决策边界  
plt.plot(x1_range, x2_boundary, color='green', label="Decision Boundary")  
  
# 添加图例和标签  
plt.xlabel("Feature x1")  
plt.ylabel("Feature x2")  
plt.title("Scatter Plot of Two Classes")  
plt.legend()  
  
# 展示  
plt.show()
  • x1.min()x1.max():找到训练数据中 x_1 的最小值和最大值

  • x1.min() - 1x1.max() + 1:在边界外稍微扩展一点,保证绘制的直线不会刚好卡在边界上,视觉上更好

  • np.linspace(x1_min, x1_max, 100)

    • 生成 100 个均匀分布的x_1值,形成一个连续的 x 轴范围
    • 这样可以绘制一条平滑的直线
  • x1_range传入后,可以计算出100个对应的x_2值,形成一条直线

输出图片:
请添加图片描述

1.8.3. 评估模型表现

对于比较少的数据,我们可以直接画图来看模型效果(如上图)。对于比较多的数据,我们要定量地评估就不能只靠图了。

评估逻辑回归模型相比起评估线性回归模型要简单一些,使用准确率来评判即可:
A c c u r a c y = 正确预测样本数量 总样本数量 Accuracy = \frac{正确预测样本数量}{总样本数量} Accuracy=总样本数量正确预测样本数量
准确率肯定是越接近1越好。但是不要过于追求准确率,否则会导致过拟合问题。

我们可以用scikit-learn提供的代码来计算准确率:

# 计算准确率  
from sklearn.metrics import accuracy_score  
accuracy = accuracy_score(y, prediction)  
print(f"Accuracy: {accuracy}")

输出:

Accuracy: 1.0

这说明我们的模型非常成功,是百分百的正确率(其实看图也看得出来)。


http://www.kler.cn/a/577846.html

相关文章:

  • PHP之特性
  • Ae 效果详解:VR 降噪
  • LeetCode 538.把二叉搜索树转换为累加树
  • Java直通车系列13【Spring MVC】(Spring MVC常用注解)
  • 【Java开发指南 | 第三十五篇】Maven + Tomcat Web应用程序搭建
  • java后端开发day27--常用API(二)正则表达式爬虫
  • 李宏毅机器学习课程笔记05 | 卷积神经网络Convolutional Neural Network(CNN)
  • 目标追踪综述
  • 8. 机器人模型训练与评估(具身智能机器人套件)
  • selenium库工作原理
  • Three.js 进阶(uv映射的应用)
  • tauri-plugin-shell插件将_blank的a标签用浏览器打开了,,,解决办法
  • 搜广推校招面经四十
  • Kotlin 协程和线程的主要区别
  • 腾讯云TBDS获金融信创实验室全项适配认证 打造国产化大数据平台标杆
  • docker 常用命令教程
  • 单例模式:确保一个类只有一个实例
  • C# 初学者的系统学习路径与职业规划指南
  • Prompt Engineering的技术发展趋势
  • 在Spring Boot项目中分层架构