上篇文章不带假设的使用聚类算法去判断红楼梦的作者,这一篇打算使用监督学习方法的贝叶斯分类,假设后四十回不是曹雪芹所写, 去做个验证。

关于我读过比较好的贝叶斯讲解:A simple explanation of Naive Bayes Classification

基本过程

先带入假设,前80回和后40回不是同一人所写。利用上篇文章构建的词向量,对数据集进行分层随机抽样,比如随机选取前80中的60回,后40中的30回进行训练,然后进行预测。如果预测效果很好的话,说明我们的假设正确。 后续可以做个验证,只使用前80回,对前后40回打上0, 1标签。进行同样训练。由于同一人所写,预测难度加大, 如果精确度不如上一步,则侧面证明假设正确。

准备工作

import os
import numpy as np
import pandas as pd
import re
import sys
import matplotlib.pyplot as plttext = pd.read_csv("./datasets/hongloumeng.csv")
import jieba
import jieba.analysevorc = [jieba.analyse.extract_tags(i, topK=1000) for i in text["text"]]
vorc = [" ".join(i) for i in vorc]from  sklearn.feature_extraction.text import CountVectorizer
vertorizer = CountVectorizer(max_features=5000)
train_data_features = vertorizer.fit_transform(vorc)train_data_features = train_data_features.toarray()train_data_features.shape
复制代码

上述是准备工作,生成词向量。

标签生成

labels = np.array([[0] * 80 + [1] * 40]).reshape(-1 ,1) # 目标值
labels.shape
复制代码

这一步生成目标labels。

分层随机抽样

# 分层抽样
from sklearn.model_selection import train_test_split
# train_data_features = train_data_features[0:80]
X_train, X_test, Y_train, Y_test = train_test_split(train_data_features, labels, test_size = 0.2, stratify=labels)
复制代码

这里做过多解释, stratify=labels 表示按照目标类别进行随机抽样。

模型训练和预测

from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegressiongnb = GaussianNB()
gnb.fit(X_train, Y_train)y_pred = gnb.predict(X_test)
复制代码

对得到的预测值进行精确度计算:

from sklearn.metrics import accuracy_score
accuracy_score(Y_test, y_pred)
# 0.875
复制代码

分层交叉验证

from sklearn.model_selection import StratifiedShuffleSplit
sss = StratifiedShuffleSplit(n_splits=10,test_size=0.2)
for train_index, test_index in sss.split(train_data_features, labels):X_train, X_test = train_data_features[train_index], train_data_features[test_index]Y_train, Y_test = labels[train_index], labels[test_index]gnb = GaussianNB()gnb.fit(X_train, Y_train)Y_pred = gnb.predict(X_test)scores.append(accuracy_score(Y_test, Y_pred))
print(scores)
print(np.array(scores).mean())
复制代码

输出结果如下:

[0.9166666666666666, 0.8333333333333334, 1.0, 0.875, 0.75, 0.8333333333333334, 0.8333333333333334, 0.9583333333333334, 0.875, 0.8333333333333334]
0.8708333333333333
复制代码

如上,可以对文章刚开始的假设做个解释,初步判断我们的假设正确。

交叉验证

labels_val = np.array([[0] * 40 + [1] * 40]).reshape(-1 ,1) # 目标值
sss_val = StratifiedShuffleSplit(n_splits=5,test_size=0.2)#分成5组,测试比例为0.25,训练比例是0.75
scores = []
train_data_features_val = train_data_features[0:80]
for train_index, test_index in sss_val.split(train_data_features_val, labels_val):X_train, X_test = train_data_features_val[train_index], train_data_features_val[test_index]Y_train, Y_test = labels_val[train_index], labels_val[test_index]gnb = GaussianNB()gnb.fit(X_train, Y_train)Y_pred = gnb.predict(X_test)scores.append(accuracy_score(Y_test, Y_pred))
print(scores)
print(np.array(scores).mean())
复制代码

输出结果如下:

[0.8125, 0.875, 0.75, 0.875, 0.75]
0.8125
复制代码

经过多次计算求平均值,后者得到的平均分数都低于前者, 文章开头的假设正确。

完整代码:github

机器学习之红楼梦作者判断(贝叶斯分类)相关推荐

  1. 机器学习日常练习——红楼梦作者分析(聚类)

    红楼梦作者分析(聚类) 实验要求 实验题目:<红楼梦>作者分析 实验目的 实验内容 资料下载 实验过程: 问题分析: 解决思路: 代码: 代码一: 出现的问题 文件编码问题 将红楼梦数据, ...

  2. 用机器学习的方法鉴别红楼梦作者

    为什么80%的码农都做不了架构师?>>>    在学界一般认为,<红楼梦>后 40 回并非曹雪芹所著.本文尝试应用机器学习的方法来分析原著文本中作者的用词习惯,从技术角度 ...

  3. 数学建模训练 — 红楼梦作者解析

    摘要 <红楼梦>不同章回之间作者的异同,历来被学术界争论不休.当新的计算工具出现之后,我们就可以用数学的知识统计分析<红楼梦>不同章回作者异同的问题. 针对问题一,问题一要求根 ...

  4. 【数学建模论文】数学模型分析红楼梦作者

    1.摘要 <红楼梦>不同章回之间作者的异同,历来被学术界争论不休.当新的计算工具出现之后,我们就可以用数学的知识统计分析<红楼梦>不同章回作者异同的问题. 针对问题一,问题一要 ...

  5. python红楼梦作者_用 Python 分析《红楼梦》,后四十回是曹雪芹所写吗?(开源)...

    原标题:用 Python 分析<红楼梦>,后四十回是曹雪芹所写吗?(开源)

  6. 统计虚词使用不同聚类方法判别红楼梦作者

    采用了K-means聚类和层次聚类.密度聚类效果不太好就舍弃了 用到的库 import numpy as np from sklearn.cluster import KMeans from skle ...

  7. 重做红楼梦的数据分析-判断前80回后40回是否一个人写的

    重做红楼梦的数据分析-判断前80回后40回是否一个人写的 红楼梦的数据分析已经有许多人做过,结论也各不相同. 我在知乎上看到两篇帖子: 1. 通过数据挖掘能分析<红楼梦>各回的真伪吗? 2 ...

  8. python红楼梦人物词频统计_用 Python 分析《红楼梦》

    1 前言 两个月以来,我通过互联网自学了一些文本处理的知识,用自然语言处理和机器学习算法对<红楼梦>进行了一些分析.这个过程中我找到了一些有趣的发现,所以我想写一篇文章,既㲌与大家分享和讨 ...

  9. 用 Python 分析《红楼梦》(1)

    1 前言 两个月以来,我通过互联网自学了一些文本处理的知识,用自然语言处理和机器学习算法对<红楼梦>进行了一些分析.这个过程中我找到了一些有趣的发现,所以我想写一篇文章,既㲌与大家分享和讨 ...

最新文章

  1. pycharm 查看代码行数_【收藏】提高PyCharm效率的10个小技巧
  2. java 向下转型_Java_向下转型
  3. spring cloud整合OpenFeign
  4. python学习六:数据结构
  5. concat特征融合_深度特征融合---理解add和concat之多层特征融合
  6. 基于epoll+threadpool的webServer分析与实现
  7. 2018.08.29 NOIP模拟 pmatrix(线性筛)
  8. Cortex-M3 I-Code,D-Code,系统总线及其他总线接口
  9. 黑客松Demo: Kata 的下一代镜像系统
  10. 销售灵魂人物的潜伏笔记5
  11. python爬虫实例评论_python爬取微博评论的实例讲解
  12. socket 服务器端和客户端通信,面向TCP的
  13. 新广告法违规词、敏感词在线检测工具 淘宝违规词检测、查询
  14. Mysql基础-常用sql语句
  15. 什么是数据运营?数据运营是做什么的?
  16. 红米1A显示器于笔记本win10环境下,如何设置颜色范围使得显示器亮度恢复成250nit
  17. SpeedPan百度云不限速下载
  18. 高精度电流检测电路INA199可用于过流保护应用
  19. node.js使用puppeteer来html生成pdf
  20. _variant_t与其他数据类型的转换

热门文章

  1. 向量空间模型简介及算法
  2. Monte Carlo 与 MCNP、EGS、Geant4的故事
  3. 关于select2高度自定义设置解决方案
  4. 软件测试工程师应该具备的素质---菜鸟的小想法
  5. kingscada检测服务器状态,基于云服务器的状态检测平台
  6. python读取dta文件_python – 带有大型.dta文件的Pandas read_stata()
  7. Python入门:格式化输出商品的编号和单价
  8. 网络编程培训之三 实现TCP/UDP的简单Echo服务器
  9. 大学物理 电容的充放电
  10. 全国三级考试1-20