主动学习(Active Learning,AL)的理解以及代码流程讲解

article/2025/8/29 13:14:00

为什么要使用主动学习(Active Learning,AL)

针对有监督的学习任务,存在标记成本较为昂贵且标记难以大量获取的问题。
在此问题背景下,主动学习(Active Learning, AL)尝试通过选择性的标记较少数据而训练出表现较好的模型

例如,此时我们有大量的猫和狗的数据,假设人为标记他们的类别是成本非常高的事情,这时需要用到主动学习从中挑选部分数据对他们进行标注以节约成本,用主动模型选取出的标注数据训练的模型比随机选取出的相同数量的标注数据训练的模型精度更高。

如图所示,图(a)是全部数据集,图©中使用主动学习策略仅选取30个样本训练出的逻辑回归模型即可达到90%的准确率,而图(b)中随机选取的30个样本训练出的模型却相对表现较差。
在这里插入图片描述
在这里插入图片描述

主动学习的工作流程

主动学习的关键是你选择的模型使用的不确定性度量以及应用于请求标注的查询策略
在这里插入图片描述

1.收集数据&选取模型

开始先选择一定数量的数据进行标注,选取我们需要训练的模型(比如逻辑回归模型)。

2.训练模型

将标注好的数据放入模型中进行训练,此时精度不会很高。

3.判断精度是否达到要求

①若精度达到要求(比如99%),则表示模型以及训练好,可以应用。
②若精度没有达到要求(比如只有12%),则表示模型未被训练好,这是需要利用主动学习选取对模型精度的提高最有用的数据进行人工标注。

4.定义查询策略

包括度量预测的不确定度和应用于请求标注的查询策略,返回策略选择出的需要标注的数据,进行人工标注,转至第2步。
例如:

def custom_query_strategy(classifer, X):utility = utility_measure(classifer, X) #度量预测的不确定度query_idx = select_instances(utility) #应用于请求标注的查询策略return query_idx,X[query_idx]

主动学习的pytorch编码流程

主动学习的编写代码流程如下:

在这里插入图片描述

代码实战

接下来我们以一个主动回归例子为主,实现主动学习的编码。

1.导入相应的包

import numpy as np
import matplotlib.pyplot as plt
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import WhiteKernel, RBF
from modAL.models import ActiveLearner
%matplotlib inline

2.数据集准备以及初始数据集的选取

# 生成回归数据集 加高斯噪声
X = np.random.choice(np.linspace(0, 20, 10000), size=200, replace=False).reshape(-1, 1)
y = np.sin(X) + np.random.normal(scale=0.3, size=X.shape)
#原始数据集可视化
with plt.style.context('seaborn-white'):plt.figure(figsize=(10, 5))plt.scatter(X, y, c='k', s=20)plt.title('sin(x) + noise')plt.show()
# 初始数据集的选取
n_initial = 5 # 最开始随机选取5个标注好的数据集进行训练
initial_idx = np.random.choice(range(len(X)), size=n_initial, replace=False)
X_training, y_training = X[initial_idx], y[initial_idx]

在这里插入图片描述

3.定义主动学习器ActiveLeaner

(参数包括模型的选取estimator、应用于请求标注的查询策略query_stategy以及初始数据)
我们使用高斯回归作为模型进行训练GaussianProcessRegressor

#定义estimator高斯回归模型的核函数
kernel = RBF(length_scale=1.0, length_scale_bounds=(1e-2, 1e3)) \+ WhiteKernel(noise_level=1, noise_level_bounds=(1e-10, 1e+1))
#定义query_stategy应用于请求标注的查询策略
def GP_regression_std(regressor, X):_, std = regressor.predict(X, return_std=True) #不确定度度量query_idx = np.argmax(std) #样本的选取return query_idx, X[query_idx]
#定义ActiveLeaner 主动学习器
regressor = ActiveLearner(estimator=GaussianProcessRegressor(kernel=kernel),query_strategy=GP_regression_std,X_training=X_training.reshape(-1, 1), y_training=y_training.reshape(-1, 1)
)
#可视化初始模型的精度状况
X_grid = np.linspace(0, 20, 1000)
y_pred, y_std = regressor.predict(X_grid.reshape(-1, 1), return_std=True)
y_pred, y_std = y_pred.ravel(), y_std.ravel()
with plt.style.context('seaborn-white'):plt.figure(figsize=(10, 5))plt.plot(X_grid, y_pred)plt.fill_between(X_grid, y_pred - y_std, y_pred + y_std, alpha=0.2)plt.scatter(X, y, c='k', s=20)plt.title('Initial prediction')plt.show()

在这里插入图片描述

4.定义n_queries(要标记数据的数量)进行主动学习

#定义n_queries(要标记数据的数量)进行主动学习
n_queries = 10
for idx in range(n_queries):query_idx, query_instance = regressor.query(X)regressor.teach(X[query_idx].reshape(1, -1), y[query_idx].reshape(1, -1))

5.最终结果可视化

y_pred_final, y_std_final = regressor.predict(X_grid.reshape(-1, 1), return_std=True)
y_pred_final, y_std_final = y_pred_final.ravel(), y_std_final.ravel()
with plt.style.context('seaborn-white'):plt.figure(figsize=(10, 8))plt.plot(X_grid, y_pred_final)plt.fill_between(X_grid, y_pred_final - y_std_final, y_pred_final + y_std_final, alpha=0.2)plt.scatter(X, y, c='k', s=20)plt.title('Prediction after active learning')plt.show()

在这里插入图片描述
可见,使用主动学习的方法让我们仅使用了25个点就拟合出1000个点生成的图像,大大节约了人工标记的成本。

参考链接:
https://zhuanlan.zhihu.com/p/377045943


http://chatgpt.dhexx.cn/article/JZtuocVb.shtml

相关文章

主动学习(Active learning)简介

文章目录 Labeling faster vs. labeling smarter1. 什么是主动学习?2. 主动学习如何运行?2.1 Stream-based Active Learning2.2 Pool-based Active Learning2.3 Membership Query Synthesis 3. 主动学习与强化学习的不同?4. 不确定性度量1&am…

哪本书适合推荐给 Java 初学者?

之前写过一篇文章叫《假如时光倒流, 我会这么学习Java》, 希望对你有帮助: ----------------------------------------------------------------------- 回头看看, 我进入Java 领域已经快15个年头了, 虽然学的也一般…

Java程序员必看的20本书,从入门到精通!收藏

推荐的20本学习 Java 必看书,记得点收藏哈~ 基础核心 1、《Java核心技术卷2:高级特性(原书第9版)》 豆瓣评分: 8.7 推荐指数:👍👍👍👍 2、《图解 HTTP》 讲漫画一样的…

Java入门到进阶推荐书籍

Java学习中推荐的书籍 第一本,《Head First JAVA》 小白学习JAVA的入门书籍,这本书和其他专业书籍相比多了一些趣味性,让人能够读下去,知识点比较全面,但是也没有讲的很深。 第二本,《JAVA核心技术卷1》 …

【书籍学习】史上最全的Java进阶书籍推荐

学习Java,书籍是必不可少的学习工具之一,尤其是对于自学者而言。废话不多说,下边就给大家推荐一些Java进阶的好书。 第一部分:Java语言篇 1.《Java编程规范》 适合对象:初级、中级 介绍:这本书的作者是被…

java 入门书籍(java7)

一、Java从入门到精通 《Java从入门到精通(第3版)》从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发需要掌握的知识。 《Java从入门到精通(第3版)》编辑推荐:“软件开发视频大讲堂”丛书系清华社…

Java从入门到进阶书单推荐|必收藏

关于Java从入门到进阶的书单推荐 一、入门基础类 如果是0基础学习,入门阶段千万不要选择太难的书,首先太难的你也看不懂,而且会打击信心,所以建议选择通俗易懂的就行,先领进门(注意:基础一定要…

零基础学Java有哪些必看书?推荐这5本

零基础学Java初学者,想要入门,应该多看一些关于Java的书,先充实理论基础。然而Java的技术知识是海量的,市面上关于Java的书令人眼花缭乱,零基础的小白完全不知道该看哪本书。那么,零基础学Java有哪些必看书…

MySQL启动1053错误之解决方法

版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/qq_42680327 创建mysql服务时,系统已提示创建服务成功,但是net start mysql命令提示启动失败,并在services.msc中提示1053错误 解决办法1…

解决phpstudy mysql启动不了

之前的电脑上下了mysql,phpstudy自带一个mysql,目测是本来的mysql进程占用端口。 1、按winR键,输入 services.msc 找到mysql服务,关闭 2、再以管理员身份运行 一定要用管理员身份运行,我的问题这种方法解决了,其他的…

phpstudy mysql启动不了,问题已解决

首先讲一下我遇到的问题,安装好phpStudy v8.1之后,MySQL无法无法启动,出现错误的原因大概是phpStudy与原先下载的MySQL冲突了,随后在网上找了一些教程,进行了一系列操作:(有些朋友成功了&#x…

MySQL启动与关闭的3种方式

MySQL启动与关闭的3种方式 在这里大概记述一下MySQL最常用的3种启动与关闭的方式 文章目录 MySQL启动与关闭的3种方式一、第一种方式二、第二种方式三、第三种方式总结 一、第一种方式 直接搜索“服务”或者搜索“service”,再点击服务 找到MySQL57,…

Linux查看mysql是否启动+mysql启动(全)

整理一下Linux下启动mysql服务的命令。 目录 1.使用命令 # service mysqld status 2、使用命令# ps aux|grep mysqld 3、使用命令# pidof mysqld 4、使用命令# ps -ef|grep mysqld 5、使用# systemctl list-unit-files 命令,q退出 一、查看mysql是否启动——…

MySQL启动报错:mysql拒绝访问错误5

使用命令net start mysql启动数据库服务时候,出现如下错误: 原因是当前用户的权限过低导致的。 解决mysql拒绝访问错误5 1、win x 打开一个面板如下,选择命令提示符(管理员)【 解决办法:在系统搜索cmd&…

Mysql启动之报错:The server quit without updating PID file

一、问题描述 某次一线报某业务网站门户登录验证码获取失败;因该验证码是代码里通过验证码函数实现存入数据库,登录时再读取数据库里的验证码来实现包包里破解登录的;因此本次故障极大可能出现在数据库服务器故障。类似报错信息如下&#xff…

net start mysql启动常见问题

数据库安装常见问题 1、安装时net start mysql 后mysql启动失败。。服务无法启动。。服务没有报告任何错误 解决方法: 1)找到MySQL的安装目录,将data删除 (注意该文件下会有一些你自己建立的数据库的数据!) 2)搜索cmd以**管理员身份运行 **进入本机mysql…

Mysql启动选项和配置文件

Mysql启动选项和配置文件 Mysql启动方式 下面的启动命令都需要依赖在Linux环境下配置的Mysql环境变量 vi /etc/profile 在文件末尾加上Mysql的安装路径(演示中mysql配置在/usr/local/mysql-5.7.26下,这个路径需要根据自己的环境而定) expor…

如何启动MySQL服务

第一种 1.通过快捷键(WinR)输入 service.msc 调出服务窗口 2.找到MySQL服务,选择打开,或者自动打开即可 第二种 1.通过 cmd 窗口,以管理员身份打开,输入指令: net start mysql 即可 2.不区分…

MySQL数据库如何启动?

本篇文章主要跟大家介绍的是MySQL数据库如何启动,相信很多朋友都不清楚吧,对此,摩杜云小杜整理了一下并分享给大家做个参考,由于内容质量高,且简洁明了,感兴趣的朋友不妨来看看,记得要看完。 前…

模型的参数verbose用法详解

模型的参数verbose含义 verbose是日志显示,有三个参数可选择,分别为0,1和2。 当verbose0时,简单说就是不输出日志信息 ,进度条、loss、acc这些都不输出。当verbose1时,带进度条的输出日志信息,示例如下&am…