上次我们讲到朴素贝叶斯分类,忘记的同学参考一文搞懂朴素贝叶斯分类,今天就通过朴素贝叶斯分来来实现一个简单的垃圾短信分类器。
数据预处理
实现这个分类器我们使用的数据集来自伦敦大学学院的机器学习数据集(UCL machine learning),图中所示为该数据集的部分数据:
一般用 pandas 模块来处理数据, 在这里需要用到 pandas 的read_table()
方法,原因是文档集两列之间用了tab键来分割.如果对于read_table()
该选择哪些参数不明确的话,需要先阅读 pandas 的官方 API 文档,这里就不详细介绍了,很容易就搜索到。提一点,read_table()
默认分隔符就是以 tab 键来分割数据。
import pandas as pd
#读取数据
df = pd.read_table("yourfilepath", names=['label', 'sms_message'])
df.head()
通过上述代码可以读取数据并把前 5 行数据打印出来:
接下来,进行数据预处理,将 ham 和 spam 分别用 1 和 0 表示,为什么这么做呢?原因是机器只能识别机器语言,不能识别自然语言,如果把 label 用 string 类型来表示的话,scikit-learn 最后会自动转换成不识别的 float 型的值。
如果 label 按照 string 类型来表示,模型也照样有能力预测,不过通常在计算性能指标的时候会出现问题,比如召回率,精度等。代码如下:
# 做一个 map 表,0 表示‘ham',1 表示’spam‘
df['label'] = df.label.map({
'ham':0, 'spam':1})
df.head()
词袋方法
在处理文本信息