Python 文本分類:使用scikit-learn 機器學習包進行文本分類

我做的項目是對評論進行有用性(helpfulness)分類,把評論分成有用和沒用兩類。在之前已經有使用機器學習方法進行情感分類了,現在是提取各種可能影響評論有用性的特徵之後對文本進行分類。
我分析的數據是手機商品評論,看看我提取了些什麼特徵(特徵和情感分類的特徵不一樣了。情感分類使用的是詞來做特徵,但這裏用的是已經計算出的各項數值作爲特徵)。
我提取了(一條評論中的)1.手機名字出現次數;2. 手機品牌出現次數;3. 手機的屬性(如屏幕、速度、拍照等);4. 評論的詞數;5. 評論的句子數;6. 形容詞數;7. 副詞數;8. 動詞數;9. 平均每句的詞數;10. 信息熵;11. 困惑值;12. 積極情感概率;13. 消極情感概率;14. 積極詞典匹配總分值;15. 消極情感匹配總分值;16. 積極分值的均值;17. 積極分值的方差;18. 消極分值均值;19. 消極分值方差;20. 評論與商品描述之間的tf-idf 相似度。
這20個數值特徵用來幫助我進行評論有用性的分類。因爲我假設這20個特徵都能有效識別一條評論是否是“有用的”
要進行有監督的機器學習,就還需要爲每條評論添加類標籤,類標籤既這條評論是“有用”或“沒用”。這個可以人工標註的方法來標註,既人爲的閱讀評論然後標註評論。把“有用”標記爲“1”,把“沒用”標記爲“0”
在提取了特徵和類標籤之後存儲在txt 文檔中,形式如下:
Python 文本挖掘:使用scikit-learn 機器學習包進行文本分類 - rzcoding - Explore in Data

第一列爲類標籤,既表示“有用”的“1”和表示“沒用”的“0”。其它的列都是提取出來的分類特徵。

========================================================================

接下來就可以把數據導入Python,然後使用scikit-learn 進行分類了。但使用scikit-learn ,需要先了解一點關於numpy 的知識。因爲scikit-learn 進行機器學習時的數據的類型是numpy 的矩陣結構。
其實要了解的主要是numpy 的矩陣取值方式,這個網站有非常清楚的圖,我直接拿來用了。
Python 文本挖掘:使用scikit-learn 機器學習包進行文本分類 - rzcoding - Explore in Data
 
numpy 矩陣a有56個元素,取值從0到55。可以看到不同的索引切片方式可以怎麼取到不同的值。
其切片形式主要爲:矩陣[ 第n:第m, 第p:第q列 ]

一、現在可以把特徵和類標籤的數據導入Python了。

import numpy as np

f = open('D:/code/Machine Learning/features.txt')

f.readline() data = np.loadtxt(f) #把數據載入Python 之後,用numpy 的數據類型存儲起來


二、用隨機函數打亂數據,防止分類的時候重複訓練測測試一樣的數據。

from random import shuffle

shuffle(data)


三、把數據分割爲開發集和測試集。

development = data[:4000,:] #4000個數據作爲開發集 test = data[4000:,:] #剩餘的小部分數據作爲測試集

train = development[:,1:] tag = development[:, 0] #第一列是類標籤


四、載入分類算法,把分類算法傳遞給一個變量。

import sklearn from sklearn import svm from sklearn.linear_model import LogisticRegression from sklearn.naive_bayes import GaussianNB

svc = svm.SVC(gamma=0.001, C=100.)

lr = LogisticRegression(penalty='l1', tol=0.01)

gnb = GaussianNB()


五、使用交叉檢驗的方法測試分類器的準確度。
交叉檢驗簡單來說就是把數據平均分成n 份,其中n-1 份作爲訓練集,1份作爲測試集,得出一個分類精度。重複n 次,得出n 個分類精度。然後n 次分類精度的平均精度就是最終的分類準確度。
具體如圖所示(5折交叉檢驗):
Python 文本挖掘:使用scikit-learn 機器學習包進行文本分類 - rzcoding - Explore in Data
 
使用交叉檢驗可以有效消除一次檢驗所帶來的波動,得出比較合理的分類準確度。

from sklearn import cross_validation

kfold = cross_validation.KFold(len(x1), n_folds=10)

此處使用的是10折交叉檢驗,既把數據分成10份,其中9份爲訓練集,1份爲測試集。重複10次。

六、使用交叉檢驗測試不同分類器的準確率。

svc_accuracy = cross_validation.cross_val_score(svc, train, tag, cv=kfold)

lr_accuracy = cross_validation.cross_val_score(lr, train, tag, cv=kfold)

gnb_accuracy = cross_validation.cross_val_score(gnb, train, tag, cv=kfold)

print 'SVM average accuary: %f' %svc_accuracy.mean()

print 'LogisticRegression average accuary: %f' %lr_accuracy.mean()

print 'Naive Bayes average accuary: %f' %gnb_accuracy.mean()

結果如下:

SVM average accuary: 0.877000 Logisic regression average accuracy: 0.734333 Naive Bayes average accuracy: 0.686333


接下來還有:
除了準確率這一個分類器效果檢驗指標之外,還有ROC曲線和AUC(ROC曲線下的面積)。這兩個指標也可以檢驗分類器效果。這兩個指標用scikit-learn 也不難實現。
選擇最佳分類器之後用測試集檢驗其最終分類效果。
使用最佳分類器進行分類。
使用不同的特徵組合進行分類,尋找最優的特徵組合。最優特徵組合是對分類識別率最高的因素
發佈了8 篇原創文章 · 獲贊 18 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章