主动学习 active learning(简单例子)

来源:互联网 发布:大数据分析平台有哪些 编辑:程序博客网 时间:2024/06/03 22:40

1. 主动学习也叫做询问学习或最佳实验设计,它是机器学的分支,更人工智能。主要的假设是是否学习算法是可以去选择先要学习的数据。主动学习系统试图跨越标签瓶颈,没有标签的例子去被人类注释者来标签。主动学习目的是提高准确率,通过尽量少的标签,因此减少获得标签数据的费用。
2. pool-based 过程:学习者先从少量训练集里标签的例子开始,从精心挑选的例子里获得标签进行学习,然后扩展新知识去选择下个询问例子。一旦一个询问已经完成,通常没有另外的假设在这个部分的学习算法。新标签的例子只是被加到已标签的数据集里,学习者就是从这开始标准的监督方式。但也有例外,或主动学习与半监督学习相结合。

3. 例子:20个新闻组(文档分类)包括2000个usenet 文档平均分成2类

学习者必须区分棒球和曲棍球文档从20个新闻组里。主动学习算法经常用学习曲线评估,它画出准确率的评估标准作为被标签新的例子询问加到原来的数据集中。这篇报告的结果是逻辑回归模型10 folders使用交叉验证平均后的结果。在标签30个新例子之后,不确定样本(uncertainty sampling)的准确率诗81%,然而随机只有73%。

4. 情况

1) membership query synthesis

2) stream-based selective sampling

3) pool-based sampling 

5. 方法:uncertainty sampling

这个框架下,一个主动学习者询问例子关于哪个是最不确定的和怎么去标签。这个方法经常是为了概率学习模型。如何数据有多与三个类标签,一个更平常的不确定样本的变量可能询问那些概率是最低的例子。最常见得不确定样本策略是使用

1. 导入20 新闻组数据集

为了更快操作,我们只对4个分类进行研究

>>> categories = ['alt.atheism', 'soc.religion.christian',...               'comp.graphics', 'sci.med']
我们导入文件的列表去匹配这些分类(随机打乱)

>>> from sklearn.datasets import fetch_20newsgroups>>> twenty_train = fetch_20newsgroups(subset='train',...     categories=categories, shuffle=True, random_state=42)
target_names是

>>> twenty_train.target_names['alt.atheism', 'comp.graphics', 'sci.med', 'soc.religion.christian']
这些文件是在data里

>>> len(twenty_train.data)2257>>> len(twenty_train.filenames)2257
主动学习算法需要一个类标签给每一个文档在训练集中。这样,类就是新闻组的名字,也是每一个文件的文档名

为了加速,scikit-learn导入目标属性作为integers的数列,它们与类名的索引一致,储存在target—names列表里。类的id储存在target里。

>>> twenty_train.target[:10]array([1, 1, 3, 3, 3, 3, 3, 2, 2, 2])
2. 从文本文件中提取特征

为了运用机器学习,首先将文档内容转换成数值特征向量。

bags of words

1)给每个出现在训练集的文档中每个字一个固定的id

2)对于每个文档(i),查每个单词出现的次数然后将他们储存在X【i,j】,这里j为每个字的索引

bags of words 表示n_features 是库里明显字的数量,这个数量通常大于100,000。

Tokenizing text 

文本预处理,标记和过滤--停止字是被包含在一个高层次的部分里---能够建立一个特征的字典然后将文档转换成特征向量

>>> from sklearn.feature_extraction.text import CountVectorizer>>> count_vect = CountVectorizer()>>> X_train_counts = count_vect.fit_transform(twenty_train.data)>>> X_train_counts.shape(2257, 35788)
CountVectorizer 支持N-grams的字或间接字符的总数。一旦合适,矢量器就建了一个特征索引词典

>>> count_vect.vocabulary_.get(u'algorithm')4690
每一个字的索引值与它在整个训练库的概率相对应。

From occurences to frequencies

出现总数问题:长一点的文档将获得高的平均数值比短一点的文档。为了避免这些潜在的矛盾,它将每个字在一个文档的出现总数除以文档的字的总数。这些新的特征叫做tf(Term frequencies).另一个对tf上面的提炼是去缩减字的重量(这些字是出现在库中多篇文档,所以有很好的信息量比那些只出现在库中少部分)。这个缩减方法叫tf-idf(terms frequency times inverse document frequency)

>>> from sklearn.feature_extraction.text import TfidfTransformer>>> tf_transformer = TfidfTransformer(use_idf=False).fit(X_train_counts)>>> X_train_tf = tf_transformer.transform(X_train_counts)>>> X_train_tf.shape(2257, 35788)

上面例子中,fit()方法是我们的估量器适应我们的数据,然后tranform()去转换count-matrix to a tf-idf。所以合成:

>>> tfidf_transformer = TfidfTransformer()>>> X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)>>> X_train_tfidf.shape(2257, 35788)


原创粉丝点击