Python之朴素贝叶斯对展会数据分类

简介: Python之朴素贝叶斯对展会数据分类

读大学时期写的博文


目的


在公司实习,分别从国内国外两个网站爬取了一些展会数据,在数据处理上目前需要将其按照各个类别分类好,并提供对应展会地址的经纬度,国内数据如下:

111.jpg

国内数据比较少,占四百多条,在类别上来看有所属行业这一列,所以比较好处理,国外数据就有些尴尬:333.jpg

国外网站展会数据将近五万多条,跟分类有关的只有 categories这一列数据,都是一些标签词,还偏少。


现在需要将五万多条展会数据进行分类,如何解决这个问题,我觉得可以写个朴素贝叶斯分类器


数据


朴素贝叶斯分类器是利用样本数据来进行训练的,每个样本必须含有一组特征词以及对应的分类。


数据的准备


获取的国内数据就很适合作为训练数据,可以将其处理成如下格式作为样本输入:2.jpg

训练数据主要是这两列,所属行业以及展会范围,每一行的类别都有其对应的展会范围,将这些作为训练数据实在再好不过,我们将其称之为训练集


那么相对应,国外待分类的展会数据便是测试集


我们将利用训练好的分类器,将测试集一一输入,看看能否得到期望的输出结果。


可是现在有个问题,作为训练集的国内数据只有四百多条,实在太少,于是我只能再去那个国内展会网站将以前的展会数据尽量爬取下来,最终训练集达到了 39555条,虽说数量还是不够,但是不试试最终分类器的分类结果,说不定准确率还可以呢?


分词&&提取


不积小流,无以成江海,以小见大,咱们看这样一条数据:

所属行业:建材五金
展会范围:各类卫生洁具、浴室家具和配件、面盆、马桶、淋浴房、浴缸、花洒、水龙头及配件、浴室照明、镜子、五金挂件等

思考一下,这一条数据的所属行业展会范围有什么关系,我们将从这里得到编写分类器的出发点。


在这条数据中,展会范围的内容是具有一定的代表性的,其代表这条数据的描述很偏向建材五金这个行业。


那我么是不是可以提炼出这个描述的关键词,从而让这个关键词代表建材五金这个行业。

# 可以利用结巴分词
import jieba.analyse
con = "各类卫生洁具、浴室家具和配件、面盆、马桶、淋浴房、浴缸、花洒、水龙头及配件、浴室照明、镜子、五金挂件等"
feature = jieba.analyse.extract_tags(con, 8)
print(feature)
# output:['配件', '各类', '家具', '五金', '照明', '浴室', '淋浴房', '浴缸']

那么刚刚那条数据可以这样看:

# data_01
所属行业:建材五金
描述关键词:'配件', '各类', '家具', '五金', '照明', '浴室', '淋浴房', '浴缸'

以此类推,如果一条未分类数据的关键词也是这样,那是不是可以将该数据归为建材五金这个类别,是的,你可以这么干。


但有个问题,若该未分类数据的关键词只含有以上关键词的某个,比如:

# data_02
所属行业:未知
描述关键词:'配件','家具'

这样子若分为建材五金不大对吧,我倒觉得应该分为房产家居,这个问题可以解决,就让我们的概率出场吧。


大三的时候学过概率统计,也记得一个公式名为贝叶斯定理

3.jpg这表示计算条件概率的公式:

P(A\B) = P(B\A)*P(A)/P(B) == 后验概率 = 先验概率 x 调整因子
# 这样写会不会更加清晰
P(category\keywords) = P(category) * P(keywords\category)/ P(keywords)
## 朴素贝叶斯便是假设即将被组合的各个概率是独立的,可以理解成keyword1出现在category1的概率和keyword2出现在category1的概率是没有关系的,是独立的。
P(category\keywords) = P(category) * P(keyword1\category)P(keyword2\category)...P(keywordn\category)/ P(keywords)

总结就是,我们先求出样本空间中每个分类的概率P(category)——先验概率


再求出一组待分类数据的关键词在各个类别中的概率P(keywords\category)——调整因子


最后先验概率*调整因子得出后验概率,再经过比较,后验概率最大的,便是待分类数据最可能的类别。


我们的准备很充足了,但在写分类器之前,还是先将下面要用到的数据提前提取出来。


2.2.1.确定训练数据有多少类别


2.2.2.训练数据的关键词集合,为了方便后续计算,将其转为id:word的格式存为id_word.txt

4.jpg

2.2.3.计算出每个关键词在每个不同类别出现的概率,将其转为category=id:pro(id)的格式存为tf_id_word.txt

5.jpg

2.2.4.求出样本空间中每个分类的概率P(category)——先验概率,将其转为category:pro(category)的格式存为type_pro.txt

6.jpg

编码


经过前面的步骤,现在编写代码实在简单,不过有两点要注意。


其一是关键词并不是在每个类别都会出现,这样会导致P(keyword\category) = 0,进而导致整个后验概率为0,为了解决这个问题,可以引入拉普拉斯平滑,这样便确保不会出现为0的情况,具体代码中有介绍。


其二是若每个调整因子的数值都很小,大家都知道很小的值相乘,会导致结果变得更小,这样子表现出各个分类结果的后验概率便会出现问题,这个问题便是下溢出问题,解决办法便是将其转化为对数,对数相乘便是对数相加,这样便很巧妙的解决了这个问题。


好了,直接上代码,让我们看看分类的结果吧。

# -*-coding:utf-8-*-
__author__ = 'howie'
import jieba.analyse
import pandas as pd
import math
class Pridict(object):
   """
   利用txt/中数据进行朴素贝叶斯算法训练
   """
   def __init__(self):
       # 初始化结果字典
       self.resultData = {}
   def getKeyword(self, path):
       """
       通过结巴分词进行关键词提取
       :param path: 待分词文件路径 相关参数可更改 也可不调用直接写
       :return: keywordDic = {index:['word1','word2'...]}
       """
       keywordDic = {}
       df = pd.read_csv(path)
       for des in df.values:
           jieba.analyse.set_idf_path('txt/type_dict.txt')
           feature = jieba.analyse.extract_tags(des[15], 8)
           keywordDic[des[16]] = feature
       return keywordDic
   def idDic(self, keywordDic):
       """
       将每条待分类关键词替换成对应的单词向量
       :param keywordDic:格式 keywordDic = {index:['word1','word2'...]}
       :return: keywordDic = {'1': ['12198', '16311', '6253', '8302']}
       """
       with open('txt/id_word.txt', 'r', encoding='utf8') as of:
           lines = of.read().split('\n')
       for key, values in keywordDic.items():
           id_word = []
           for eachValue in values:
               id_word += [eachLine.split(':')[0] for eachLine in lines if eachValue == eachLine.split(':')[-1]]
           keywordDic[key] = id_word
       return keywordDic
   def calPro(self, keywordDic):
       """
       计算每一组待分类数据关键词对应概率总和
       :param keywordDic:格式 keywordDic = {'1': ['12198', '16311', '6253', '8302']}
       :return: result = {'1': {'type1': -33.23204707236557, 'type3': -31.376043125934267, 'type3': -27.385192803356617...}
       """
       result = {}
       # print(keywordDic)
       # 获取每个类别关键词出现概率
       with open('txt/tf_id_word.txt', 'r', encoding='utf8') as of:
           lines = of.read().split('\n')[0:-1]
       # 循环待分类数据
       for key, values in keywordDic.items():
           result[key] = {}
           # 读取分类概率文件中读取每行数据
           for eachLine in lines:
               valLen = len(values)
               valPro = list(map(lambda x: '', [x for x in range(0, valLen)]))
               laplace

初步写好分类器,其实这才是任务的开始,分类器的最重要的是第二部分的数据提取,接下来需要通过不断地训练,让数据变得更加优雅美丽,从而让分类器的结果趋于完美,本人苦逼地调了一个星期,现在也就勉强能用。


让我们看看分类器的分类效果:

7.jpg

可以看到分类器给出的参考分类很有代表性,这一段就此结束,若有错误,敬请指出,谢谢。


相关文章
|
6天前
|
数据挖掘 索引 Python
Python数据挖掘编程基础3
字典在数学上是一个映射,类似列表但使用自定义键而非数字索引,键在整个字典中必须唯一。可以通过直接赋值、`dict`函数或`dict.fromkeys`创建字典,并通过键访问元素。集合是一种不重复且无序的数据结构,可通过花括号或`set`函数创建,支持并集、交集、差集和对称差集等运算。
15 9
|
3天前
|
数据采集 数据挖掘 数据处理
Python中实现简单爬虫并处理数据
【9月更文挑战第31天】本文将引导读者理解如何通过Python创建一个简单的网络爬虫,并展示如何处理爬取的数据。我们将讨论爬虫的基本原理、使用requests和BeautifulSoup库进行网页抓取的方法,以及如何使用pandas对数据进行清洗和分析。文章旨在为初学者提供一个易于理解的实践指南,帮助他们快速掌握网络数据抓取的基本技能。
15 3
|
5天前
|
存储 索引 Python
python中的数据容器
python中的数据容器
|
5天前
|
数据采集 存储 监控
如何使用 Python 爬取京东商品数据
如何使用 Python 爬取京东商品数据
17 0
|
6天前
|
数据挖掘 Python
Python数据挖掘编程基础8
在Python中,默认环境下并不会加载所有功能,需要手动导入库以增强功能。Python内置了诸多强大库,例如`math`库可用于复杂数学运算。导入库不仅限于`import 库名`,还可以通过别名简化调用,如`import math as m`;也可指定导入库中的特定函数,如`from math import exp as e`;甚至直接导入库中所有函数`from math import *`。但需注意,后者可能引发命名冲突。读者可通过`help('modules')`查看已安装模块。
12 0
|
6天前
|
人工智能 数据挖掘 Serverless
Python数据挖掘编程基础
函数式编程中的`reduce`函数用于对可迭代对象中的元素进行累积计算,不同于逐一遍历的`map`函数。例如,在Python3中,计算n的阶乘可以使用`reduce`(需从`funtools`库导入)实现,也可用循环命令完成。另一方面,`filter`函数则像一个过滤器,用于筛选列表中符合条件的元素,同样地功能也可以通过列表解析来实现。使用这些函数不仅使代码更加简洁,而且由于其内部循环机制,执行效率通常高于普通的`for`或`while`循环。
11 0
|
6天前
|
分布式计算 数据挖掘 Serverless
Python数据挖掘编程基础6
函数式编程(Functional Programming)是一种编程范型,它将计算机运算视为数学函数计算,避免程序状态及易变对象的影响。在Python中,函数式编程主要通过`lambda`、`map`、`reduce`、`filter`等函数实现。例如,对于列表`a=[5,6,7]`,可通过列表解析`b=[i+3 for i in a]`或`map`函数`b=map(lambda x:x+3, a)`实现元素加3的操作,两者输出均为`[8,9,10]`。尽管列表解析代码简洁,但其本质仍是for循环,在Python中效率较低;而`map`函数不仅功能相同,且执行效率更高。
6 0
|
6天前
|
数据挖掘 Python
Python数据挖掘编程基础5
函数是Python中用于提高代码效率和减少冗余的基本数据结构,通过封装程序逻辑实现结构化编程。用户可通过自定义或函数式编程方式设计函数。在Python中,使用`def`关键字定义函数,如`def pea(x): return x+1`,且其返回值形式多样,可为列表或多个值。此外,Python还支持使用`lambda`定义简洁的行内函数,例如`c=lambda x:x+1`。
12 0
|
6天前
|
数据挖掘 Python
Python数据挖掘编程基础
判断与循环是编程的基础,Python中的`if`、`elif`、`else`结构通过条件句来执行不同的代码块,不使用花括号,依赖缩进区分代码层次。错误缩进会导致程序出错。Python支持`for`和`while`循环,`for`循环结合`range`生成序列,简洁直观。正确缩进不仅是Python的要求,也是一种良好的编程习惯。
13 0
|
6天前
|
Python
Python量化炒股的数据信息获取— 获取上市公司股东和股本信息
Python量化炒股的数据信息获取— 获取上市公司股东和股本信息
18 0
下一篇
无影云桌面