SVC和SVR
我們可以發現,在sklearn的SVM中有sklearn.svm.SVC()和sklearn.svm.SVR()兩個方法,他們對應的其實是SVM在分類和回歸兩種問題下的結構:
- support vector classify(SVC)支持分類機做二分類的,找出分類面,解決分類問題
- support vector regression(SCR)支持回歸機做曲線擬合、函數回歸 ,做預測,溫度,天氣,股票
- 這些都會用於數據挖掘、文本分類、語音識別、生物信息,具體問題具體分析
對於SVC,其實就是我們之前學過的SVM,這里就說一下SVR
知乎這個回答講的非常好,我這里摘錄如下:
簡介
直觀上來講 SVM 分類(SVC Support Vector Classification)與 SVR(Support Vector Regression)圖形上的區別如下:
對於樣本
,傳統的回歸模型通常直接輸出
與真實輸出
之間的差別來計算損失,當且僅當
與
完全相同時,損失才是零。與此不同 SVR 假設我們能容忍
與
之間最多有
的偏差,即僅當
與
之間的差別絕對值大於
時才計算損失。這相當於以
為中心 構建一個寬度為
的間隔帶,若樣本落入此間隔帶,則認為是預測正確的,如下圖:
數學形式
【參考】
於是 SVR 問題可以形式化為:
其中 C 正則化常數,
是下圖的
ε-不敏感損失
(ε-insensitive loss)函數:
引入松弛變量
和
(間隔兩側的松弛程度有可能不同),可以將式(C2)重寫為:
拉格朗日對偶形式
通過引入
,由拉格朗日乘子可以得到式(C3) 的拉格朗日函數:
將
帶入上式,並令
的偏導為零,得到:
將式(C5)帶入式(C4)可以得到 SVR 的對偶問題:
KKT 與最終決策函數
上述過程滿足的 KKT 條件為:
可以看出,當且僅當
時,
能取非零值,當且僅當,
時
能取非零值。換言之,僅當樣本
不落入 ε-間隔帶中,相應的
和
才能取非零值。此外,約束
與
不能同時成立,因此
和
中至少有一個為零。
將式(C5)第一項帶入決策函數,可得最終的決策函數為:
能使上式中
成立的樣本即為 SVR 的支持向量,他們必然落在
ε-間隔帶
之外。顯然 SVR 的支持向量僅是訓練樣本的一部分,即其解仍然具有稀疏性。由 KKT 條件可以看出,對於每個樣本
都有
且
,於是在得到
之后,若
則必有
,繼而有:
因此,若求解式(C6)得到 \alpha_i 后,理論上說可以任意選取滿足
的樣本,通過式(C9)求得 b。在實踐中采用一種更魯棒的辦法:選擇多個(或所有)滿足條件
的樣本求解 b 后去平均值。
核函數的形式最終的決策函數為:
其中
為核函數。
不同核的回歸效果
【參考】
下面這一段實踐建議我個人覺得也是很中用的:
基於 Sklearn 的實踐建議
【參考】
避免數據拷貝
核緩存的大小:對於
SCV
、SVR
、NuSVC
和NuSVR
,核函數緩存的大小對於大型問題的運行時間有着非常大的影響。如果有足夠多的內存,建議把cache_size
的大小設置的盡可能的大。設置 C:1 是一個合理的默認選擇,如果有較多噪點數據,你應該較少
C
的大小。SVM 算法不是尺度不變,因此強烈建議縮放你的數據。如將輸入向量 X 的每個屬性縮放到[0,1] 或者 [-1,1],或者標准化為均值為 0 方差為 1 。另外,在測試向量時也應該使用相同的縮放,已獲得有意義的結果。
對於
SVC
,如果分類的數據不平衡(如有很多的正例很少的負例),可以設置class_weight='balanced'
,或者嘗試不同的懲罰參數C
底層實現的隨機性:
SVC
和NuSVC
的底層實現使用了隨機數生成器,在概率估計時混洗數據(當probability
設置為True
),隨機性可以通過random_state
參數控制。如果probability
設置為False
,這些估計不是隨機的,random_state
對結果不在有影響。使用
L1
懲罰來產生稀疏解