原创

机器学习 之 Liblinear中的支持向量机(SupportVectorMachine)文本算法的精确率

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://shazhenyu.blog.csdn.net/article/details/87884298

0、推荐

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。

1、简介

最近的项目中,用到了很多机器学习的算法,每个机器学习的算法在不同的样本下的精准率是不同的。为了验证每个算法在每种不同样本数量的能力,就做了一下实验,本文讲的是“支持向量机”在运用Liblinear库时,在文本算法中的精准率。

相关其它机器学习算法的精准率:
决策树:机器学习 之 决策树(Decision Tree)文本算法的精确率
逻辑回归:机器学习 之 逻辑回归(LogisticRegression)文本算法的精确率
K近邻:机器学习 之 K近邻(K-NearestNeighbor)文本算法的精确率
朴素贝叶斯:机器学习 之 朴素贝叶斯(Naive Bayesian Model)文本算法的精确率
随机森林:机器学习 之 随机森林(Random Forest)文本算法的精确率

机器学习各个算法对比:人工智能 之 机器学习常用算法总结 及 各个常用分类算法精确率对比

2、Liblinear中的效果和Sklearn中的效果对比

liblinear中的支持向量机(SVM)算法:
在这里插入图片描述
不加入任何参数的sklearn中的支持向量机(SVM)算法:
在这里插入图片描述
可以明显看出,在数据量大的时候,和不加入任何参数的sklearn中的svm算法比,liblinear还是有优势的。和升级版的sklearn算法的准确率是相类似的。其实仔细分析代码和流程会分析出真正的原因,后续我会一步一步的分析原因。

首先,sklearn的算法的精确率可以直接看我的这篇文章:机器学习 之 支持向量机(SupportVectorMachine)文本算法的精确率
看过sklearn的算法后,我发现,在数据量20000左右时,精确率降低到了80%左右。有没有办法有所提升呢,于是做了liblinear。

liblinear的具体使用方法可以参考我的这篇文章:机器学习 之 liblinear的帮助文档翻译
我是直接翻译的官方文档,如果读者英文好的话,还是建议看英文的,因为有的地方,我可能翻译的不准确。

3、Liblinear实验整体流程

1、先把整体样本的文件转换成liblinear可读形式的文件

2、运用svm_read_problem方法把liblinear可读形式的文件转换成词向量

3、把整体向量按照8:2的比例,分为80%的训练集,20%的测试集

4、接着把训练集的向量和标签统一的传入Liblinear算法的train函数中,得到拟合后的模型

5、然后,通过predict函数把测试向量、标签和模型丢进去

6、最后通过evaluations把结果输出

7、最后做成表格形式以便观看

8、循环多次,求平均值

4、核心源码

import jieba
import datetime
# 向量\测试集\训练集\得分比对
from sklearn.model_selection  import train_test_split
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer

from converter import AnneTextConverter
# 支持向量机
from liblinearutil import *

# 忽略警告
import warnings
warnings.filterwarnings("ignore", category=FutureWarning, module="sklearn", lineno=196)

# all
m_list_allText = []
m_list_allL4ID = []
# 内容的训练集、测试集
m_text_test = []
m_text_train = []
m_label_test = []
m_label_train = []

m_list_all = []
m_map_all = {}
m_test_map = {}

numCount = "21282"
# 测试
def test(count):
    # 生成字典
    anne = AnneTextConverter()

    anne.convert_text(text_src="rg_train_20190102_20181227114134.train",  delimiter=":", output="rg_train_20190102_20181227114134.svm",labelLevel="L4")
    m_list_allL4ID, m_list_allText = svm_read_problem("rg_train_20190102_20181227114134.svm")
    # 随机分为 测试集 和 训练集 2-8分
    m_text_train, m_text_test, m_label_train, m_label_test = train_test_split(m_list_allText, m_list_allL4ID, test_size=0.2, random_state=0)

    # 数据大小
    print("总集大小:", count)

    # 训练
    startT_Train = datetime.datetime.now()

    # -q : 安静模式(无输出信息)
    # print("m_label_train",m_label_train)
    # print("m_text_train",m_text_train)
    model = train(m_label_train, m_text_train, "-s 4 -q")

    save_model("liblinear.svm",model)
    endT_Train = datetime.datetime.now()
    print("训练时间Time:%ds"%(endT_Train - startT_Train).seconds)

    # 测试
    startT = datetime.datetime.now()
    pLabel,pAcc,pVal = predict(m_label_test, m_text_test, model)
    endT = datetime.datetime.now()
    print("测试Time:", (endT - startT).microseconds)

    ACC,MSE,SCC = evaluations(m_label_test,pLabel)

    # 计算百分比
    print("准确率:", round(ACC, 3))

    global m_map_all
    m_map_all["精确率"]=round(ACC, 3)
    m_map_all["数据量"]=count
    m_map_all["训练时间/s"]=(endT_Train - startT_Train).seconds
    m_map_all["测试时间/us"]=(endT - startT).microseconds
    print("m_map_all:",m_map_all)

def runOnce(i):
    global m_map_all
    print ("-- 开始 --")
    test(numCount)
    print ("-- 结束 --")

    # 打印表格
    print("数据量\t准确度\t训练时间/s\t测试时间/us")
    print("%s\t%f\t%d\t%d"%(m_map_all["数据量"],m_map_all["精确率"],m_map_all["训练时间/s"],m_map_all["测试时间/us"]))
    m_test_map[i] = m_map_all
    m_map_all = {}

if __name__ =="__main__":
    # 跑n次
    runCount = 3
    for i in range(runCount):
        runOnce(i)

    # 打印n次的结果
    for i in range(runCount):
        tmp = m_test_map[i]
        # 打印表格
        print("数据量\t准确度\t训练时间/s\t测试时间/us [第%d次]"%(i+1))
        print("%s\t%f\t%d\t%d"%(tmp["数据量"],tmp["精确率"],tmp["训练时间/s"],tmp["测试时间/us"]))

    # n次平均值
    print("数据量\t准确度\t训练时间/s\t测试时间/us [%d次平均值]"%(runCount))
    tmpMap = m_test_map[0]
    # tmpList = tmpMap[0][0]
    tmpCount = tmpMap["数据量"]
    tmpScore = 0
    tmpTrainTime = 0
    tmpTestTime = 0
    for i in range(runCount):
        tmpScore += m_test_map[i]["精确率"]
        tmpTrainTime += m_test_map[i]["训练时间/s"]
        tmpTestTime += m_test_map[i]["测试时间/us"]
    print("%s\t%f\t%d\t%d"%(tmpMap["数据量"],tmpScore/runCount,tmpTrainTime/runCount,tmpTestTime/runCount))

5、其它相关文章

支持向量机(sklearn):机器学习 之 支持向量机(SupportVectorMachine)文本算法的精确率
决策树:机器学习 之 决策树(Decision Tree)文本算法的精确率
逻辑回归:机器学习 之 逻辑回归(LogisticRegression)文本算法的精确率
K近邻:机器学习 之 K近邻(K-NearestNeighbor)文本算法的精确率
朴素贝叶斯:机器学习 之 朴素贝叶斯(Naive Bayesian Model)文本算法的精确率
随机森林:机器学习 之 随机森林(Random Forest)文本算法的精确率
升级版支持向量机(sklearn):机器学习 之 支持向量机(SupportVectorMachine)文本算法的精确率——升级版sklearn

文章最后发布于: 2019-02-22 19:18:52
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览