keras 的svm做分類


SVC繼承了父類BaseSVC

SVC類主要方法:

★__init__() 主要參數:

C: float參數 默認值為1.0

錯誤項的懲罰系數。C越大,即對分錯樣本的懲罰程度越大,因此在訓練樣本中准確率越高,但是泛化能力降低,也就是對測試數據的分類准確率降低。相反,減小C的話,容許訓練樣本中有一些誤分類錯誤樣本,泛化能力強。對於訓練樣本帶有噪聲的情況,一般采用后者,把訓練樣本集中錯誤分類的樣本作為噪聲。

kernel: str參數 默認為‘rbf’

算法中采用的核函數類型,可選參數有:

‘linear’:線性核函數

‘poly’:多項式核函數

‘rbf’:徑像核函數/高斯核

‘sigmod’:sigmod核函數

‘precomputed’:核矩陣

具體這些核函數類型,請參考上一篇博客中的核函數。需要說明的是,precomputed表示自己提前計算好核函數矩陣,這時候算法內部就不再用核函數去計算核矩陣,而是直接用你給的核矩陣。核矩陣為如下形式:

還有一點需要說明,除了上面限定的核函數外,還可以給出自己定義的核函數,其實內部就是用你自己定義的核函數來計算核矩陣。

degree:int型參數 默認為3

這個參數只對多項式核函數有用,是指多項式核函數的階數n

如果給的核函數參數是其他核函數,則會自動忽略該參數。

gamma:float參數 默認為auto

核函數系數,只對‘rbf’,‘poly’,‘sigmod’有效。

如果gamma為auto,代表其值為樣本特征數的倒數,即1/n_features.

coef0:float參數 默認為0.0

核函數中的獨立項,只有對‘poly’和‘sigmod’核函數有用,是指其中的參數c

probability:bool參數 默認為False

是否啟用概率估計。 這必須在調用fit()之前啟用,並且會fit()方法速度變慢。

shrinking:bool參數 默認為True

是否采用啟發式收縮方式

tol: float參數  默認為1e^-3

svm停止訓練的誤差精度

cache_size:float參數 默認為200

指定訓練所需要的內存,以MB為單位,默認為200MB。

class_weight:字典類型或者‘balance’字符串。默認為None

給每個類別分別設置不同的懲罰參數C,如果沒有給,則會給所有類別都給C=1,即前面參數指出的參數C.

如果給定參數‘balance’,則使用y的值自動調整與輸入數據中的類頻率成反比的權重。

verbose :bool參數 默認為False

是否啟用詳細輸出。 此設置利用libsvm中的每個進程運行時設置,如果啟用,可能無法在多線程上下文中正常工作。一般情況都設為False,不用管它。

max_iter :int參數 默認為-1

最大迭代次數,如果為-1,表示不限制

random_state:int型參數 默認為None

偽隨機數發生器的種子,在混洗數據時用於概率估計。

★fit()方法:用於訓練SVM,具體參數已經在定義SVC對象的時候給出了,這時候只需要給出數據集X和X對應的標簽y即可。

★predict()方法:基於以上的訓練,對預測樣本T進行類別預測,因此只需要接收一個測試集T,該函數返回一個數組表示個測試樣本的類別。

★屬性有哪些:

svc.n_support_:各類各有多少個支持向量

svc.support_:各類的支持向量在訓練樣本中的索引

svc.support_vectors_:各類所有的支持向量

 

# -*- coding:utf-8 -*-

from sklearn.svm import SVC

import matplotlib.pyplot as plt

import numpy as np

X=np.array([[1,1],[1,2],[1,3],[1,4],[2,1],[2,2],[3,1],[4,1],[5,1],

       [5,2],[6,1],[6,2],[6,3],[6,4],[3,3],[3,4],[3,5],[4,3],[4,4],[4,5]])

Y=np.array([1]*14+[-1]*6)

T=np.array([[0.5,0.5],[1.5,1.5],[3.5,3.5],[4,5.5]])

svc=SVC(kernel='poly',degree=2,gamma=1,coef0=0)

svc.fit(X,Y)

pre=svc.predict(T)

print pre

print svc.n_support_

print svc.support_

print svc.support_vectors_

運行結果:

[ 1  1 -1 -1]      #預測結果

[2 3]            #-1類和+1類分別有2個和3個支持向量

[14 17  3  5 13] #-1類支持向量在元訓練集中的索引為14,17,同理-1類支持向量在元訓練集中的索引為3,5,13

[[ 3.  3.]    #給出各支持向量具體是哪些,前兩個是-1類的

 [ 4.  3.]

 [ 1.  4.]   #后3個是+1的支持向量

 [ 2.  2.]

 [ 6.  4.]]

結果如圖所示。

 

#參數的網格掃描

# Train a SVM classification model
 
print ( "Fitting the classifier to the training set" )
t0  =  time()
param_grid  =  { 'C' : [ 1e3 5e3 1e4 5e4 1e5 ],
               'gamma' : [ 0.0001 0.0005 0.001 0.005 0.01 0.1 ], }
clf  =  GridSearchCV(SVC(kernel = 'rbf' , class_weight = 'balanced' ), param_grid)
clf  =  clf.fit(X_train_pca, y_train)
print ( "done in %0.3fs"  %  (time()  -  t0))
print ( "Best estimator found by grid search:" )
print (clf.best_estimator_)
 
 
 

Keras + 預訓練好Word2Vec模型做文本分類核心解釋

現在網上有一些預先訓練好的Word2Vec模型, 比如Glove, Google-News以及我最喜歡的FastText,都有各自使用大數據訓練出來的Word2Vec模型。 根據不同的業務, 也可以自己搜集語料庫訓練Word2Vec.

關於如何使用Keras加上預訓練好的W2V模型, 具體可以參考官網教程: Using pre-trained word embeddings in a Keras model

篇幅比較長, 寫得“太詳細”了。 不過核心就在下面一行代碼: ( Example Code on GitHub )

keras.layers import Embedding
 
embedding_layer = Embedding(len(word_index) + 1,                             EMBEDDING_DIM,                             weights=[embedding_matrix],                             input_length=MAX_SEQUENCE_LENGTH,                             trainable=False)

我們一點點來解釋:

len(word_index)+1

word_index : 表示從語料庫之中保留多少個單詞。 因為Keras需要預留一個全零層, 所以+1

有的代碼使用num_words來表示len(word_index)

word_index 又是如何得到的?

tokenizer = Tokenizer(num_words=MAX_NB_WORDS)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
 
word_index = tokenizer.word_index

即:使用Tokenizer,從語料庫之中訓練(fit_on_texts)之后得到的

EMBEDDING_DIM

即Word2Vec模型的維度。 比如你使用的是Glove_840B_300d, 那么EMBEDDING_DIM=300

weights=[embedding_matrix]

這一個參數, 應該是最關鍵的地方了。 weights,即權重。 權重的來源,embedding_matrix又是如何得來的?

思路大致如下:

(1) 構建一個[num_words, EMBEDDING_DIM]的矩陣

(2) 遍歷word_index。 將word在W2V模型之中對應vector復制過來。

換個方式說:

  • embedding_matrix 是原始W2V的子集
  • 排列順序按照Tokenizer在fit之后的詞順序。作為權重喂給Embedding Layer

input_length=MAX_SEQUENCE_LENGTH

我們輸入的語料,長短不一。 有的比較長, 有的比較短。

在預處理的時候, 我們必經的一個步驟就是pad_sequence:

data = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH) 

上面的解釋只是為了更好的讓自己以及給位讀者能更清楚的知道Keras是如何跟Pre-trained Word Embedding 對接的。

其實最好的方式還是親自把原文博客之中的代碼跑一遍, 然后可以按照筆者剛才的思路回過頭來看代碼。

本文並不能代替各位讀者的親身實踐。

本文原創, 原文鏈接:

http://www.flyml.net/2017/11/26/deepnlp-keras-pre-trained-word2vec-explaination

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM