朴素贝叶斯算法是机器学习里的重要算法。本文将会介绍它的原理和实例应用。
想要了解它的原理需要一定的概率基础,下面将简单的介绍概率的基础知识后深入解释朴素贝叶斯算法。
概率
定义
概率定义为一件事情发生的可能性。如:扔出一个硬币,结果头像朝上是百分之五十。
联合概率和条件概率
联合概率:包含多个条件,且所有条件同时成立的概率
记作:P(A,B)
特性:P(A,B)=P(A)P(B)
条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率
记作:P(A|B)
特性:P(A1,A2|B) = P(A1|B)P(A2|B)
注意两个的联合和条件事件的前提都是A1,A2相互独立,各个条件互不影响
1、女神喜欢的概率?解:P(喜欢)=4/72、职业是程序员并且体型匀称的概率?解:各个条件都独立且所有条件都同时发生,所以为联合概率P(程序员,匀称)=P(程序员)*P(匀称)=3/7*4/7=12/493、在女神喜欢的条件下,职业是程序员的概率?解:P(程序员|喜欢)=2/4=1/24、在女神喜欢的条件下,职业是产品,体重是超重的概率?解:各个条件都独立,且在某前提下发生另一件事情的概率P(产品,超重|喜欢)= P(产品|喜欢)* P(超重|喜欢)=1/2 * 1/4=1/8
贝叶斯公式
注:w为给定文档的特征值(频数统计,预测文档提供),c为文档类别
公式可以理解为:
其中c可以是不同类别。公式分为三个部分:
P(C):每个文档类别的概率(某文档类别词数/总文档词数)P(W|C):给定类别下特征(被预测文档中出现的词)的概率在C类别所有文档中出现的次数N为所属类别C下的文档所有词出现的次数和预测文档中每个词的概率
示例
现有一篇被预测文档:出现了影院,支付宝,云计算,计算属于科技、娱乐的
类别概率?
科技:P(影院,支付宝,云计算|科技)*P(科技)=(8/100)*(20/100)*(63/100)*(100/221)=0.00456109
娱乐:P(影院,支付宝,云计算|科技)*P(娱乐)=(56/121)*(15/121)*(0/121)*(121/221)=0
从上面的例子我们得到娱乐概率为0,这是不合理的,如果词频列表里面有很多出现次数都为0,很可能计算结果都为零。解决方法拉普拉斯平滑系数
a一般为1,m为训练文档中统计出的特征词个数。
示例的娱乐概率为:
((56+1)/(121+1*4))*((15+1)/(121+1*4))*((1+0)/(121+1*4))*((121+1)/(221+1*4))=0.001
科技概率也做对应的修改。
实例
朴素贝叶斯案例流程
1、加载20类新闻数据,并进行分割
2、生成文章特征词
3、朴素贝叶斯estimator流程进行预估
def naviebayes(): """ 朴素贝叶斯进行文本分类 :return: None """ news = fetch_20newsgroups(subset='all') # 进行数据分割 x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25) # 对数据集进行特征抽取 tf = TfidfVectorizer() # 以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d'] x_train = tf.fit_transform(x_train) print(tf.get_feature_names()) x_test = tf.transform(x_test) # 进行朴素贝叶斯算法的预测 mlt = MultinomialNB(alpha=1.0) print(x_train.toarray()) mlt.fit(x_train, y_train) y_predict = mlt.predict(x_test) print("预测的文章类别为:", y_predict) # 得出准确率 print("准确率为:", mlt.score(x_test, y_test)) print("每个类别的精确率和召回率:", classification_report(y_test, y_predict, target_names=news.target_names)) return None
准确率为: 0.840195246179966
相比上篇文章的k-近邻算法准确率提高了很多。朴素贝叶斯算法没有超参数,是无法从参数上调优的,它想要提高准确率是从样本数量和质量中调优。