目录
本文内容参考ALipy官网
简介
主动学习(Active Learining,AL)
主动学习和强化学习、半监督学习、在线学习类似,它们都介于监督学习和无监督学习之间,这几者概念相似但又有区别。
监督学习问题中,存在标记成本较为昂贵且标记难以大量获取的问题。 针对一些特定任务,只有行业专家才能为样本做上准确标记。在此问题背景下,主动学习(Active Learning, AL)尝试通过选择性的标记较少数据而训练出表现较好的模型。
主动学习(在统计学文献中也称为“查询学习”,有时也称为“最优实验设计”)是机器学习的一个子领域,更广泛地说,是人工智能的一个分支领域。
任何有监督的学习系统要想表现良好,通常都必须在大量的实例上进行训练。但对于一些复杂的监督学习任务,获得标签实例非常困难、耗时或昂贵。
主动学习系统试图通过要求oracle(例如,人工注释器)标记未标记实例形式的查询来克服标记瓶颈。通过这种方式,主动学习者旨在使用尽可能少的标记实例来实现高精度,从而将获得标记数据的成本降至最低。在许多现代机器学习问题中,主动学习是积极的,其中数据可能丰富,但标签稀缺或获取成本高昂。
github中大佬整理的关于主动学习的资料和研究进展awesome active learning
ALipy简介
ALiPy是Python 中的主动学习工具包
ALiPy提供了一个基于模块的主动学习框架实现,允许用户方便地评估、比较和分析主动学习方法的性能。它实现了 20 多种算法,还支持用户在不同设置下轻松实现自己的方法。
ALipy的特点
模型无关:分类模型没有限制。可以根据需要在 sklearn 中使用 SVM 或在 tensorflow 中使用深度模型。
模块独立:可以自由修改工具箱的一个或多个模块,而不会影响其他模块。
在不继承任何东西的情况下实现自己的算法:用户定义的函数几乎没有限制,例如参数或名称
支持的变体设置:嘈杂的预言机、多标签、成本效益、特征查询等
强大的工具:中间结果保存和加载;多线程;实验结果分析等
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')