nltk-贝叶斯分类器
本人小白一枚,专业统计,之前做过质量工程,现转行将近一年,开始记录我的学习过程及踩过的坑。
第一篇:用贝叶斯分类器(本文使用NLTK中的NaiveBayesClassifier)将5000多个样本进行分类,判断是否属于脑科学,样本存储为excel格式,选取特征值分类号前四位及摘要(先结巴分词)按频率计数。
首先要搞清楚做这个分类模型的思路:
读取文本—清洗文本—获取特征词列表—定义特征提取器—构造特征集—朴素贝叶斯分类器—评价结果
在做这个分类器之前我对贝叶斯分类器不太了解,所以遇到很多问题,最重要的问题就是分类器的传入参数,因为他有固定的参数形式,否则就会报错,参数形式如下:
[
({"特征1":value1,"特征2":value2..."特征n":valuen},label),
({"特征1":value1,"特征2":特征2..."特征n":valuen},label),
...
]
这是一个三层复合结构,首先它是一个list,第二层是一个元组,最里面是一个字典
把这个问题搞清楚了其他问题就好办了。
1. 读取数据
path=os.getcwd()+'\\data_checked.xlsx'
df_data = pd.read_excel(path)
dataSetNP = np.array(df_data)
NP_row=len(dataSetNP)
在这里我使用的是pandas 和numpy将数据化为多维数组进行读取,
每一行用dataSetNP[i],每一列用dataSetNP[:][j]
2.取特征值
取ipc前四位不重复
Content_IPC_Num =set([j[:4] for j in [w for w in dataSetNP[:,1]]])
摘要分词,原来用停词表做的代码比较冗余
# 获取高频词列表--特征1
def abstract_fre_list(abst):
content_abst_allwords=[x.word for x in psg.cut(abst) if not re.findall(r'm|mq|q|qv|qt', x.flag)]
with open("stopwords.txt", encoding='utf-8') as f:
stopwords = f.read()
content_abst_cleanwords=[w for w in content_abst_allwords if w not in stopwords]
content_abst_freword=nltk.FreqDist(content_abst_cleanwords)
content_abst_freword = content_abst_freword.most_common(2000)
feature_abst_list=[w[0] for w in content_abst_freword]
return feature_abst_list Content_abst_words=abstract_fre_list(get_data(3))#高频词列表
可以改进一下变成如下形式:
with open("stopwords.txt", encoding='utf-8') as f:
stopwords = f.read()
sbste=str([j for j in dataSetNP[: ,3]])
allwords_stop=[x.word for x in psg.cut(sbste) if not re.findall(r'm|mq|q|qv|qt', x.flag)]
word_all=nltk.FreqDist(reduce(lambda x,y:x+y,allwords_stop))
Content_abst_words2=[i[0] for i in word_all.most_common(2000)if i[0] not in stopwords]
3.构造特征提取器
def gender_features(IPC,abstract):
features={}
for IPC_num in range(len(Content_IPC_Num)):
features["IPC_has({})".format(Content_IPC_Num[IPC_num])]=(Content_IPC_Num[IPC_num] in IPC)
for abstract_num in range(len(Content_abst_words)):
features["abstract_has({})".format(Content_abst_words[abstract_num])]=(Content_abst_words[abstract_num] in abstract)
return features
4.构造特征集
# 构造特征集
size = int(NP_row * 0.1)
features_apply= []
for i,apply_class in enumerate(list(dataSetNP[:, 8])):
features_apply.append((gender_features(dataSetNP[:, 1][i] ,dataSetNP[:, 3][i]), apply_class))
random.shuffle(features_apply)
test_set_apply,train_set_apply = features_apply[:size], features_apply[size:] features_tech = []
for w,tech_class in enumerate(list(dataSetNP[:, 9])):
features_tech.append((gender_features(dataSetNP[:, 1][w], dataSetNP[:, 3][w]), tech_class))
random.shuffle(features_tech)
test_set_tech,train_set_tech = features_tech[:size],features_tech[size:]
5.贝叶斯分类器
classifier_apply = nltk.NaiveBayesClassifier.train(train_set_apply)
classifier_tech = nltk.NaiveBayesClassifier.train(train_set_tech)
6.评价
#精确度-召回率-分类准确率分数
predict_test_apply=[]#预测值
predict_test_tech=[]
for i in range(size):
predict_apply=classifier_apply.classify(gender_features(dataSetNP[:,1][i],dataSetNP[:,3][i]))
predict_tech = classifier_tech.classify(gender_features(dataSetNP[:,1][i],dataSetNP[:,3][i]))
predict_test_apply.append(predict_apply)
predict_test_tech.append(predict_tech)
actual_test_apply=list(dataSetNP[:,8][:size])#真实值
actual_test_tech=list(dataSetNP[:,9][:size])
'''或者预测值+真实值
predict_test_apply2 = [classifier_apply[app[0]] for app in test_set_apply]
predict_test_tech2 = [classifier_tech[tech[0]] for tech in test_set_tech]
actual_test_apply2 = [i[1] for i in test_set_apply]
actual_test_tech2 = [i[1] for i in test_set_tech]'''
def evaluate(Y_actual,Y_pre):
brain_sci_precison = metrics.precision_score(Y_actual, Y_pre, average='macro')
brain_sci_recall = metrics.recall_score(Y_actual, Y_pre, average='macro')
brain_sci_accuracy = metrics.accuracy_score(Y_actual, Y_pre, normalize=True)
return brain_sci_precison, brain_sci_recall,brain_sci_accuracy
evaluate_apply=evaluate(actual_test_apply,predict_test_apply)
evaluate_tech = evaluate(actual_test_tech,predict_test_tech)
print("应用-精确度、召回率、分类准确率分数分别为 {}".format(evaluate_apply))
print("技术-精确度、召回率、分类准确率分数分别为 {}".format(evaluate_tech)) 结果:
nltk-贝叶斯分类器的更多相关文章
- 【原创】.NET平台机器学习组件-Infer.NET连载(二)贝叶斯分类器
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 微软Infer.NET机器学习组件文章目录:http:/ ...
- Naive Bayes Classifier 朴素贝叶斯分类器
贝叶斯分类器的分类 根据实际处理的数据类型, 可以分为离散型贝叶斯分类器和连续型贝叶斯分类器, 这两种类型的分类器, 使用的计算方式是不一样的. 贝叶斯公式 首先看一下贝叶斯公式 $ P\left ( ...
- 吴裕雄 python 机器学习——高斯贝叶斯分类器GaussianNB
import matplotlib.pyplot as plt from sklearn import datasets,naive_bayes from sklearn.model_selectio ...
- SIGAI机器学习第五集 贝叶斯分类器
讲授贝叶斯公式.朴素贝叶斯分类器.正态贝叶斯分类器的原理.实现以及实际应用 大纲: 贝叶斯公式(直接用贝叶斯公式完成分类,计算一个样本的特征向量X属于每个类c的概率,这个计算是通过贝叶斯公式来完成的. ...
- 吴裕雄 python 机器学习——多项式贝叶斯分类器MultinomialNB模型
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,naive_bayes from skl ...
- machine learning for hacker记录(3) 贝叶斯分类器
本章主要介绍了分类算法里面的一种最基本的分类器:朴素贝叶斯算法(NB),算法性能正如英文缩写的一样,很NB,尤其在垃圾邮件检测领域,关于贝叶斯的网上资料也很多,这里推荐那篇刘未鹏写的http://mi ...
- 贝叶斯分类器,随机森林,梯度下载森林,神经网络相关参数的意义和data leakage
构建的每一颗树的数据都是有放回的随机抽取的(也叫bootstrap),n_estimators参数是你想设置多少颗树,还有就是在进行树的结点分裂的时候,是随机选取一个特征子集,然后找到最佳的分裂标准.
- sklearn.naive_bayes中几种朴素贝叶斯分类器
区别: 几种朴素贝叶斯分类器的区别在于对于分布的假设,即假设满足的形式. 一.高斯NB 导入 from sklearn.naive_bayes import GaussianNB 假设特征的似然函数满 ...
- sklearn-MultinomialNB朴素贝叶斯分类器
原型 class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None) 参数 Parameter ...
- 朴素贝叶斯分类器Naive Bayes
优点Naive Bayes classifiers tend to perform especially well in one of the following situations: When t ...
随机推荐
- java基础-arrayList
ArrayList: 结构之钱了解了,ArrayList()会构造出一个初始容量=10的空的列表: ArrayList()的增加和删除都是拷贝数组到新的数组(如果当前数组容量不足的话),把数组内的 ...
- cordova原生页面切换效果插件的使用:com.telerik.plugins.nativepagetransitions
1. 添加插件:cordova plugin add com.telerik.plugins.nativepagetransitions2. 使用方法: 在index.html中添加: <met ...
- 记SCOI2019
离精英体验营结束已两周的,要哭的要笑的现在也一定释怀了.是时候冷静分析一下这次的考试了.时间序虽然有流水账的嫌疑,但这毕竟是OI界的流行风气. day0 早上坐学校包的商务车去了电子科技大学.走在来过 ...
- c# 使用 namedpipe 通信
using System; using System.IO; using System.IO.Pipes; using System.Diagnostics; using System.Threadi ...
- 在<canvas>上绘制img(drawImage())时需要注意的事
<canvas>标签相当于是一个画布,css决定画布的样式(这块画布的背景颜色.大小等),脚本(一般使用JavaScript)就是画笔,我们可以在这个画布上绘制线条.形状.文字.图片等. ...
- 管理mysql数据的两条sql tips
当从B表数据更新到A表时: update A inner join B on A.aid=B.aid set A.user_name=B.username,A.phone=B.telwhere A.a ...
- python基础知识12---函数2
阅读目录 一 引子 二 定义函数 三 调用函数 四 函数的参数 五 练习题 一 引子 1 为何要用函数之不用函数的问题 #1.代码的组织结构不清晰,可读性差 #2.遇到重复的功能只能重复编写实现代码, ...
- mac下 chmod 不了文件,可以右键查看文件简介处修改权限
- 好玩的PIL
原图(下面的代码全为部分)不喜欢的一个库 缩小的代码 from PIL import Image im=Image.open('tupian.jpg') im.thumbnail(128,128)) ...
- IDEA注册码分享
IntelliJ IDEA IDEA 2018 激活注册码分享鼠标连续 三下左键点击 选中,再Ctrl+C 即可复制. CSDN在末尾会带上博客的说明,请删除后,复制到 IDEA中激活. 注册码激活: ...