目录
- 0、推荐
- 1、背景
- 2、效果图
- 3、本次实验整体流程
- 4、源代码
- 6、知识点普及
- 6.1 朴素贝叶斯优点
- 6.2 朴素贝叶斯缺点
0、推荐
无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。
1、背景
最近的项目中,用到了很多机器学习的算法,每个机器学习的算法在不同的样本下的精准率是不同的。为了验证每个算法在每种不同样本数量的能力,就做了一下实验,本文讲的是“朴素贝叶斯”在文本算法中的精准率。
相关其它机器学习算法的精准率:
决策树:机器学习 之 决策树(Decision Tree)文本算法的精确率 逻辑回归:机器学习 之 逻辑回归(LogisticRegression)文本算法的精确率
支持向量机:机器学习 之 支持向量机(SupportVectorMachine)文本算法的精确率
K近邻:机器学习 之 K近邻(K-NearestNeighbor)文本算法的精确率
随机森林:机器学习 之 随机森林(Random Forest)文本算法的精确率
机器学习各个算法对比:人工智能 之 机器学习常用算法总结 及 各个常用分类算法精确率对比
2、效果图
先看一下没有任何调参的情况下的效果吧!
clf = BernoulliNB():
clf = MultinomialNB(alpha=0.01):
3、本次实验整体流程
1、先把整体样本读到内存中
2、把整体样本按照8:2的比例,分为80%的训练集,20%的测试集
3、然后“训练集”的样本 先分词,再转换为词向量
4、接着把训练集的样本和标签统一的传入算法中,得到拟合后的模型
5、把“测试集”的样本 先分词,再得到词向量
6、把测试集得出的词向量丢到拟合后的模型中,看得出的结果
7、把结果转换为准确率的形式,最后做成表格形式以便观看
这里应该多跑几遍不同样本,然后把结果取平均值,每次的结果还是稍有不同的。
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 sklearn.metrics import accuracy_score
# 朴素贝叶斯
from sklearn.naive_bayes import BernoulliNB
m_count = [1000,3000,5000,8000,10000,15000,20000]
# all
m_list_allText = []
m_list_allL4ID = []
# 内容的训练集、测试集
m_text_test = []
m_text_train = []
m_label_test = []
m_label_train = []
m_map_all = []
# 读取文件里面数据,获取标签和内容
def getFile(filename, count):
with open(filename, 'r' ,encoding='utf-8') as fp:
global m_list_allL4ID,m_list_allText
m_list_allL4ID = []
m_list_allText = []
for i in range(count):
text = fp.readline()
if ":" in text:
L4ID = text.split(":")[-2]
Msg = text.split(":")[-1]
m_list_allL4ID.append(L4ID)
m_list_allText.append(Msg)
# 随机分为 测试集 和 训练集 2-8分
def randomTestAndTrain():
# 生成训练集和测试集
global m_text_test, m_text_train, m_label_test, m_label_train
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=1)
def jiabaToVector(list, isTest, isTFIDF = False):
tmp_list = []
for sentence in list:
tmp_list.append(" ".join(jieba.cut(sentence.strip())))
# 利用TFIDF生成词向量
transformer = TfidfTransformer()
if isTest:
if isTFIDF:
tfidf = transformer.fit_transform(vectorizer.transform(tmp_list))
else:
tfidf = vectorizer.transform(tmp_list)
else:
if isTFIDF:
tfidf = transformer.fit_transform(vectorizer.fit_transform(tmp_list))
else:
tfidf = vectorizer.fit_transform(tmp_list)
return tfidf
# 创建默认的参数
def predict_4(X, Y):
# clf = BernoulliNB()
clf = MultinomialNB(alpha=0.01)
clf = clf.fit(X, Y)
return clf
def test(count):
# getFile("./rg_test.train", count)
getFile("./rg_train_20190102_20181227114134.train", count)
# print("获取全部已知数据的label和text")
# 随机分为 测试集 和 训练集 2-8分
randomTestAndTrain()
global vectorizer
# 全局向量
vectorizer = CountVectorizer()
# 生成训练向量
vector_train = jiabaToVector(m_text_train, False, False)
# 数据大小
lenall = len(m_list_allText)
# print("总集大小:", lenall)
print("总集大小:", lenall)
# 训练
startT_Train = datetime.datetime.now()
clf = predict_4(vector_train, m_label_train)
endT_Train = datetime.datetime.now()
print("训练Time:", (endT_Train - startT_Train).microseconds)
# 生成测试向量
vector_test = jiabaToVector(m_text_test, True, False)
# 测试
startT = datetime.datetime.now()
result = clf.predict(vector_test)
endT = datetime.datetime.now()
print("测试Time:", (endT - startT).microseconds)
# 计算百分比
percent = accuracy_score(result, m_label_test)
print("准确率:", round(percent, 3))
map_all = {}
map_all["精确率"]=round(percent, 3)
map_all["数据量"]=lenall
map_all["训练时间/us"]=(endT_Train - startT_Train).microseconds
map_all["测试时间/us"]=(endT - startT).microseconds
m_map_all.append(map_all)
if __name__ =="__main__":
print ("-- 开始 --")
for testC in m_count:
test(testC)
print ("-- 结束 --")
# 打印表格
print("数据量\t准确度\t训练时间/us\t测试时间/us")
for key in m_map_all:
print("%d\t%f\t%d\t%d"%(key["数据量"],key["精确率"],key["训练时间/us"],key["测试时间/us"]))
6、知识点普及
6.1 朴素贝叶斯优点
对小规模的数据表现很好,适合多分类任务,适合增量式训练,朴素贝叶斯法高效且易于实现。
6.2 朴素贝叶斯缺点
对输入数据的表达形式很敏感,分类的性能不一定很高。