基于樸素貝葉斯自動過濾垃圾廣告
交叉訓練
交叉訓練簡單點說就是在同一份樣本中選擇部分作為測試樣本,剩余的作為訓練樣本。這里一共有5574條數據,抽取1000條作為測試樣本(testdata)
trainset = [i for i in range(len(txt_class))]
testset = []
testclass = []
for i in range(1000):
number = int(random.choice(trainset))
testset.append(words_vec(dataset[number], wordlist))
testclass.append(txt_class[number])
trainset.remove(number)
trainMat = [];
trainclass = []
for i in trainset:
trainMat.append(words_vec(dataset[i], wordlist))
trainclass.append(txt_class[i])
在這段代碼中,trainset是訓練樣本的編號,testset是測試樣本的數據集,testclass表示測試樣本是否為垃圾廣告,trainmat是訓練樣本數據集,trainclass表示訓練樣本是否為垃圾廣告。
構造訓練器
現在來計算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下各個單詞出現的總數;p1dem,p0dem表示類別0和類別1的單詞總數;p0vect和p1vect代表P(xi|y0)以及P(xi|y1);這里進行Log變化避免下溢;同時進行了拉普拉斯平滑處理,即p0num,p1num的初始變量為ones()。p1dem,p0dem則為2(一共有兩種結果,垃圾廣告和有用廣告,所以為2)
構造分類器
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
驗證訓練模型精確度
由于在進行交叉訓練時測試樣本是隨機抽取的,所以訓練準確度一直都不一樣,為了讓結果具有代表性,再構造一個循環,進行n次訓練,取誤差的平均值。
def mul(num):
totalerror = 0
for times in range(num):
#通過交叉訓練獲得訓練樣本和測試樣本
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))
這個模型的準確度還是非常高的,平均精確度達到93.64%。

詞袋模型
請大家思考一個問題,在垃圾廣告中有沒有一些詞會頻繁提到呢?如果頻繁的出現這個詞,是不是代表這則廣告為垃圾廣告的概率要增加?現在為止只是將某一個詞語是否出現當作一個特征,這被稱為詞集模型。如果一個詞出現次數不止一次,將它出現的次數作為一個特征就稱為詞袋模型。這兩個模型的不同點在于詞語出現與否和出現次數,將函數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
基于詞袋模型的平均準確度高達93.63%;盡管比詞集模型小了0.01%;但是其中一個準確率達到了95.5%;兩個模型都是很不錯的呢。

如果是中文的話使用jieba就可以分詞噢。
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
- 1 AI狂歡遇上油價破百,全球股市還能漲多久? | 產聯看全球
- 2 OpenAI深夜王炸!ChatGPT Images 2.0實測:中文穩、細節炸,設計師慌了
- 3 6000億美元估值錨定:字節跳動的“去單一化”突圍與估值重構
- 4 Tesla AI5芯片最新進展總結
- 5 連夜測了一波DeepSeek-V4,我發現它可能只剩“審美”這個短板了
- 6 熱點丨AI“瑜亮之爭”:既生OpenClaw,何生Hermes?
- 7 AI界的殺豬盤:9秒刪庫跑路,全員被封號,還繼續扣錢!
- 8 2026,人形機器人只贏了面子
- 9 DeepSeek降價90%:價格屠夫不是身份,是戰略
- 10 AI Infra產業鏈卡在哪里了?


分享













