联合概率:包括多个条件,且所有的条件都成立的概率: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%