热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

海量数据分类liblinear使用总结

liblinear使用总结liblinear是libsvm的线性核的改进版本,专门适用于百万数据量的分类。正好适用于我这次数据挖掘的实验。liblinear用法和li



liblinear使用总结

liblinear是libsvm的线性核的改进版本,专门适用于百万数据量的分类。正好适用于我这次数据挖掘的实验。

 

liblinear用法和libsvm很相似,我是用的是.exe文件,利用python的subprocess向控制台发送命令即可完成本次试验。

 

其中核心两句即

train train.txt

predict test.txt train.txt.model output.txt

 

由于是线性核,没有设置参数c、g

 

对于50W篇文章模型训练仅需340秒,50W篇文章的预测仅需6秒

 

1 from subprocess import *
2 import time
3
4 time = time.time
5
6 start_time = time()
7 print("训练")
8 cmd = "train train.txt"
9 Popen(cmd, shell = True, stdout = PIPE).communicate()
10 print("训练结束",str(time() - start_time))
11
12
13 start_time = time()
14 print("预测")
15 cmd = "predict test.txt train.txt.model output.txt"
16 Popen(cmd, shell = True).communicate()
17 print("预测结束",str(time() - start_time))
18
19
20 #进行统计
21 #读测试集真实label
22 start_time = time()
23 print("统计")
24 test_filename = "test.txt"
25 f = open(test_filename,"r",encoding = "utf-8")
26 real_class = []
27 for line in f:
28 real_class.append(line[0])
29
30 #总样本
31 total_sample = len(real_class)
32
33 #读预测结果label
34 predict_filename = "output.txt"
35 f_predict = open(predict_filename,"r",encoding = "utf-8")
36 s = f_predict.read()
37 predict_class = s.split()
38
39 #对预测正确的文章进行计数
40 T = 0
41 for real, predict in zip(real_class,predict_class):
42 if int(real) == int(predict):
43 T += 1
44 accuracy = T / total_sample * 100
45 print("正确率 为", str(accuracy) + "%")
46
47
48 # class_label = ["0","1","2","3","4","5","6","7","8","9"]
49 num_to_cate = {0:"it",1:"体育",2:"军事",3:"金融",4:"健康",5:"汽车",6:"房产",7:"文化",8:"教育",9:"娱乐"}
50
51 class_label = ["it","体育","军事","金融","健康","汽车","房产","文化","教育","娱乐"]
52
53 predict_precision = dict.fromkeys(class_label,1.0)
54 predict_true = dict.fromkeys(class_label,1.0)
55
56 predict_recall = dict.fromkeys(class_label,1.0)
57 predict_F = dict.fromkeys(class_label,0.0)
58 # print(str(predict_precision))
59 # print(str(predict_precision))
60 # print(str(predict_recall))
61 # print(str(predict_true))
62 mat = dict.fromkeys(class_label,{})
63 for k,v in mat.items():
64 mat[k] = dict.fromkeys(class_label,0)
65
66 # print(str(mat))
67
68 for real, predict in zip(real_class,predict_class):
69 real = int(real)
70 predict = int(predict)
71 # print(num_to_cate[real])
72 # print(num_to_cate[predict])
73 mat[num_to_cate[real]][num_to_cate[predict]] += 1
74 predict_precision[num_to_cate[predict]] += 1
75 predict_recall[num_to_cate[real]] += 1
76
77 if int(real) == int(predict):
78 predict_true[num_to_cate[predict]] += 1
79
80 # print(str(predict_precision))
81 # print(str(predict_recall))
82 # print(str(predict_true))
83
84 #输出混淆矩阵
85 for k, v in mat.items():
86 print(k + ":" + str(v))
87
88 #计算精确率和召回率
89 for x in range(len(class_label)):
90 # x = str(x)
91 predict_precision[num_to_cate[x]] = predict_true[num_to_cate[x]] / predict_precision[num_to_cate[x]]
92 predict_recall[num_to_cate[x]] = predict_true[num_to_cate[x]] / predict_recall[num_to_cate[x]]
93
94 # print(str(predict_precision))
95 # print(str(predict_recall))
96 # print(str(predict_true))
97
98 #计算F测度
99 for x in range(len(class_label)):
100 # x = str(x)
101 predict_F[num_to_cate[x]] = 2 * predict_recall[num_to_cate[x]] * predict_precision[num_to_cate[x]] / (predict_precision[num_to_cate[x]] + predict_recall[num_to_cate[x]])
102
103 print("统计结束",str(time() - start_time))
104 print("精确率为",str(predict_precision))
105 print("召回率为",str(predict_recall))
106 print("F测度为",str(predict_F))
107
108 print("保存结果")
109 final_result_filename = "./finalresult.txt"
110 f = open(final_result_filename,"w",encoding = "utf-8")
111 for k, v in mat.items():
112 f.write(k + ":" + str(v) + "\n")
113
114 f.write("\n")
115 f.write("正确率为" + str(accuracy) + "%" + "\n\n")
116 f.write("精确率为" + str(predict_precision) + "\n\n")
117 f.write("召回率为" + str(predict_recall) + "\n\n")
118 f.write("F测度为" + str(predict_F) + "\n\n")
119 print("保存结果结束")
120
121
122 # cate_to_num = {"it":0,"体育":1,"军事":2,"华人":3,"国内":4,"国际":5,"房产":6,"文娱":7,"社会":8,"财经":9}
123 # num_to_cate = {0:"it",1:"体育",2:"军事",3:"华人",4:"国内",5:"国际",6:"房产",7:"文娱",8:"社会",9:"财经"}


原文:https://www.cnblogs.com/anqiang1995/p/7955672.html


liblinear是一个适用于大规模数据集的线性分类器,可处理多分类问题。

参考:使用教程英文版:点击打开链接

          使用案例(代码):点击打开链接

          libsvm使用:点击打开链接

介绍:

        关于参数以及什么时候该使用:点击打开链接

        github地址:点击打开链接

        readme翻译:点击打开链接

 建议的训练步骤(来源于libSVM,感觉对这个也有帮助,所以也标记在这):

1)将我们的训练数据和测试数据转换为该SVM软件包支持的格式;

2)对数据进行简单的尺度化scale;

3)先考虑用RBF核;

4)使用交叉检验方法去寻找最优的参数C和γ;

5)使用找到的最好的参数C和γ来训练整个训练集;

6)在测试集上测试。



需要注意的是,一定要先把数据处理成要求的格式,即如下这种格式:

标签 1:特征1值 2:特征2值

一个简单的例子:

1 from liblinearutil import *

2 读取数据

  y,x  =  svm_read_problem('data_path')

3 训练

  m = train(y,x,'option')#option为设置 比如: -s 2 -c 5 -q

3 也可以做交叉验证

  CV_ACC = train(y, x, '-v 3')
  # -v 3 是指进行3-fold的交叉验证
  # 返回的是交叉验证的准确率

4 预测并输出准确率

  frbs, p_acc, p_vals = predict(y, x, m, '-b 0')

其中:

# y是testing data的真实标签,用于计算准确率
# x是待预测样本
# p_labs: 预测出来的标签
# p_acc: tuple类型,包括准确率,MSE,Squared correlation coefficient(平方相关系数)
# p_vals: list, 直接由模型计算出来的值,没有转化成1,0的值,也可以看做是概率估计值



备注:

在结果中,#iter表示迭代次数,Objective value 为SVM文件转换为的二次规划求解得到的最小值,nSV 为标准支持向量个数(0






推荐阅读
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • python中安装并使用redis相关的知识
    本文介绍了在python中安装并使用redis的相关知识,包括redis的数据缓存系统和支持的数据类型,以及在pycharm中安装redis模块和常用的字符串操作。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 解决python matplotlib画水平直线的问题
    本文介绍了在使用python的matplotlib库画水平直线时可能遇到的问题,并提供了解决方法。通过导入numpy和matplotlib.pyplot模块,设置绘图对象的宽度和高度,以及使用plot函数绘制水平直线,可以解决该问题。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 本文介绍了使用Python解析C语言结构体的方法,包括定义基本类型和结构体类型的字典,并提供了一个示例代码,展示了如何解析C语言结构体。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
author-avatar
dcwzyb_271
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有