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