朴素贝叶斯(演示结果与SVM进行对比)
生活随笔
收集整理的這篇文章主要介紹了
朴素贝叶斯(演示结果与SVM进行对比)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
貝葉斯估定理
貝葉斯定理以18世紀英國數學家托馬斯命名,如圖已知先驗概率P(A),再得知在A發生條件下B發生的可能性,推算出后驗概率,可以看成由結果追溯原因類型問題。
借助戰國諺語“三人成虎”例子來加深理解,皇帝一直以來對某大臣很信任,這時候出現第一個人向皇帝諫言說該大臣存在玩忽職守問題,第一次皇帝也許不信,但懷疑的種子已經發芽,接著第二個人、第三個人出現,一直向皇帝諫言該大臣有類似問題,那么皇帝最終會猜測這個人是否真的有該問題。
還有一個經典三扇門問題,三扇門有2個門里是羊,1個門有汽車,你選定1個門,但并沒有打開,這個時候主持人幫答題者排除一個有羊的門,這個時候主持人問你,現在是否需要換門。
現可知,汽車在1門、2門、3門的概率記為P(Ai)=𝟏/𝟑;已經由答題者指定1門、主持人2門 記為B;當汽車在1號門條件概率𝐏(B|A1)=1/2;當汽車在2號門𝐏(B|A2)=0;當汽車在3號門𝐏(B|A3)=1/2
𝐏(A|B)=(𝐏(𝐁|𝐀)?𝐏(𝐀))/(𝐏(𝐁)) P(B)=𝐏(B|A1)*P(A1)+𝐏(B|A2)*P(A2) + 𝐏(B|A3)*P(A3)=1/2*1/3+1*/2+0*1/3+1*1/3=1/2 𝐏(A1|B)=(𝟏/𝟔)/(𝟏/𝟐) =1/3 𝐏(A2|B)=𝟎/(𝟏/𝟐) =0 𝐏(A3|B)=(𝟏/𝟑)/(𝟏/𝟐) =2/3可見答題者由1號門換3號門后的概率由原來的1/3提升至2/3,理應換門
當然做出換門游戲最快的決策的方式,就是可以想象主持人給你N(趨于無窮)扇門,你選擇了1號門,主持人幫你排除了掉沒有獎品的n-2扇門,這個時候必須要換門,因為主持人幫你排除n-2扇門后,這個時候換門概率由原來的1/N趨于100%,換門獲得獎品概率大幅度增加
樸素貝葉斯
樸素貝葉斯(Naive Bayesian)估計是一種二分類及多分類監督學習算法,與密度函數估計相結合,用已知的數據樣本來實現對未知類別數據的判斷,整體原理基于上述貝葉斯公式,由于樸素貝葉斯假設為獨立同分布,如圖,后驗概率最大可以等價于似然函數最大,用極大似然估計(MLE)對參數進行估計求解。
優點
1因為沒有迭代,直接計算概率,所以訓練時間更短,且對樣本數量要求比較少
2.處理連續和離散數據,對無關特征不敏感
3.非常簡單、快速且易于實施
4.適用于二分類和多分類
5.調參很少
缺點
樸素貝葉斯所做的假設模型內各個特征獨立且平等的,但現實中獨立性假設永遠不會正確,而在實踐中通常效果很好,所以叫“naive(天真)”,造成了在很多情況下,效果并不如其他模型分類
常見樸素貝葉斯類別
Gaussian naive Bayes(高斯樸素貝葉斯),為樸素貝葉斯變形,它遵循高斯正太分布并支持連續數據,如果數據連續特征不符合正態分布,可使用變換或不同的方法將其轉換為正態分布
Multinomial naive Bayes(多項式樸素貝葉斯分類器):主要對離散特征數據,對每個特征使用多項分布,給定特征項出現的次數,多用于NLP預測
Bernoulli naive Bayes(伯努利樸素貝葉斯):同為離散數據,主要為二進制、布爾類型設計使用
Complement Naive Bayes(補充貝葉斯):如果執行分類的數據集不平衡,則多項式以及高斯貝葉斯可能會產生低準確度
常用場景
文本分類
郵件分類
情感分類
天氣分類
…更側重于離散特征分類
適用數據
當naive的假設與實際數據匹配時,實際數據很難
能夠非常好分離數據,模型復雜度顯不得重要
對于非常高維的數據,模型復雜度顯得不重要
本次選取數據集為心臟病數據集,數據集本身質量較高,無需過多處理
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB from sklearn.preprocessing import MinMaxScaler from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score from sklearn.metrics import confusion_matrix from sklearn.model_selection import GridSearchCV from sklearn.svm import SVC from sklearn.metrics import confusion_matrix df = pd.read_csv("heart.csv") sns.pairplot(df,hue="target") plt.show()#如下圖,這里部分特征類別分離不是很明顯,需要進一步進行標準化,這里采用歸一化操作,將數據映射到[0,1]空間內,方便將高斯貝葉斯與多項式樸素貝葉斯的結果進行比較
plt.figure(figsize=(10,10)) sns.heatmap(df.corr(),annot=True,fmt='.1f') plt.show() #高斯樸素貝葉斯 y = df.target.values X = df.drop(['target'],axis=1) X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=10) scaler = MinMaxScaler(feature_range=(0., 1.)) X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) gaussian = GaussianNB() gaussian.fit(X_train, y_train) Y_pred = gaussian.predict(X_test) accuracy = accuracy_score(y_test,Y_pred) cm = confusion_matrix(y_test, Y_pred) sns.heatmap(cm, annot=True, fmt='d', cmap='YlGnBu') print('accuracy: %.3f' %accuracy) accuracy: 0.831混淆矩陣
由此明顯可以看出高斯貝葉斯準確率0.831明顯高于多項式樸素貝葉斯0.798
前一章SVM(支持向量機) SVM數據結果不是很好,這里再次用SVM與高斯貝葉斯模型估計進行對比一下
svc=SVC() parameters = [ {'C':[1, 10, 100, 1000], 'kernel':['rbf'], 'gamma':[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]},] grid_search = GridSearchCV(estimator = svc, param_grid = parameters,scoring = 'accuracy',cv = 5,verbose=0) grid_search.fit(X_train, y_train) print('GridSearch CV 最好分數 : {:.3f}\n'.format(grid_search.best_score_)) print('最佳參數 :', (grid_search.best_params_)) GridSearch CV 最好分數 : 0.968 最佳參數 : {'C': 1000, 'gamma': 0.5, 'kernel': 'rbf'}這里明顯可以感受到SVM的強大,正確率達到0.968,明顯高于高斯樸素貝葉斯0.831的正確率
總結
以上是生活随笔為你收集整理的朴素贝叶斯(演示结果与SVM进行对比)的全部內容,希望文章能夠幫你解決所遇到的問題。