ALipy主动学习(Active Learining,AL)工具包使用教程


本文内容参考ALipy官网

简介

主动学习(Active Learining,AL)

主动学习和强化学习、半监督学习、在线学习类似,它们都介于监督学习和无监督学习之间,这几者概念相似但又有区别。

监督学习问题中,存在标记成本较为昂贵且标记难以大量获取的问题。 针对一些特定任务,只有行业专家才能为样本做上准确标记。在此问题背景下,主动学习(Active Learning, AL)尝试通过选择性的标记较少数据而训练出表现较好的模型。

主动学习(在统计学文献中也称为“查询学习”,有时也称为“最优实验设计”)是机器学习的一个子领域,更广泛地说,是人工智能的一个分支领域。

任何有监督的学习系统要想表现良好,通常都必须在大量的实例上进行训练。但对于一些复杂的监督学习任务,获得标签实例非常困难、耗时或昂贵。

主动学习系统试图通过要求oracle(例如,人工注释器)标记未标记实例形式的查询来克服标记瓶颈。通过这种方式,主动学习者旨在使用尽可能少的标记实例来实现高精度,从而将获得标记数据的成本降至最低。在许多现代机器学习问题中,主动学习是积极的,其中数据可能丰富,但标签稀缺或获取成本高昂。

github中大佬整理的关于主动学习的资料和研究进展awesome active learning

ALipy简介

ALiPy是Python 中的主动学习工具包
ALiPy提供了一个基于模块的主动学习框架实现,允许用户方便地评估、比较和分析主动学习方法的性能。它实现了 20 多种算法,还支持用户在不同设置下轻松实现自己的方法。
ALipy的特点

模型无关:分类模型没有限制。可以根据需要在 sklearn 中使用 SVM 或在 tensorflow 中使用深度模型。

模块独立:可以自由修改工具箱的一个或多个模块,而不会影响其他模块。
在不继承任何东西的情况下实现自己的算法:用户定义的函数几乎没有限制,例如参数或名称

支持的变体设置:嘈杂的预言机、多标签、成本效益、特征查询等

强大的工具:中间结果保存和加载;多线程;实验结果分析等

github地址
ALipy官网

ALipy

ToolBox

alipy.ToolBox 是提供所有可用工具类的类。无需通过 ToolBox 对象传递冗余参数即可获取它们。

与其单独导入每个模块并单独初始化每个类, 通过初始化单个工具箱对象来获取它们会更方便。

此外,还应给出查询类型(query_type)。可用的查询类型有 :
‘AllLabels’——对应于查询一个实例的所有标签;
‘PartLabels’——查询 instance-labels 对;
‘Features’——分别查询实例-特征对。

example:

from sklearn.datasets import *
from alipy import ToolBox
import warnings
'''
在Sklearn机器学习包中,集成了各种各样的数据集,包括前面的糖尿病数据集,
这里引入的是鸢尾花卉(Iris)数据集,它是很常用的一个数据集。
鸢尾花有三个亚属,分别是山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)

该数据集一共包含4个特征变量,1个类别变量。共有150个样本,iris是鸢尾植物,这里存储了其萼片和花瓣的长宽,共4个属性,鸢尾植物分三类
特征变量:
花萼长度、花萼宽度、花瓣长度、花瓣宽度

类别变量:
0--山鸢尾(Iris-setosa)
1--变色鸢尾(Iris-versicolor)
2--维吉尼亚鸢尾(Iris-virginica)
'''
def test():
    data_set, label_set = load_iris(return_X_y=True)    #示例:导入iris数据集;返回实例集合与相应标签
    print("The data set:", data_set)
    print("The label set", label_set)
    alibox = ToolBox(X=data_set, y=label_set, query_type='AllLabels', saving_path='.')

if __name__ == '__main__':
    test()

可以保存并加载包含数据矩阵和拆分设置的 alibox 对象,以用于其他用途(例如,比较不同的策略、分析等)。

alibox.save()
alibox = ToolBox.load('./al_settings.pkl')

IndexCollection

alipy.index.IndexCollection 是一个类似集合的容器,用于管理已标记和未标记的索引。但是,索引是以有序方式存储的。

from sklearn.datasets import load_iris
from alipy import ToolBox
from alipy.index import IndexCollection

X, y = load_iris(return_X_y=True)
alibox = ToolBox(X=X, y=y, query_type='AllLabels', saving_path='.')
a = [1, 2, 3, 10]
a_ind = alibox.IndexCollection(a)
# Or create by importing the module
# a_ind = IndexCollection(a)
print(a_ind)
# add a single index, warn if there is a repeated element.
a_ind.add(4)
# discard a single index, warn if not exist.
a_ind.discard(4)
a_ind.discard(10)
# add a batch of indexes.
a_ind.update([4, 5])
# discard a batch of indexes.
a_ind.difference_update([1, 2])
print(a_ind)

拆分数据

alibox.split_AL()

alibox.split_AL(test_ratio=0.3, initial_label_rate=0.1, split_count=10)

上面的代码将数据集随机拆分为训练集、测试集、标记集、未标记集 10 次。 默认情况下,它将强制每个初始标记的集合至少包含每个类的一个实例。 拆分结果将存储在对象内部,您可以通过以下方式获得一次拆分的折叠:

train_0, test_0, label_0, unlabel_0 = alibox.get_split(round=0)
train_1, test_1, label_1, unlabel_1 = alibox.get_split(round=1)

请注意,返回的标记和未标记索引已转换为 IndexCollection 对象。(例如,label_0、unlabel_0) alibox.get_split(round)

train_idx, test_idx, label_idx, unlabel_idx = alibox.split_AL(test_ratio=0.3,
                                                              initial_label_rate=0.1,
                                                              split_count=10)

整个拆分设置也将返回; 可以在其他地方使用它们。
每个返回值都具有形状 [n_split_count, n_indexes]

State & StateIO 对象

alipy.experiment.StateIO object 是一个用于保存和加载中间结果的类。 此对象实现几个关键功能:

  • 将中间结果保存到文件中

  • 在任何迭代中恢复工作区(标签集和取消标签集)

  • 从断点恢复程序,以防程序意外退出

  • 打印主动学习进度:current_iteration、current_mean_performance、current_cost等。

通过 ToolBox 获取 StateIO 对象很方便。只需要指定整数。

saver = alibox.get_stateio(round=1)

拆分设置将由 ToolBox 对象自动传递,保存路径将 也要从中继承。

将查询添加到 StateIO 对象时,需要使用 State 对象 这是一个像 dict 一样的容器 保存一个查询的一些必要信息(当前迭代的状态)。 如成本、性能、所选指标等。

在初始化 State 对象时,需要设置查询的索引和性能, 成本和queried_labels是可选的:

st = alibox.State(select_index=select_ind, performance=accuracy,
                  cost=cost, queried_label=queried_label)

还可以根据需要添加一些其他条目:

st.add_element(key='my_entry', value=my_value)

将所有有用的信息放入 State 对象后, 您应该将状态添加到 StateIO 对象,并使用方法保存 要归档的中间结果: save()

saver.add_state(st)
saver.save()

QueryStrategy 查询策略

查询策略是主动学习的核心算法之一。
ALiPy目前提供了几种经典和最先进的策略,以及更多 策略将在以后的更新中添加。 实施的策略包括:按委员会查询 (QBC)、不确定性、随机、 ExpectedErrorReduction、GraphDensity 和 QUIRE
所有查询策略:

查询策略说明
‘QueryInstanceUncertainty’不确定性采样
‘QueryRandom’随机
‘QueryInstanceRandom’随机实例
‘QueryInstanceQBC’委员会查询
‘QueryExpectedErrorReduction’预期误差减少
‘QueryInstanceQUIRE’QUIRE
‘QueryInstanceGraphDensity’图密度
‘QueryInstanceBMDR’BMDR
‘QueryInstanceSPAL’SPAL
‘QueryInstanceLAL’LAL只能用于二分类问题
‘QueryInstanceCoresetGreedy’
‘QueryInstanceDensityWeighted’

可以从 alipy 获取查询策略对象。ToolBox 对象,只需要提供策略名称:

QBCStrategy = alibox.get_query_strategy(strategy_name='QueryInstanceQBC')

初始化后,可以通过提供标记索引(label_index)和未标记的索引(unlabel_index),以及设置需要查询多少个样本出来(batch_size)

select_ind = QBCStrategy .select(label_index=Lind,
                                 unlabel_index=Uind,
                                 batch_size=1)

停止标准

满足预设的条件后,停止查询。
初始化:

stopping_criterion = alibox.get_stopping_criterion(stopping_criteria='num_of_queries', value=50)

训练:

while not stopping_criterion.is_stop():# 不满足停止条件
	# step1:查询样本
	# step2:更新训练集(将查询出来的样本加入到训练集中)
	# step3:训练模型(使用更新后的数据集)
停止标准说明
None没有未标记的样品可用(默认)
‘num_of_queries’达到预设的查询次数
‘cost_limit’达到预设的成本限制
‘percent_of_unlabel’未标记池的预设百分比被标记
‘time_limit’达到预设运行时间(CPU 时间)

Calculate performance 计算性能

ALiPy提供各种性能计算功能,用于回归和多类、多标签分类。

可用功能包括:

性能方法说明
‘accuracy_score’准确性分类分数
‘roc_auc_score’根据预测分数计算受试者工作特征曲线下面积 (ROC AUC)
‘get_fps_tps_thresholds’计算每个二进制分类阈值的真阳性和假阳性
‘hamming_loss’计算平均hamming损失。hamming损失是错误预测的标签的比例
‘one_error’计算one_error,类似于 0/1-loss
‘coverage_error’覆盖误差度量。 计算我们需要走多远才能通过排名分数来涵盖所有 真正的标签。最佳值等于平均值 每个样本的标签数。
‘f1_score’F1 分数
‘label_ranking_loss’排名损失度量
‘label_ranking_average_precision_score’基于计算排名的平均精度

使用ToolBox计算性能指标,传入真实的标签值(y_true),预测值(y_pred),计算策略(performance_metric)

acc = alibox.calc_performance_metric(y_true=y, y_pred=model.predict(X),
                                     performance_metric='accuracy_score')
  • 26
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值