今天的情况是,数据更容易获得,而且数量越来越多,这增加了数据科学家分析和 预处理数据的努力。数据科学家在预处理数据、清理数据、验证数据和标记数据时需要遵循许多种流程。给数据贴标签是非常耗费精力和时间的。在监督学习中,我们可以理解有多少标记数据对于一个模型的训练是很重要的。例如,在NLP过程中,我们有人们的情绪,但这些情绪没有被分类;在这种情况下,我们无法进行学习。在开发模型之前,我们需要为情感提供标签,这里我们可以理解为情感提供标签而翻阅所有的数据是多么困难。为了减少给原始数据贴标签所花费的精力,主动学习就出现了。
什么是主动学习?
在一个积极的学习环境中,学习者试图在学习者被分配的意义创造领域中成为有经验的决策人。例如,在检查选择题时,验卷人给正确的答案打分,给错误的答案打负分或零分。因此,学习者将成为试卷检查员,他将努力成为一个专家,从分数的类别中给出分数。
在机器学习过程中,它是整个学习过程的一个子集,因为我们知道,当我们要分析没有标签的数据时,这种情况会发生很多次,在整个机器学习过程中,我们需要提供我们的数据点标签,这样我们就可以很容易地完成机器学习过程。而且,对于模型来说,提供良好的标签数据对于完成学习过程是非常有帮助的,但是在我们需要为数据提供水平的情况下,主动学习就会参与进来。
主动学习的概念是通过向机器学习算法提供少量的训练数据集,使其达到更高的准确性。同时,允许模型选择它们要学习的数据集。
为了给未标记的数据提供标签,我们通常需要一个人类数据注释者,这是一个强大的数据注释方式,但它是否高效。对于一个数据科学家来说,有几项任务,如分析数据、可视化数据、理解数据和寻找数据中的模式。这些任务不是很耗费时间吗?如果在这些任务中再加上一项为数据准确提供标签的任务,那么整个过程就会变得过于严苛、紧张和耗时。因此,数据科学家需要把更多的精力放在给数据贴标签的程序上。为了减少这些努力,主动学习会有所帮助。
主动学习在不同情况下有不同的作用。粗略的说,我们可以把主动学习分为三类。
- 基于流的选择性采样。
- 基于池的取样。
- 成员查询综合。
基于流的选择性取样
在这一类别中,我们试图做出一种算法,可以确定在模型训练时对特定的未标记的数据集进行标签查询的好处。该算法与模型一起工作,如果给测序数据贴上标签对训练有足够的好处,则为数据集提供标签。
基于池子的抽样
在这种类型的主动学习算法中,算法试图评估用于建模的数据样本,并在执行机器学习的建模部分之前,从数据源中标出最适合的数据样本。通常,算法从已经标记的数据集中学习,为未标记的数据提供标签,这些是最常用的主动学习算法。
会员查询综合
这些算法并非对所有情况都有用,因为我们试图生成综合数据。该算法被允许生成用于标记的数据。这在我们可以轻松生成数据实例的地方是有用的。
小文本是在不同种类的机器学习程序中应用主动学习的一种简单方法。接下来,在这篇文章中,我们将讨论主动学习的小文本。
小文本
正如文章的名字所示,文章更侧重于主动学习的小文本库,它为文本分类提供主动学习算法,并允许混合和匹配许多分类器和查询策略来构建主动学习应用程序。利用它的特点,我们可以轻松地使用sklearn库开发分类器,另外,我们还可以使用PyTorch分类器与转化器模型。
本文从小文开始,在sklearn提供的20个新闻组数据上实现一个二元分类模型。在开始模型之前,我们将知道如何在python中安装这个包。
pip install small-text
输出。
如果有人想继续使用PyTorch分类器和转化器,这是我们需要下载的一个额外要求。我们可以使用下面的命令来下载。
pip install small-text[transformers]
由于我使用的是google Colab,我需要克隆链接中提出的整个包。所以接下来,我将克隆这个包。
!git clone https://github.com/webis-de/small-text.git
输出。
克隆后,我们可以通过给出安装软件包的确切地址来安装该软件包。另外,在给出地址之前,你需要为Colab笔记本安装你的驱动器。
使用下面的命令,我们可以安装我们的驱动器。
from google.colab import drive
drive.mount('/content/drive')
挂载后,我们可以用下面的命令安装我们克隆的软件包。
pip install /content/small-text
输出。
重新启动运行时间后,我们可以使用整个软件包。
现在我们可以开始使用small-Text库包开发二进制分类器的程序。
导入所需的库。
import numpy as np
from small_text.active_learner import PoolBasedActiveLearner
from small_text.classifiers import ConfidenceEnhancedLinearSVC
from small_text.classifiers.factories import SklearnClassifierFactory
from small_text.query_strategies import PoolExhaustedException, EmptyPoolException
from small_text.query_strategies import RandomSampling
from small_text.data import SklearnDataSet
定义主动学习参数。
clf_template = ConfidenceEnhancedLinearSVC()
clf_factory = SklearnClassifierFactory(clf_template)
query_strategy = RandomSampling()
定义一个函数,使用sklearn加载数据。
from sklearn.datasets import fetch_20newsgroups
def get_twenty_newsgroups_corpus(categories=['rec.sport.baseball', 'rec.sport.hockey']):
train = fetch_20newsgroups(subset='train', remove=('headers', 'footers', 'quotes'),categories=categories)
test = fetch_20newsgroups(subset='test', remove=('headers', 'footers', 'quotes'),categories=categories)
return train, test
def get_train_test():
train, test = get_twenty_newsgroups_corpus()
return train, test
定义一个对数据进行预处理的函数。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import normalize
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import normalize
def preprocess_data(train, test):
vectorizer = TfidfVectorizer(stop_words='english')
x_train = normalize(vectorizer.fit_transform(train.data))
x_test = normalize(vectorizer.transform(test.data))
return SklearnDataSet(x_train, train.target), SklearnDataSet(x_test, test.target)
定义一个函数,使用sklearn的指标评估结果。
from sklearn.metrics import f1_score
def evaluate(active_learner, train, test):
y_pred = active_learner.classifier.predict(train)
y_pred_test = active_learner.classifier.predict(test)
print('Train accuracy: {:.2f}'.format(
f1_score(y_pred, train.y, average='micro')))
print('Test accuracy: {:.2f}'.format(f1_score(y_pred_test, test.y, average='micro')))
print('---')
将所有这些函数合并到主函数中。
def main():
# Active learning parameters
clf_template = ConfidenceEnhancedLinearSVC()
clf_factory = SklearnClassifierFactory(clf_template)
query_strategy = RandomSampling()
text_train, text_test = get_train_test()
train, test = preprocess_data(text_train, text_test)
active_learner = PoolBasedActiveLearner(clf_factory, query_strategy, train)
labeled_indices = initialize_active_learner(active_learner, train.y)
try:
perform_active_learning(active_learner, train, labeled_indices, test)
except PoolExhaustedException:
print('Error! Not enough samples left to handle the query.')
except EmptyPoolException:
print('Error! No more samples left. (Unlabeled pool is empty)')
定义一个函数来执行主动学习。
def perform_active_learning(active_learner, train, labeled_indices, test):
for i in range(15):
# ...where each iteration consists of labelling 20 samples
q_indices = active_learner.query(num_samples=20)
y = train.y[q_indices]
active_learner.update(y)
labeled_indices = np.concatenate([q_indices, labeled_indices])
print('Iteration #{:d} ({} samples)'.format(i, len(labeled_indices)))
evaluate(active_learner, train[labeled_indices], test)
这个循环将进行15次主动学习的迭代;在每次迭代中,将查询20个新闻样本,然后更新。更新步骤将向主动学习者揭示真正的标签。
定义一个函数来初始化主动学习器;这个函数是基于模型的查询策略所需要的。
def initialize_active_learner(active_learner, y_train):
indices_pos_label = np.where(y_train == 1)[0]
indices_neg_label = np.where(y_train == 0)[0]
([np.random.choice(indices_pos_label, 10, replace=False),
np.random.choice(indices_neg_label, 10, replace=False)])
x_indices_initial = x_indices_initial.astype(int)
y_initial = [y_train[i] for i in x_indices_initial]
active_learner.initialize_data(x_indices_initial, y_initial)
return x_indices_initial
运行主函数。
if __name__ == '__main__':
main()
输出。
在这里我们可以看到,模型的准确性有所提高。输出的大小很大,这就是为什么在图片中,整个输出没有放在文章中,但它开始时的训练准确率为1.00,测试准确率为0.76,样本量为40。
在这篇文章中,我们已经看到了什么是主动学习,以及我们如何用小文本轻松地执行它。这个库有很多特点,比如它提供了完整的功能,可以用转化器模型进行数据标记。此外,由于它完全是在Python包上开发的,所以只要有Python的基本知识就很容易理解。在研究的情况下,我们也可以使用强化学习来代替它。强化学习的灵感来自于行为心理学,其中主动学习更接近于监督学习。与强化学习相比,机器学习模型的开发在结果上更加严谨和准确。
参考文献
The postHands-On Guide to Small Text:一个用于主动学习的Python工具出现在印度分析杂志上。