极限多标签学习之-FastXML运行和评价EUR-Lex4k数据集

FastXML运行和评价EUR-Lex4k数据集

今天折腾了一天算是将FastXML跑通了。不过在评价阶段,我使用了pyxclib而不是FastXML作者提供的matlab评价过程。

运行和评价过程
  1. 下载FastXML代码(也包含PfastreXML,Parabel, SwiftXML这三个模型的代码)

  2. 打开FastXML文件夹,根据sample_run.bat的内容运行train和predict过程。

train完成之后,会在Sandbox/Results/model文件夹下生成50个.tree文件,对应Bagging的50颗树模型。

predict完成之后,会在Sandbox/Results/文件夹下生成一个score_mat.txt文件,其中第i行存储了第i个测试样本在每一个标签上的得分,标签下标升序排列,有一些标签的评分是没有的,也就是得分为0.
接下来就要根据score_mat.txt计算评价指标。
作者提供的方法是Matlab代码(用这种方法应该要简单一些,不过我电脑上没有安装matlab)。下面介绍如何用pyxclib评价。

  1. 安装xclib

将评价的代码改为:

from xclib.data import data_utils
import xclib.evaluation.xc_metrics as xc_metrics

# Read ground truth and predictions
true_labels = data_utils.read_sparse_file('Sandbox/Data/EUR-Lex/tst_X_Y.txt')
predicted_labels = data_utils.read_sparse_file('Sandbox/Results/EUR-Lex/score_mat.txt')

# evaluate (See examples/evaluate.py for more details)
acc = xc_metrics.Metrics(true_labels=true_labels)
args = acc.eval(predicted_labels, 5)
print(xc_metrics.format(*args))

运行该代码遇到两个问题:

  1. io.h not found. 环境问题,需要安装MSVC14.0及以上版本的编译器,然后设置环境变量。参考:https://stackoverflow.com/questions/40018405/cannot-open-include-file-io-h-no-such-file-or-directory
  2. 运行错误:xclib.utils.sparse._read_file_safe函数出错(sparse.py的line257):
indices = np.frombuffer(ind, np.int64)
indptr = np.frombuffer(indptr, dtype=np.int64)   # never empty

出错原因是由于ind和indptr这两个变量在_sparse.pyx文件里面的定义是

indices = array.array("l")
indptr = array.array("l", [0])

参考python官方文档可知typcode=l意味着数组中的数据是signed long,其中每个值占用4个字节。但xclib的作者将其看成是8个字节,所以利用frombuffer(., np.int64)进行读取(是平台问题,开发者也认为这是一个wired issue)。
修改:

indices = np.frombuffer(ind, np.int32).astype(np.int64)
indptr = np.frombuffer(indptr, np.int32).astype(np.int64)

然后重新安装xclib,运行评价代码得到结果:

70.70,64.81,59.28,54.16,49.50
70.70,66.15,62.26,59.12,57.23

其中第一行是 P @ 1 % , … , P @ 5 % P@1\%,\dots,P@5\% P@1%,,P@5%,第二行是 n D C G @ 1 % , … , n D C G @ 5 % nDCG@1\%,\dots,nDCG@5\% nDCG@1%,,nDCG@5%

数据格式说明

FastXML的作者提供了EUR-Lex4k数据,根据该数据我们看一下输入数据的格式。
该数据位于Sandbox/Data/EUR-Lex文件夹下,
其中:
eurlex_test.txteurlex_train.txt的数据格式如下

样本数量 特征维度 标签数量
l1 l2 ... li a1:b1 a2:b2 ... aj:bj
...

其中l1-li[0, 标签数量]的整数,表示已标注标签。
a1:b1-aj:bj为稀疏表示的特征向量,ak[0,特征维度]的整数,对应第ak个特征,bk表示在ak特征上的值,bk是一个实数。
trn_X_Xf.txttst_X_Xf.txt分别为训练样本集和测试样本集(无标签)。
trn_X_Y.txttst_X_Y.txt分别为训练标签集和测试标签集(稀疏表示)。
Y_Yf.txt似乎是每个标签的500维word2vec,其中有一些空白行。
inv_prop.txt是每个标签的propensity的倒数。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
FastXML发布1.11版 增加选择功能,修正1.1版一个无意义Property! ''' <summary> ''' 按元素名称选择元素 ''' </summary> ''' <param name="Key">关键词</param> ''' <param name="Method">选择方式</param> ReadOnly Property SelectElement(ByVal Key As String, ByVal Method As FastXML.Method) As XMLNodeList ''' <summary> ''' 按元素包含元素的值选择元素 ''' </summary> ''' <param name="Name">元素名称</param> ''' <param name="Values">元素值</param> ReadOnly Property SelectElementInElement(ByVal Name As String, ByVal Values As String) As XMLNodeList <summary> 按元素包含标记选择元素 </summary> <param name="Key">关键词</param> <param name="Method">选择方式</param> ReadOnly Property SelectElementInMark(ByVal Key As String, ByVal Method As FastXML.Method) As XMLNodeList <summary> 按元素包含标记值选择元素 </summary> <param name="Name">标记名称</param> <param name="Values">标记值</param> ReadOnly Property SelectElementInMark(ByVal Name As String, ByVal Values As String) As XMLNodeList 根据这些功能,有选择的选出元素,得到XMLNodeList类 这个类还可以再筛选元素! <summary> 筛选元素 </summary> <param name="Key">关键词</param> <param name="Method">选择方式</param> ReadOnly Property SelectElement(ByVal Key As String, ByVal Method As FastXML.Method) As XMLNodeList 筛选后又得出XMLNodeList ================================================================== 希望各位新手喜欢
FastXml是一个简单、高性能、极少内存消耗的基于xml pull机制的java xml解析器。性能最好的xml解析器:性能是VTD-XMl的3倍,是XPP3/MXP1的2倍,详见性能测试数据和测试代码 几乎不消耗额外的内存:内存消耗比XPP3/MXP1还要少很多 没有jar包依赖 jar包大小为18k,非常适合在移动互联网领域使用 FastXml的API与XMLPULL类似,但是要更简单一些,易于使用 支持namespace,但不校验schema 为什么FastXml这么快尽可能少的解码字节:往往xml文档中的很多字节都是ASCII范围,它们可以直接强转成char,而不需要解码,比如:标签名、属性名,大部分时候只需要对属性值和文本块进行解码即可。 注释、文档声明、DOCTYPE、无用的换行和空白通常不是我们关注的内容,所以这些内容自动被FastXml跳过了,使用API时更人性化。 当需要把某个属性值或者文本块内容转换为int、short、long时,不需要先把byte数组转化成string,然后再转化成int、short、long。FastXml直接把byte数组转换成对应的类型。 如果xml文档中有些标签内容你并不需要时,你可以跳过这些标签,你跳过的这部分将减少了字节解码,这在一些场景下能很好的帮助你提升性能。 FastXml类似XMLPULL一样,不校验文档schema和DTD,对文档的格式也不进行非常严格的校验:通常xml文档的格式都是正确的,当我们追求xml解析的最高性能时,就不需要对格式等内容进行及其严格的校验了。FastXml并不是完全没有校验,为了追求更好的性能,FastXml只是在解析过程中,对那些必须校验的地方进行校验。通常大部分的格式错误都能被校验出来。许可证Apache Licence, Version 2.0 标签FastXml

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值