机器学习-朴素贝叶斯算法

联合概率:包括多个条件,且所有的条件都成立的概率:P(a, b)

条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率 P(a | b)

相互独立:如果P(A , B) = P(A) * P(B)那么称事件A和事件B相互独立

贝叶斯公式:

P(C | W) = P(W | C) * P(C) / P(W)

下面拿一个实例来举例子:(A,B,C分别表示对应的特征中的某个值)

P(A | B,C) = P(B , C | A) * P(A) / P(B, C) = P(B | A) * P(C | A) * P(A) / P(B, C)

但是,这样可能会存在一个问题,就是P(B , C)可能为0,为了解决这个问题,“朴素”的概念就来了。

朴素:认为特征与特征之间是相互独立的

这样上面的式子中的 P( B, C)就转化为了P(B) * P(C) 就不会出现0的情况了

从上面的公式里可以看出来,该算法的主要思想就是在已有的数据集中进行搜索,找到相同的情况,对现有的数据进行预测。但是可能会遇到当很多的特征都相同,单只有一种特征不同时。算法的分子匹配不到数据集中的例子,从而分母出现会出现0的情况。为了防止分子出现0,要引入

拉普拉斯平滑系数: P(A |B) = (Ni + a) / (N + am) a 一般取1.0,对于m表示训练集中特征次的个数。 

下面用将文本分类的例子对该API进行使用:

from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import GridSearchCV


data = fetch_20newsgroups(subset='all')
x_train, x_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.25, random_state=0)

trans = TfidfVectorizer()
x_train = trans.fit_transform(x_train)
x_test = trans.transform(x_test)

estimator = MultinomialNB()
dir = {'alpha': [0.009, 0.0092, 0.0093, 0.0094]}
estimator = GridSearchCV(estimator=estimator, param_grid=dir, cv=10)

estimator.fit(x_train, y_train)
print(estimator.best_estimator_)
values = estimator.predict(x_test)
right = values == y_test

for i in range(len(values)):
    print(f"\nPredict {values[i]}")
    print(f"target {y_test[i]}")
    print(right[i])

print(f"sccuracy = {estimator.score(x_test, y_test) * 100}%")
sccuracy = 91.25636672325976%

 

上一篇:k-prototypes聚类算法


下一篇:人工智能基础(十六)模型的保存与加载