機器學習分類實例——SVM
20180423-20180426學習筆記html
25去首屆數字中國會展參觀了,沒學習。(想偷懶)因爲是最後一天,感受展出的東西少了,由於24號閉幕了。。。可是能夠去體驗區。主要體驗了VR,其餘展出的東西要麼沒意思,要麼看不懂,馬雲馬化騰他們來的時候,我由於要開會,沒去看。失去了找他們要簽名的機會,唉。算法
1、工做
主要是學習分類器的一些理論,經過實踐,最終得出告終果,雖然結果沒那麼完美,到底怎麼不完美,下面會提到。apache
1.1學習理論:
由於對這方面的知識,僅限於本科階段的「人工智能」與「數據挖掘」課程中瞭解一些,應付考試用。因此真的要運用起來,還真是麻煩。雖然說不用理解每一個公式,每一個數字的含義,可是對整個模型「輸入什麼」、「輸出什麼」、「作什麼」、「核心思想」等仍是須要理解的。 知乎中的高票答案一答主「簡之」,把SVM模型的各個部分進行了形象生動的比喻數組
再以後,無聊的大人們,把這些球叫作 「data」,把棍子 叫作 「classifier」, 最大間隙trick 叫作「optimization」, 拍桌子叫作「kernelling」, 那張紙叫作「hyperplane」。app
經過他的描述,SVM的運行機制能夠有個大致的理解。機器學習
高票答案二答主「靠靠靠譜」,則進一步詳細地介紹了整個模型。由「蘋果香蕉」的分類問題,引出SVM的原理,以及其中各個參數的介紹,寫得也很好。函數
知乎連接:支持向量機(SVM)是什麼意思?學習
1.2學習實例:
看了理論,仍是挺懵的。本次畢設是採用scikit-learn v0.19.1。去官方查詢文檔,看如何設置參數、調用函數、輸入輸出格式等。測試
官方文檔:Support Vector Machines、中文文檔:支持向量機, SVM(不用看中文也能明白意思,但一些參數仍是沒法理解)優化
搜索到一篇博客,寫得很好:Python中的支持向量機SVM的使用(有實例) 文中詳細地寫了各個參數意義,逐步按照博主的步驟,就能正確分類,並繪出圖。 還挺漂亮:
可是我要作的多維特徵,因此這種「二特徵」繪圖不適合我。(老師要求最後用圖表來表示判別結果,可是具體怎麼表示還沒想清楚)
1.3開始編碼:
讀取文件"test.txt",裏面存儲的是一系列特徵以及三個label值。在個人「非民主相關帖子處理」有test.txt的樣式,裏面是200個特徵以及3個label值。
(1)導入須要的包
import numpy as np from sklearn.svm import SVC from sklearn.cross_validation import train_test_split from sklearn.metrics import classification_report
(2)讀取文件並存儲
with open("test.txt","r") as file: ty=-3 #表明取哪一列label值,-1表明取倒一列全部值 result=[] for line in file.readlines(): result.append(list(map(str,line.strip().split(',')))) vec = np.array(result) x = vec[:,:-3]#取除掉最後三列之外的全部列,即全部特徵列 y = vec[:,ty]#標籤列
(3)劃分測試集及訓練集
train_x,test_x,train_y,test_y = train_test_split(x,y,test_size=0.2)
(4)模型訓練及預測
clf = SVC(kernel='linear',C=0.4) clf.fit(train_x,train_y) pred_y = clf.predict(test_x) print(classification_report(test_y,pred_y))
其中Kernel在參考文檔中有介紹,常數C是靠經驗得出的數值,並無具體的公式。不過有關於它設置的一些意義。知乎答主「顧凌峯」是這樣介紹C的:
原則上C能夠根據須要選擇全部大於0的數。 C越大表示整個優化過程當中對於總偏差的關注程度越高,對於減少偏差的要求越高,甚至不惜使間隔減少。
- 當C趨於無窮大時,這個問題也就是不容許出現分類偏差的樣本存在,那這就是一個hard-margin
- SVM問題當C趨於0時,咱們再也不關注分類是否正確,只要求間隔越大越好,那麼咱們將沒法獲得有意義的解且算法不會收斂。
知乎連接:關於SVM中,對常數C的理解?
(5)訓練結果分析
關於函數「classification_report(test_y,pred_y)」介紹以及precision/recall/f1-score的具體含義,詳見兩篇博客
簡單來講就是:
(6)測試文本分析
- 任務是輸入一段文本,用jieba找出關鍵詞,把關鍵詞數量選大一些,儘可能覆蓋全文。<font color=red>(此處用關鍵詞仍是用分詞存疑)</font>
- 而後再和關鍵詞庫比對,獲得該文本的特徵向量
代碼比較簡單,和以前的相似:
from openpyxl import load_workbook from openpyxl import Workbook import jieba.analyse wr=load_workbook('sta.xlsx') osheet=wr.active orow=osheet.max_row print(orow) testL=[] num=200 tempc=0 for i in osheet["A"]: if tempc<num: testL.append(i.value) else: break tempc=tempc+1 with open("example.txt","r") as f: ftxt=f.read() print(ftxt) content=ftxt keywords=jieba.analyse.extract_tags(content,topK=1000) print(keywords) L3=[] L2=[] flag=False print(testL) L2=[] for g in testL: flag=False for i in keywords: if g==i: flag=True break if flag: L2.append(1) else: L2.append(0) print(L2) file=open('examout.txt','w') file.write(str(L2).strip('[').strip(']')) file.close()
從example.txt中的一段文字文本,最終變成examout.txt中的特徵值
(7) 文本特徵測試
f = open("examout.txt","r") newl =f.read() newl=list(map(str,newl.strip().split(','))) newv = np.array(newl) new_test_x = newv[:] print(new_test_x) new_pred_y = clf.predict(new_test_x.reshape(1,-1)) print(new_pred_y)
輸出結果:
要注意,咱們是對單列進行測試。上文中
ty=-3 y = vec[:,ty]
表示的是,只對倒數第三列,也就是第一個子話題「民主制度」進行訓練。對該文本進行判別,得出的是其在「民主制度」標籤下的評分——5分,看來很相關
個人評分制度是1-5,1爲不相關,5爲很相關。
注意到函數「clf.predict(new_test_x.reshape(1,-1))」,該函數接收的必須是一個二維數組。而特徵向量只有一維,因此須要reshape(1,-1)進行轉換不然會報錯
一點說明:這裏只進行了少部分文本的測試,大量文本測試還尚需時日。
2、總結反思
- 實現了SVM並對其有了必定了解,可是內部原理,因爲沒有時間看相關論文,因此仍是不是很懂,畢設作完,在寫論文的時候能夠多查查相關材料。
- 對scilearn的使用有了比較淺顯地理解,並能夠熟練地讀取文本及表格
- SVM和DecisionTree表現尚可,可是樸素貝葉斯的分類效果就比較差了。。。(三個分類均已作完、限於篇幅只寫了SVM,剩下的分類過兩天寫)
3、接下來的任務
怎麼將結果展現出來?該展現那些內容?採用哪一種形式?
由於要作三種分類準確度的對比,因此先學習一下Python的表格繪製吧。明天要給學長學姐展現到目前爲止所作的工做。