sklearn.feature_extraction.text提供了4種文本特征提取方法:
- CountVectorizer
- HashingVectorizer
- TfidfTransformer
-
TfidfVectorizer
因為TfidfVectorizer等價于CountVectorizer->TfidfTransformer,是以實質上就是兩種特征,一種是HashingVector,另一種則是Tfidf特征。
每一類都是由題目組成,但是每個題目長度都不長,分詞篩選後也隻剩下幾個關鍵詞,是以計算各個詞的tf的時候結果基本都是1/題目分詞數,是以我便想着能不能計算出每一類的各個詞的tf,而不是對單獨的每個題目計算tf。
是以我将同一類的所有題目分詞都組合到一個文檔,這樣就可以在同一類上計算詞頻tf,而不是在每個題目上面單獨計算。
首先根據tf值排序做詞典篩選:
初始詞典中詞的數目為7000。
實驗采用
model = OneVsRestClassifier(svm.SVC(kernel=’linear’))模型進行實驗。
特征提取采用了tf-idf和tf兩種,tf-idf在tf的基礎上加入了逆文檔詞頻idf。
f1-macro,f1-micro,f1-sample分别是應用于多标簽分類的評價标準,評價的基本标準依然是f1值,隻是計算方式有所不同。
-
首先在tf-idf提取的特征下進行不同詞數的實驗,從中可以看到
在1000維的時候f1-macro和f1-sample準确率達到最高,說明特征并不是越多越好,隻要有足夠多的具有區分能力的特征就夠了。
500維的時候效果和1000維相差不大。
- 接着進行了tf-idf和tf兩種特征提取方式的比較。從結果可以看出不采用idf時的效果要好,我個人認為這是由樣本不均衡問題造成的結果,因為訓練集中有些類的樣本很多,有些則很少,對于樣本少的類别,在計算tf值的時候因為隻需要考慮本類樣本,是以受不均衡問題的影響較小,但加入idf時,因為将所有訓練樣本都加入考慮,是以會造成準确率的影響。
詞典中的詞數 | 100 | 500 | 1000 | 3000 | 5000 |
---|---|---|---|---|---|
f1-macro(tf-idf) | 0.8066 | 0.8387 | 0.8410 | 0.8196 | 0.8112 |
f1-micro(tf-idf) | 0.8693 | 0.9004 | 0.9000 | 0.8736 | 0.8643 |
f1-sample(tf-idf) | 0.8838 | 0.9170 | 0.9173 | 0.8924 | 0.8830 |
f1-macro(tf) | 0.8027 | 0.8572 | 0.8553 | ||
f1-micro(tf) | 0.8723 | 0.9088 | 0.9105 | ||
f1-sample(tf) | 0.8846 | 0.9257 | 0.9269 |
在取1000維詞的基礎上進行了以下實驗:
在最初的時候我對題目tf的計算進行了改動,接下來我測試了不改動的tf特征,此時tf的計算是在每一道題目上單獨進行。
00266367
65168539
09187254
詞典中的詞數 | 每類上計算tf | 每個文檔上計算tf |
---|---|---|
f1-macro(tf-idf) | 0.8553 | 0.8533 |
f1-micro(tf-idf) | 0.9105 | 0.9078 |
f1-sample(tf-idf) | 0.9269 | 0.9254 |