Python 比較樸素貝葉斯 決策樹 K均值效能

2021-10-17 05:28:13 字數 4247 閱讀 8098

演算法效能的比較

(1)分別讀取「連續屬性」資料夾中的七個資料集合

(2)對於每個資料集分別利用決策樹、樸素貝葉斯以及近鄰分類演算法建模(近鄰數k如何確定呢?),並利用五折交叉驗證計算每個模型的分類精度。

(3)分別利用符號秩檢驗,比較一下決策樹與樸素貝葉斯之間、決策樹與k近鄰分類演算法之間、樸素貝葉斯與k近鄰分類演算法之間是否存在顯著性差異,其中給定的顯著性水平為0.05.

資料集見

我的資源-演算法效能的比較資料集

# -*- coding: utf-8 -*-

"""created on thu nov 26 23:53:07 2020

@author: 麥地

"""import os

import re

import numpy as np

import pandas as pd

import scipy.stats as stats

from sklearn.model_selection import kfold

from sklearn.*****_bayes import gaussiannb

from sklearn.tree import decisiontreeclassifier

from sklearn.neighbors import kneighborsclassifier

#讀取資料檔案,將其儲存在列表中

frames=

path=r'c:\users\desktop\data mining\資料評價\data'

for data_path in os.listdir(path)

:"/"

+data_path)

#資料轉換,將類標籤轉換為數值,防止後續異常

for i in frames:

data=pd.read_csv(i)

data_op=pd.categorical(data[data.columns[-1

]]) data[data.columns[-1

]]=data_op.codes

#資料集劃分

x=data.iloc[:,

:-1]

y=data.iloc[:,

-1] kf = kfold(n_splits=5)

#三種演算法準確率

bayesauc=

0 dessiontreeauc=

0 knnauc=

0for train_index,test_index in kf.split(x)

: x_train=x.iloc[train_index]

y_train=y.iloc[train_index]

x_test =x.iloc[test_index]

y_test =y.iloc[test_index]

#利用貝葉斯**

gnb=gaussiannb(

) bayes_pred=gnb.fit(x_train,y_train)

#擬合 pred_bayes=bayes_pred.predict(x_test)

#** y_score_bayes=np.array(pred_bayes)

correct_score_bayes=

(y_score_bayes==y_test)

.sum()

bayesauc+=

100*correct_score_bayes/y_test.shape[0]

#用正確的**數量比總數量得到**精度

#利用決策樹**

clf=decisiontreeclassifier(

) clf = clf.fit(x_train,y_train)

#擬合 pred_tree=clf.predict(x_test)

#** y_score_tree=np.array(pred_tree)

correct_score_tree=

(y_score_tree==y_test)

.sum()

dessiontreeauc+=

100*correct_score_tree/y_test.shape[0]

#聚類組數:類別標籤不同的數目,即len(data[data.columns[-1]].unique())

knn=kneighborsclassifier(n_neighbors=

len(data[data.columns[-1

]].unique())

) knn.fit(x_train,y_train)

pred_knn=knn.predict(x_test)

#** y_score_knn=np.array(pred_knn)

correct_score_knn=

(y_score_knn==y_test)

.sum()

knnauc+=

100*correct_score_knn/y_test.shape[0]

#進行精度輸出

bayesauc/=

5 dessiontreeauc/=

5 knnauc/=

5 data_name=re.findall(r"/(.*?).dat"

,i)print

("="*70

)print

("在{}資料集上三種演算法的效果如下:"

.format

(data_name[0]

[5:]

))print

("貝葉斯分類精度為:%"

.format

(bayesauc)

)print

("決策樹分類精度為:%"

.format

(dessiontreeauc)

)print

("k近鄰分類精度為:%"

.format

(knnauc)

)#進行符號秩檢驗

print

("在{}資料集上三種演算法的顯著性差異度量如下:"

.format

(data_name[0]

[5:]

))#貝葉斯與決策樹

w1=stats.wilcoxon(pred_bayes,pred_tree,correction=

true

,alternative=

'greater')if

(w1.pvalue<

0.05):

print

("貝葉斯與決策樹的p=<0.05,因此認為兩者有顯著性差異"

.format

(w1.pvalue)

)else

:print

("貝葉斯與決策樹的p=>=0.05,因此認為兩者無顯著性差異"

.format

(w1.pvalue)

)#貝葉斯與k近鄰

w2=stats.wilcoxon(pred_knn,pred_bayes,correction=

true

,alternative=

'greater'

,zero_method=

'zsplit')if

(w2.pvalue<

0.05):

print

("貝葉斯與k近鄰的p=<0.05,因此認為兩者有顯著性差異"

.format

(w2.pvalue)

)else

:print

("貝葉斯與k近鄰的p=>=0.05,因此認為兩者無顯著性差異"

.format

(w2.pvalue)

)#決策樹與k近鄰

w3=stats.wilcoxon(pred_knn,pred_tree,correction=

true

,alternative=

'greater')if

(w3.pvalue<

0.05):

print

("決策樹與k近鄰的p=<0.05,因此認為兩者有顯著性差異"

.format

(w3.pvalue)

)else

:print

("決策樹與k近鄰的p=>=0.05,因此認為兩者無顯著性差異"

.format

(w3.pvalue)

)

樸素貝葉斯

樸素貝葉斯演算法是一種基於概率統計的分類方法,它主要利用貝葉斯公式對樣本事件求概率,通過概率進行分類。以下先對貝葉斯公式做個了解。對於事件a b,若p b 0,則事件a在事件b發生的條件下發生的概率為 p a b p a b p b 將條件概率稍作轉化即可得到貝葉斯公式如下 p a b p b a ...

樸素貝葉斯

1.準備資料 從文字中構建詞向量 2.訓練演算法 從詞向量計算概率 3.測試演算法 儲存為 bayes.py 檔案 參考 coding utf 8 from numpy import 文字轉化為詞向量 def loaddataset postinglist my dog has flea probl...

樸素貝葉斯

機器學習是將資料轉化為決策面的過程 scikit learn縮寫為sklearn 訓練乙個分類器,學習之後 其處理的準確性 def nbaccuracy features train,labels train,features test,labels test from sklearn.bayes ...