訂閱
糾錯(cuò)
加入自媒體

基于樸素貝葉斯自動(dòng)過(guò)濾垃圾廣告

交叉訓(xùn)練

交叉訓(xùn)練簡(jiǎn)單點(diǎn)說(shuō)就是在同一份樣本中選擇部分作為測(cè)試樣本,剩余的作為訓(xùn)練樣本。這里一共有5574條數(shù)據(jù),抽取1000條作為測(cè)試樣本(testdata)

trainset = [i for i in range(len(txt_class))]

testset = []

testclass = []

for i in range(1000):

number = int(random.choice(trainset))

testset.a(chǎn)ppend(words_vec(dataset[number], wordlist))

testclass.a(chǎn)ppend(txt_class[number])

trainset.remove(number)

trainMat = [];

trainclass = []

for i in trainset:

trainMat.a(chǎn)ppend(words_vec(dataset[i], wordlist))

trainclass.a(chǎn)ppend(txt_class[i])

在這段代碼中,trainset是訓(xùn)練樣本的編號(hào),testset是測(cè)試樣本的數(shù)據(jù)集,testclass表示測(cè)試樣本是否為垃圾廣告,trainmat是訓(xùn)練樣本數(shù)據(jù)集,trainclass表示訓(xùn)練樣本是否為垃圾廣告。

構(gòu)造訓(xùn)練器

現(xiàn)在來(lái)計(jì)算P(y1|x),P(y2|x)

def train(trainmatrix,traincategory):

numword=len(trainmatrix[0])

numtrain=len(trainmatrix)

pa=sum(traincategory)/float(len(trainmatrix))

p0num,p1num=ones(numword),ones(numword)

p0dem,p1dem=2.0,2.0

for i in range(numtrain):

if traincategory[i]==1:

p1num+=trainmatrix[i]

p1dem+=sum(trainmatrix[i])

else:

p0num+=trainmatrix[i]
          p0dem+=sum(trainmatrix[i])

p1vect= log(p1num / p1dem)

p0vect = log(p0num / p0dem)

return p1vect,p0vect,pap0num,p1num表示在類別0和類別1下各個(gè)單詞出現(xiàn)的總數(shù);p1dem,p0dem表示類別0和類別1的單詞總數(shù);p0vect和p1vect代表P(xi|y0)以及P(xi|y1);這里進(jìn)行Log變化避免下溢;同時(shí)進(jìn)行了拉普拉斯平滑處理,即p0num,p1num的初始變量為ones()。p1dem,p0dem則為2(一共有兩種結(jié)果,垃圾廣告和有用廣告,所以為2)

構(gòu)造分類器

def classify(vec,p0vec,p1vec,pclass1):

p1=sum(vec*p1vec)+log(pclass1)

p0=sum(vec*p0vec)+log(1.0-pclass1)

if p1>p0:

return 1

else:

return 0

驗(yàn)證訓(xùn)練模型精確度

由于在進(jìn)行交叉訓(xùn)練時(shí)測(cè)試樣本是隨機(jī)抽取的,所以訓(xùn)練準(zhǔn)確度一直都不一樣,為了讓結(jié)果具有代表性,再構(gòu)造一個(gè)循環(huán),進(jìn)行n次訓(xùn)練,取誤差的平均值。

def mul(num):

totalerror = 0

for times in range(num):

#通過(guò)交叉訓(xùn)練獲得訓(xùn)練樣本和測(cè)試樣本

p1vect, p0vect, pa = train(trainMat, trainclass)

error=0

for i in range(len(testset)):

if classify(array(testset[i]), p0vect, p1vect, pa) 。 testclass[i]:

error += 1

print('the accurate is', 1 - error / float(len(testset)))

totalerror+=error / float(len(testset))

print('after %d times the accurate of bayes is %f'%(num,1-float(totalerror)/num))

這個(gè)模型的準(zhǔn)確度還是非常高的,平均精確度達(dá)到93.64%。

詞袋模型

請(qǐng)大家思考一個(gè)問(wèn)題,在垃圾廣告中有沒(méi)有一些詞會(huì)頻繁提到呢?如果頻繁的出現(xiàn)這個(gè)詞,是不是代表這則廣告為垃圾廣告的概率要增加?現(xiàn)在為止只是將某一個(gè)詞語(yǔ)是否出現(xiàn)當(dāng)作一個(gè)特征,這被稱為詞集模型。如果一個(gè)詞出現(xiàn)次數(shù)不止一次,將它出現(xiàn)的次數(shù)作為一個(gè)特征就稱為詞袋模型。這兩個(gè)模型的不同點(diǎn)在于詞語(yǔ)出現(xiàn)與否和出現(xiàn)次數(shù),將函數(shù)word_vec稍稍修改即可:

def words_vec(txt,wordlist):

returnvec=[0]*len(wordlist)

for word in txt:

if word in wordlist:

returnvec[list(wordlist).index(word)]=1+returnvec[list(wordlist).index(word)]

return returnvec

基于詞袋模型的平均準(zhǔn)確度高達(dá)93.63%;盡管比詞集模型小了0.01%;但是其中一個(gè)準(zhǔn)確率達(dá)到了95.5%;兩個(gè)模型都是很不錯(cuò)的呢。

如果是中文的話使用jieba就可以分詞噢。

<上一頁(yè)  1  2  
聲明: 本文由入駐維科號(hào)的作者撰寫,觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

人工智能 獵頭職位 更多
掃碼關(guān)注公眾號(hào)
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯(cuò)
x
*文字標(biāo)題:
*糾錯(cuò)內(nèi)容:
聯(lián)系郵箱:
*驗(yàn) 證 碼:

粵公網(wǎng)安備 44030502002758號(hào)