python機器學習庫sklearn——支持向量機svm

支持向量機svm的相關的知識內容可以參考

https://blog.csdn.net/luanpeng825485697/article/details/78823919

支持向量機的優勢在於:

  • 在高維空間中非常高效.即使在數據維度比樣本數量大的情況下仍然有效.
  • 在決策函數(稱為支持向量)中使用訓練集的子集,因此它也是高效利用內存的.
  • 通用性: 不同的核函數與特定的決策函數一一對應.常見的 kernel 已經提供,也可以指定定製的內核.

支持向量機的缺點包括:

  • 如果特徵數量比樣本數量大得多,在選擇核函數時要避免過擬合,而且正則化項是非常重要的.
  • 支持向量機不直接提供概率估計,這些都是使用昂貴的五次交叉驗算計算的. (詳情見 Scores and probabilities, 在下文中).

sklearn.svm模塊提供了很多模型供我們使用。

python機器學習庫sklearn——支持向量機svm


SVC

SVC用於分類:支持向量分類,基於libsvm實現的,數據擬合的時間複雜度是數據樣本的二次方,這使得他很難擴展到10000個數據集,當輸入是多類別時(SVM最初是處理二分類問題的),通過一對一的方案解決,當然也有別的解決辦法。

SVC參數說明如下:

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

kernel:核函數類型,str類型,默認為’rbf’。可選參數為:

  1. ‘linear’:線性核函數
  2. ‘poly’:多項式核函數
  3. ‘rbf’:徑像核函數/高斯核
  4. ‘sigmod’:sigmod核函數
  5. ‘precomputed’:核矩陣。precomputed表示自己提前計算好核函數矩陣,這時候算法內部就不再用核函數去計算核矩陣,而是直接用你給的核矩陣,核矩陣需要為n*n的。
  6. degree:多項式核函數的階數,int類型,可選參數,默認為3。這個參數只對多項式核函數有用,是指多項式核函數的階數n,如果給的核函數參數是其他核函數,則會自動忽略該參數。
  7. gamma:核函數係數,float類型,可選參數,默認為auto。只對’rbf’ ,’poly’ ,’sigmod’有效。如果gamma為auto,代表其值為樣本特徵數的倒數,即1/n_features。
  8. coef0:核函數中的獨立項,float類型,可選參數,默認為0.0。只有對’poly’ 和,’sigmod’核函數有用,是指其中的參數c。
  9. probability:是否啟用概率估計,bool類型,可選參數,默認為False,這必須在調用fit()之前啟用,並且會fit()方法速度變慢。
  10. shrinking:是否採用啟發式收縮方式,bool類型,可選參數,默認為True。
  11. tol:svm停止訓練的誤差精度,float類型,可選參數,默認為1e^-3。
  12. cache_size:內存大小,float類型,可選參數,默認為200。指定訓練所需要的內存,以MB為單位,默認為200MB。
  13. class_weight:類別權重,dict類型或str類型,可選參數,默認為None。給每個類別分別設置不同的懲罰參數C,如果沒有給,則會給所有類別都給C=1,即前面參數指出的參數C。如果給定參數’balance’,則使用y的值自動調整與輸入數據中的類頻率成反比的權重。
  14. verbose:是否啟用詳細輸出,bool類型,默認為False,此設置利用libsvm中的每個進程運行時設置,如果啟用,可能無法在多線程上下文中正常工作。一般情況都設為False,不用管它。
  15. max_iter:最大迭代次數,int類型,默認為-1,表示不限制。
  16. decision_function_shape:決策函數類型,可選參數’ovo’和’ovr’,默認為’ovr’。’ovo’表示one vs one,’ovr’表示one vs rest。
  17. random_state:數據洗牌時的種子值,int類型,可選參數,默認為None。偽隨機數發生器的種子,在混洗數據時用於概率估計。

NuSVC

NuSVC(Nu-Support Vector Classification.):核支持向量分類,和SVC類似,也是基於libsvm實現的,但不同的是通過一個參數空值支持向量的個數。

nu:訓練誤差的一個上界和支持向量的分數的下界。應在間隔(0,1 ]。

其餘同SVC

LinearSVC

LinearSVC(Linear Support Vector Classification):線性支持向量分類,類似於SVC,但是其使用的核函數是”linear“上邊介紹的兩種是按照brf(徑向基函數計算的,其實現也不是基於LIBSVM,所以它具有更大的靈活性在選擇處罰和損失函數時,而且可以適應更大的數據集,他支持密集和稀疏的輸入是通過一對一的方式解決的。

LinearSVC 參數解釋

C:目標函數的懲罰係數C,用來平衡分類間隔margin和錯分樣本的,default C = 1.0;

loss:指定損失函數

penalty :

dual :選擇算法來解決對偶或原始優化問題。當nsamples>nfeaturesnsamples>nfeatures 時dual=false。

tol :(default = 1e - 3): svm結束標準的精度;

multi_class:如果y輸出類別包含多類,用來確定多類策略, ovr表示一對多,“crammer_singer”優化所有類別的一個共同的目標 。如果選擇“crammer_singer”,損失、懲罰和優化將會被被忽略。

fit_intercept :

intercept_scaling :

class_weight :對於每一個類別i設置懲罰係數C=classweight[i]∗CC=classweight[i]∗C,如果不給出,權重自動調整為 nsamples/(nclasses∗np.bincount(y))nsamples/(nclasses∗np.bincount(y))

verbose:跟多線程有關,不大明白啥意思具體。

編寫代碼

數據集下載地址:https://github.com/626626cdllp/sklearn/blob/master/SVM_data.txt

SVC、LinearSVC、NuSVC



import numpy as np # 快速操作結構數組的工具
from sklearn import svm # svm支持向量機
import matplotlib.pyplot as plt # 可視化繪圖
data_set = np.loadtxt("SVM_data.txt")
train_data = data_set[:,0:2] # 訓練特徵空間
train_target = np.sign(data_set[:,2]) # 訓練集類標號
test_data = [[3,-1], [1,1], [7,-3], [9,0]] # 測試特徵空間
test_target = [-1, -1, 1, 1] # 測試集類標號
plt.scatter(data_set[:,0],data_set[:,1],c=data_set[:,2]) # 繪製可視化圖
plt.show()
# 創建模型
clf = svm.SVC()
clf.fit(X=train_data, y=train_target,sample_weight=None) # 訓練模型。參數sample_weight為每個樣本設置權重。應對非均衡問題
result = clf.predict(test_data) # 使用模型預測值
print('預測結果:',result) # 輸出預測值[-1. -1. 1. 1.]
# 獲得支持向量
print('支持向量:',clf.support_vectors_)
# 獲得支持向量的索引

print('支持向量索引:',clf.support_)
# 為每一個類別獲得支持向量的數量
print('支持向量數量:',clf.n_support_)
# # ===============================Linear SVM======================
from sklearn.svm import LinearSVC
clf = LinearSVC() # 創建線性可分svm模型,參數均使用默認值
clf.fit(train_data, train_target) # 訓練模型
result = clf.predict(test_data) # 使用模型預測值
print('預測結果:',result) # 輸出預測值[-1. -1. 1. 1.]
# # ===============================Linear NuSVC======================
from sklearn.svm import NuSVC
clf = NuSVC() # 創建線性可分svm模型,參數均使用默認值
clf.fit(train_data, train_target) # 訓練模型
result = clf.predict(test_data) # 使用模型預測值
print('預測結果:',result) # 輸出預測值[-1. -1. 1. 1.]

不均衡樣本、多分類問題

現在我們再來模擬一下樣本不均衡的情況,同時學習下SVM處理多分類問題。

# ===============================樣本不平衡、多分類的情========================
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
# 創建不均衡樣本
rng = np.random.RandomState(0)
n_samples_1 = 1000
n_samples_2 = 100
n_samples_3 = 100
X = np.r_[1.5 * rng.randn(n_samples_1, 2), 0.5 * rng.randn(n_samples_2, 2) + [2, 2],0.5 * rng.randn(n_samples_3, 2) + [-3, 3]] # 三類樣本點中心為(1.5,1.5)、(2,2)、(-3,3)

y = [0] * (n_samples_1) + [1] * (n_samples_2)+ [2] * (n_samples_3) # 前面的1000個為類別0,後面的100個為類別1,最後100個類別為2
# 創建模型獲取分離超平面
clf = svm.SVC(decision_function_shape='ovo',kernel='linear', C=1.0) # decision_function_shape='ovo'為使用1對1多分類處理。會創建n(n-1)/2個二分類。ovr為一對所有的處理方式
clf.fit(X, y)
# 多分類的情況下,獲取其中二分類器的個數。
dec = clf.decision_function([[1.5,1.5]]) # decision_function()的功能:計算樣本點到分割超平面的函數距離。 包含幾個2分類器,就有幾個函數距離。
print('二分類器個數:',dec.shape[1])
# 繪製,第一個二分類器的分割超平面
w = clf.coef_[0]
a = -w[0] / w[1] # a可以理解為斜率
xx = np.linspace(-5, 5)
yy = a * xx - clf.intercept_[0] / w[1] # 二維座標下的直線方程
# 使用類權重,獲取分割超平面
wclf = svm.SVC(kernel='linear', class_weight={1: 10})
wclf.fit(X, y)
# 繪製 分割分割超平面
ww = wclf.coef_[0]
wa = -ww[0] / ww[1]
wyy = wa * xx - wclf.intercept_[0] / ww[1] # 帶權重的直線
# 繪製第一個二分類器的分割超平面和樣本點
h0 = plt.plot(xx, yy, 'k-', label='no weights')
h1 = plt.plot(xx, wyy, 'k--', label='with weights')
plt.scatter(X[:, 0], X[:, 1], c=y)
plt.legend()
plt.show()

python機器學習庫sklearn——支持向量機svm

迴歸

支持向量分類的方法可以被擴展用作解決迴歸問題. 這個方法被稱作支持向量迴歸.

支持向量分類生成的模型(如前描述)只依賴於訓練集的子集,因為構建模型的 cost function 不在乎邊緣之外的訓練點. 類似的,支持向量迴歸生成的模型只依賴於訓練集的子集, 因為構建模型的 cost function 忽略任何接近於模型預測的訓練數據.

支持向量分類有三種不同的實現形式: SVR, NuSVR 和 LinearSVR. 在只考慮線性核的情況下, LinearSVR 比 SVR 提供一個更快的實現形式, 然而比起 SVR 和 LinearSVR, NuSVR 實現一個稍微不同的構思(formulation)

與分類的類別一樣, fit方法會調用參數向量 X, y, 只在 y 是浮點數而不是整數型.:

# ===============================SVM迴歸預測========================
X = [[0, 0], [2, 2]]
y = [0.5, 2.5]
clf = svm.SVR()
clf.fit(X, y)
clf.predict([[1, 1]])

使用訣竅

  • 避免數據複製: 對於 SVC, SVR, NuSVC 和 NuSVR, 如果數據是通過某些方法而不是用 C 有序的連續雙精度,那它先會調用底層的 C 命令再複製。 您可以通過檢查它的 flags 屬性,來確定給定的 numpy 數組是不是 C 連續的。
  • 對於 LinearSVC (和 LogisticRegression) 的任何輸入,都會以 numpy 數組形式,被複制和轉換為 用 liblinear 內部稀疏數據去表達(雙精度浮點型 float 和非零部分的 int32 索引)。 如果您想要一個適合大規模的線性分類器,又不打算複製一個密集的 C-contiguous 雙精度 numpy 數組作為輸入, 那我們建議您去使用 SGDClassifier 類作為替代。目標函數可以配置為和 LinearSVC 模型差不多相同的。
  • 內核的緩存大小: 在大規模問題上,對於 SVC, SVR, nuSVC 和 NuSVR, 內核緩存的大小會特別影響到運行時間。如果您有足夠可用的 RAM,不妨把它的 緩存大小 設得比默認的 200(MB) 要高,例如為 500(MB) 或者 1000(MB)。
  • 懲罰係數C的設置:在合理的情況下, C 的默認選擇為 1 。如果您有很多混雜的觀察數據, 您應該要去調小它。 C 越小,就能更好地去正規化估計。
  • 支持向量機算法本身不是用來擴大不變性,所以 我們強烈建議您去擴大數據量. 舉個例子,對於輸入向量 X, 規整它的每個數值範圍為 [0, 1] 或 [-1, +1] ,或者標準化它的為均值為0方差為1的數據分佈。請注意, 相同的縮放標準必須要應用到所有的測試向量,從而獲得有意義的結果。 請參考章節 預處理數據 ,那裡會提供到更多關於縮放和規整。
  • 在 NuSVC/OneClassSVM/NuSVR 內的參數 nu , 近似是訓練誤差和支持向量的比值。
  • 在 SVC, ,如果分類器的數據不均衡(就是說,很多正例很少負例),設置 class_weight=’balanced’ 與/或嘗試不同的懲罰係數 C 。
  • 在擬合模型時,底層 LinearSVC 操作使用了隨機數生成器去選擇特徵。 所以不要感到意外,對於相同的數據輸入,也會略有不同的輸出結果。如果這個發生了, 嘗試用更小的 tol 參數。
  • 使用由 LinearSVC(loss=’l2’, penalty=’l1’, dual=False) 提供的 L1 懲罰去產生稀疏解,也就是說,特徵權重的子集不同於零,這樣做有助於決策函數。 隨著增加 C 會產生一個更復雜的模型(要做更多的特徵選擇)。可以使用 l1_min_c 去計算 C 的數值,去產生一個”null” 模型(所有的權重等於零)。

原文鏈接:https://blog.csdn.net/luanpeng825485697/article/details/79809006


分享到:


相關文章: