用scikit-learn實現樸素貝葉斯分類器
樸素貝葉斯(Naive Bayes Classifier)是一種「天真」的算法(假定所有特征發生概率是獨立的),同時也是一種簡單有效的常用分類算法。關于它的原理,參見樸素貝葉斯分類器的應用。
scikit-learn是一個廣泛應用的機器學習Python庫,它封裝了包括樸素貝葉斯在內的若干基礎算法。在這篇博客里,我們希望用樸素貝葉斯實現對短文本(新聞標題)的分類。
樸素貝葉斯屬于有監督分類,需要獲取一批已標注的數據作為訓練和測試分類器的樣本。樣本的獲取,可通過人工標注或網頁抓取的方式。這里先準備好2w條已標注的新聞標題(共10個標簽,每個標簽下的樣本是均衡的),并以3:1的比例切分訓練集和測試集。文本的格式如下:
娛樂\t組圖:劉亦菲短裙秀腿 濃妝變冷艷時髦女
其次,將短文本轉化為一個多維向量,這涉及到兩個問題:一是分詞,由于scikit-learn內置的分詞器并不支持中文,所以需要指定一個tokenizer(推薦結巴分詞);二是文本到向量的轉化方法,考慮到后續可能加大訓練集的數量,而短文本的特征相對稀疏,采用了內存占用率較低、僅計算詞頻的HashingVectorizer。值得注意的是,測試集需要和訓練集共用一個向量轉化器。
# non_negative=True -- 模型僅包含非負值 vectorizer = TfidfVectorizer(tokenizer=comma_tokenizer, non_negative=True) train_data = vectorizer.fit_transform(train_words) test_data = vectorizer.fit_transform(test_words)
然后,我們創建一個多項式的樸素貝葉斯分類器(適用于離散特征的分類),分別輸入訓練集的文本和標簽(要求都為numpy矩陣)進行訓練,訓練好的分類器再用在測試集文本的分類,以檢驗分類器的性能。
# alpha -- 模型的平滑參數 clf = MultinomialNB(alpha=0.01) clf.fit(train_data, numpy.asarray(train_tags)) pred = clf.predict(test_data)
最后,比較分類器的預測結果和測試集的真實標簽,得到分類器的準確率和召回率。
m_precision = metrics.precision_score(actual, pred) m_recall = metrics.recall_score(actual, pred)
完整代碼請見sci_classifier.py。
從測試的結果來看,準確率和召回率均在8成以上,性能除了和分類器有關,也依賴于輸入數據對應不同類別的特征是否足夠明顯。
來自:建造者說