機器學習分類實例(sklearn)——SVM

機器學習分類實例——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的表格繪製吧。明天要給學長學姐展現到目前爲止所作的工做。

相關文章
相關標籤/搜索