朴素贝叶斯
1. 概率基础
- 案例:垃圾邮件的分类
- 概率:一件事情发生的可能性。
条件:所有特征之间是相互独立的
- 题目:
在夏季,某公园男性穿凉鞋的概率为 12 ,女性穿凉鞋的概率为 23 ,并且该公园中男女比例通常为 2:1 ,问题:若你在公园中随机遇到一个穿凉鞋的人,请问他的性别为男性或女性的概率分别为多少?
- 先验概率:是指根据以往经验和分析得到的概率。
- 条件概率:条件概率是指在事件 Y=y 已经发生的条件下,事件 X=x 发生的概率。条件概率可表示为: P(X=x|Y=y) 。而条件概率计算公式为:
- 联合概率:其中 P(X=x,Y=y) 是联合概率
- 全概率公式 :全概率公式是指:如果事件 Y=y1,Y=y2,…,Y=yn 可构成一个完备事件组,即它们两两互不相容,其和为全集。则对于事件 X=x 有:
- 后验概率:后验概率是指,某事件 X=x 已经发生,那么该事件是因为事件 Y=y 的而发生的概率。也就是上例中所需要求解的“在知道一个人穿拖鞋的前提下,这个人是男性的概率或者是女性的概率是多少”。后验概率形式化便是:
而朴素贝叶斯算法正是利用以上信息求解后验概率,并依据后验概率的值来进行分类。
2.fit、transform、fit_transform区别
- fit():就是求得训练集的均值,方差,最大值,最小值,这些训练集的固有属性。
- transform():在fit的基础上,进行标准化,降维,归一化等操作。
- fit_transform():fit_transform是fit和transform的组合,既包括了训练又包含了转换。transform()和fit_transform()二者的功能都是对数据进行某种统一处理(比如标准~N(0,1),将数据缩放(映射)到某个固定区间,归一化,正则化等)
3. 朴素贝叶斯(Naive Bayesian)
- 前提条件:特征相互独立。
- !!!!贝叶斯公式:
- 案例:
- API:sklearn.naive_bayes.MultinomialNB
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris,fetch_20newsgroups,load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
def naivebayes():
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()
x_train = tf.fit_transform(x_train)
print(tf.get_feature_names())
print(x_train.toarray())
x_test = tf.transform(x_test)
mlt = MultinomialNB(alpha=1.0)
mlt.fit(x_train,y_train)
y_predict = mlt.predict(x_test)
print(y_predict)
print(mlt.score(x_test,y_test))
return None
if __name__ == "__main__":
naivebayes()
- 朴素贝叶斯的影响因素就是训练集它不像knn那样可以调参数。
- 优点:
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
- 分类准确度高,速度快
- 缺点:
需要知道先验概率P(F1,F2,…|C),假设了他们的相对独立,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
4. 分类模型的评估
- 准确率:estimator.score()
- 混淆矩阵:有几个类别有几个混淆矩阵
首先考虑二分类的问题:
精确率:预测结果为正例样本中真实为正例的比例。
召回率:真实的正例中预测结果为正例的比例。
- F1-score:越高越好
API:sklearn.metrics.classfication_report
使用:sklearn.metrics.classfication_report(y_true,y_pred,target_names = None)
返回值:每个类别的精确率和召回率
5. 模型选择和调优
- 交叉验证:
- 网格搜索(超参数搜索):调参数,用交叉验证得出值,进行比较取最优
不止一个参数时,就是要两两组合。
API:sklearn.model_selection.GridSearchCV
举例:sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)