朴素貝葉斯分類(naive bayesian,nb)源於貝葉斯理論,其基本思想:假設樣本屬性之間相互獨立,對於給定的待分類項,求解在此項出現的情況下其他各個類別出現的概率,哪個最大,就認為待分類項屬於那一類別。郵箱內垃圾郵件的篩選即應用朴素貝葉斯算法。
朴素貝葉斯分類實現的三階段:
第一階段,准備工作。根據具體情況確定特征屬性,並對每一特征屬性進行划分,然后人工對一些待分類項進行分類,形成訓練樣本集合。這一階段的輸入是所有待分類數據,輸出是特征屬性和訓練樣本。唯一需要人工處理的階段,質量要求較高。
第二階段,分類器訓練階段(生成分類器)。計算每個類別在訓練樣本中出現頻率及每個特征屬性划分對每個類別的條件概率估計,並將結果記錄。其輸入是特征屬性和訓練樣本,輸出是分類器。
第三階段,應用階段。使用分類器對待分類項進行分類,其輸入是分類器和待分類項,輸出是待分類項與類別的映射關系。
R語言貝葉斯分類函數包caret中train函數,klaR包中的NavieBayes函數,e1071包中的naiveBayes函數。
e1071包中naiveBayes( )函數使用方法:
Computes the conditional a-posterior probabilities of a categorical class variable given independent predictor variables using the Bayes rule.(貝葉斯分類即使用先驗概率計算后驗概率)
naiveBayes(formula, data, laplace = 0, ..., subset, na.action = na.pass)
formula:類似一般線性回歸表達式,不含常數項。
data:需要分析的訓練數據對象。
laplace:拉普拉斯估計值,默認為0。
subset:抽取要分析的訓練數據子集。
na.action:缺失值的處理方法。默認情況下不將缺失值納入模型計算,如果設定為na.omit則會刪除缺失值進行計算。
klaR包中NaiveBayes( )函數使用方法:
NaiveBayes(formula, data, ..., subset, na.action = na.pass) NaiveBayes(x, grouping, prior, usekernel = FALSE, fL = 0, ...)
formula,data,subset,na.omit同上。
x:指定要處理的數據,數據框或者矩陣形式。
grouping:因子型的分類變量。
prior:可以為各個類別指定先驗概率,默認情況下各個樣本的比例為先驗概率。
usekernel:是否使用核密度估計器估計密度函數。
fL:是否進行拉普拉斯修正,默認情況下不進行修正。數據量較小時可以設置為1,進行拉普拉斯修正。
klaR包是對e1071包的延伸與擴展,加入了先驗概率和密度函數的估計方法。
使用樣本數據聲明:
這是一份汽車滿意度car數據集,具體指標如下:
buy:購買價格(很高,高,中,低)
main:保養價格(很高,高,中,低)
doors:門的個數(2,3,4,5,……)
capacity:載人數
lug boot:車身大小
safety:安全程度(高,中,低)
accept:被接受程度(很好,好,滿意,不滿意)
代碼:
#朴素貝葉斯分類 #導入數據 car <- read.table(file.choose(),sep = ',') head(car) #變量重命名 colnames(car) <- c('buy',"main",'doors','capacity', 'lug boot','safety','accept') #選取75%數據為訓練集,25%數據為測試集 #構建訓練集的下標集 library(caret) ind <- createDataPartition(car$accept,times = 1,p=0.75,list = F) cartrain <- car[ind,] cartest <- car[-ind,] ###e1071函數包使用 library(e1071) nb.model <- naiveBayes(accept~.,data = cartrain) #預測結果 nb_predict <- predict(nb.model,newdata = cartest) #生成實際與預測交叉表和預測精度 nb.table <- table(actual=cartest$accept,predict=nb_predict) nb_ratio <- sum(diag(nb.table))/sum(nb.table) ###klaR函數包使用,在e1071包的基礎上進行的擴展 library(klaR) knb.model <- NaiveBayes(accept~.,data = cartrain) #預測結果 knb_predict <- predict(knb.model,newdata = cartest[,1:6]) #生成實際與預測交叉表和預測精度 knb.table <- table(actual=cartest$accept,predict=knb_predict$class) knb_ratio <- sum(diag(knb.table))/sum(knb.table) #分析結果 nb.table;knb.table nb_ratio;knb_ratio
運行結果:
通過朴素貝葉斯分類得到90.3%的准確率。
朴素貝葉斯方法優缺點:
參考來源:
https://edu.hellobi.com/course/192/announcement 內 https://pan.baidu.com/s/1nvJpp9J 密碼: guwv