用scikit-learn实现朴素贝叶斯分类器

朴素贝叶斯(Naive Bayes Classifier)是一种「天真」的算法(假定所有特征发生概率是独立的),同时也是一种简单有效的常用分类算法。关于它的原理,参见朴素贝叶斯分类器的应用。
scikit-learn是一个广泛应用的机器学习Python库,它封装了包括朴素贝叶斯在内的若干基础算法。在这篇博客里,我们希望用朴素贝叶斯实现对短文本(新闻标题)的分类。
朴素贝叶斯属于有监督分类,需要获取一批已标注的数据作为训练和测试分类器的样本。样本的获取,可通过人工标注或网页抓取的方式。这里先准备好2w条已标注的新闻标题(共10个标签,每个标签下的样本是均衡的),并以3:1的比例切分训练集和测试集。文本的格式如下:

娱乐\t组图:刘亦菲短裙秀腿 浓妆变冷艳时髦女

其次,将短文本转化为一个多维向量,这涉及到两个问题:一是分词,由于scikit-learn内置的分词器并不支持中文,所以需要指定一个tokenizer(推荐结巴分词);二是文本到向量的转化方法,考虑到后续可能加大训练集的数量,而短文本的特征相对稀疏,采用了内存占用率较低、仅计算词频的HashingVectorizer。值得注意的是,测试集需要和训练集共用一个向量转化器。

python# non_negative=True -- 模型仅包含非负值
vectorizer = TfidfVectorizer(tokenizer=comma_tokenizer, non_negative=True)
train_data = vectorizer.fit_transform(train_words)
test_data = vectorizer.fit_transform(test_words)

然后,我们创建一个多项式的朴素贝叶斯分类器(适用于离散特征的分类),分别输入训练集的文本和标签(要求都为numpy矩阵)进行训练,训练好的分类器再用在测试集文本的分类,以检验分类器的性能。

python# alpha -- 模型的平滑参数
clf = MultinomialNB(alpha=0.01)
clf.fit(train_data, numpy.asarray(train_tags))
pred = clf.predict(test_data)

最后,比较分类器的预测结果和测试集的真实标签,得到分类器的准确率和召回率。

pythonm_precision = metrics.precision_score(actual, pred)
m_recall = metrics.recall_score(actual, pred)

完整代码请见sci_classifier.py。
从测试的结果来看,准确率和召回率均在8成以上,性能除了和分类器有关,也依赖于输入数据对应不同类别的特征是否足够明显。

来自:建造者说

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scikit-learn库提供了多种贝叶斯分类器实现,包括高斯朴素贝叶斯、多项式朴素贝叶斯和伯努利朴素贝叶斯。这里以高斯朴素贝叶斯分类器为例,介绍如何使用Scikit-learn实现贝叶斯分类。 1. 数据准备 首先,我们需要准备一些分类数据。这里使用Scikit-learn库自带的鸢尾花数据集。代码如下: ```python from sklearn.datasets import load_iris iris = load_iris() X = iris.data y = iris.target ``` 2. 数据预处理 在使用贝叶斯分类器之前,需要对数据进行预处理。这里我们使用Scikit-learn库的数据预处理工具preprocessing的StandardScaler类进行标准化处理。代码如下: ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X = scaler.fit_transform(X) ``` 3. 构建模型 接下来,我们可以使用Scikit-learn库的GaussianNB类构建高斯朴素贝叶斯分类器。代码如下: ```python from sklearn.naive_bayes import GaussianNB gnb = GaussianNB() ``` 4. 模型训练 模型构建完成后,我们需要使用训练数据对模型进行训练。代码如下: ```python gnb.fit(X, y) ``` 5. 模型预测 训练完成后,我们可以使用模型对新的数据进行分类预测。代码如下: ```python y_pred = gnb.predict(X) ``` 6. 模型评估 最后,我们可以使用Scikit-learn库的metrics的accuracy_score函数计算模型准确率。代码如下: ```python from sklearn.metrics import accuracy_score accuracy = accuracy_score(y, y_pred) print('Accuracy:', accuracy) ``` 完整代码如下: ```python from sklearn.datasets import load_iris from sklearn.preprocessing import StandardScaler from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score # 数据准备 iris = load_iris() X = iris.data y = iris.target # 数据预处理 scaler = StandardScaler() X = scaler.fit_transform(X) # 构建模型 gnb = GaussianNB() # 模型训练 gnb.fit(X, y) # 模型预测 y_pred = gnb.predict(X) # 模型评估 accuracy = accuracy_score(y, y_pred) print('Accuracy:', accuracy) ``` 注意,这里为了简化代码,使用训练数据进行了模型评估。在实际应用,应该使用测试数据进行模型评估,以避免过拟合问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值