引言
朴素贝叶斯由贝叶斯定理延伸而来的简单而强大的概率模型,它根据每个特征的概率确定一个对象属于某一类别的概率。该方法基于一个假设,所有特征需要相互独立,即任一特征的值和其他特征的值没有关联关系。
虽然这种条件独立的假设在许多应用领域未必能很好满足,甚至是不成立的。但这种简化的贝叶斯分类器在许多实际应用中还是得到了较好的分类精度。训练模型的过程可以看作是对相关条件概率的计算,它可以用统计对应某一类别的特征的频率来估计。
朴素贝叶斯最成功的一个应用是自然语言处理领域,自然语言处理的的数据可以看做是在文本文档中标注数据,这些数据可以作为训练数据集来使用机器学习算法进行训练。
本小节中,主要介绍使用朴素贝叶斯方法来进行文本的分类,我们将要使用一组标记类别的文本文档来训练朴素贝叶斯分类器,进而对未知的数据实例进行类别的预测。这个方法可以用作垃圾邮件的过滤。
数据集
该实验的数据可以通过scikit-learn获取一组新闻信息。
数据集由19,000个新闻信息组成,其中包含了20个不同的主题,包含政治、体育、科学等内容。
该数据集可以分成训练和测试两部分,训练和测试数据的划分基于某个特定日期。
数据的加载有两种方式:
- sklearn.datasets.fetch_20newsgroups,该函数返回一个原数据列表,可以将它作为文本特征提取的接口(sklearn.feature_extraction.text.CountVectorizer)的输入
- sklearn.datasets.fetch_20newsgroups_vectorized,该接口直接返回直接可以使用的特征,可以不再使用特征提取了
from sklearn.datasets import fetch_20newsgroups
news = fetch_20newsgroups(subset='all')
print news.keys()
print type(news.data), type(news.target), type(news.target_names)
print news.target_names
print len(news.data)
print len(news.target)
打印信息:
[‘DESCR’, ‘data’, ‘target’, ‘target_names’, ‘filenames’]
print news.data[0]
print news.target[0], news.target_names[news.target[0]]
打印的新闻内容略去,类别为10,类别名为rec.sport.hockey。
数据的预处理
机器学习算法只能作用在数值数据上,算法期望使用定长的数值特征而不是不定长的原始文本文件,我们下一步的工作是将文本数据集转换成数值数据集。
现在,我们只有一种特征:新闻消息的文本内容,我们需要一个函数将一段文本转换成一组有意义的数值特征。
直觉上,可以尝试着眼于每种文本类别的独立字符串(更准确说是标记,token),然后将每种类别对应的标记词的频率分布特性描述出来。sklearn.feature_extraction.text
模块具有一些用文本文档来构建数值特征向量的有用的工具。
划分训练与测试数据
在进行转换工作之前,我们需要将数据划分为训练和测试数据集。由于载入的数据是随机顺序出现的,我们可以将数据划分为两部分,75%作为训练数据,25%作为测试数据:
SPLIT_PERC = 0.75
split_size = int(len(news.data)*SPLIT_PERC)
X_train = news.data[:split_size]
X_test = news.data[split_size:]
Y_train = news.target[:split_si