樸素貝葉斯(Naive Bayes Classifier)是一種「天真」的算法(假定全部特徵發生機率是獨立的),同時也是一種簡單有效的經常使用分類算法。關於它的原理,參見樸素貝葉斯分類器的應用。
scikit-learn是一個普遍應用的機器學習Python庫,它封裝了包括樸素貝葉斯在內的若干基礎算法。在這篇博客裏,咱們但願用樸素貝葉斯實現對短文本(新聞標題)的分類。
樸素貝葉斯屬於有監督分類,須要獲取一批已標註的數據做爲訓練和測試分類器的樣本。樣本的獲取,通常經過人工標註或網頁抓取的方式。這裏先準備好2w條已標註的新聞標題(共10個標籤,每一個標籤下的樣本是均衡的),並以3:1的比例切分訓練集和測試集。文本的格式以下:html
娛樂\t組圖:劉亦菲短裙秀腿 濃妝變冷豔時髦女python
其次,將短文本轉化爲一個多維向量,這涉及到兩個問題:一是分詞,因爲scikit-learn內置的分詞器並不支持中文,因此須要指定一個tokenizer(推薦結巴分詞);二是文本到向量的轉化方法,考慮到後續可能加大訓練集的數量,而短文本的特徵相對稀疏,採用了內存佔用率較低、僅計算詞頻的HashingVectorizer
。git
這裏要注意兩點:
- 測試集和訓練集只有共用一個vectorizer
才能共享vocabulary
,避免特徵表達不一致的問題。
- fit_transform
若是用toarray()
轉化爲dense矩陣,計算至少慢兩倍以上。github
python# non_negative=True -- 模型僅包含非負值 vectorizer = HashingVectorizer(tokenizer=comma_tokenizer, non_negative=True) train_data = vectorizer.fit_transform(train_words) test_data = vectorizer.fit_transform(test_words)
而後,咱們建立一個多項式的樸素貝葉斯分類器(適用於離散特徵的分類),分別輸入訓練集的文本和標籤(要求都爲numpy矩陣)進行訓練,訓練好的分類器再用在測試集文本的分類,以檢驗分類器的性能。算法
python# alpha -- 模型的平滑參數 clf = MultinomialNB(alpha=0.01) clf.fit(train_data, numpy.asarray(train_tags)) pred = clf.predict(test_data)
最後,比較分類器的預測結果和測試集的真實標籤,獲得分類器的準確率和召回率。機器學習
pythonm_precision = metrics.precision_score(actual, pred) m_recall = metrics.recall_score(actual, pred)
完整代碼請見sci_classifier.py。
從測試的結果來看,準確率和召回率均在8成以上,固然,分類器的性能也依賴於輸入數據對應不一樣類別的可識別度是否足夠強。性能