SVM面试题
應聘數據挖掘工程師或機器學習工程師,面試官經常會考量面試者對SVM的理解。
以下是我自己在準備面試過程中,基于個人理解,總結的一些SVM面試常考問題(想到會再更新),如有錯漏,請批評指正。(大神請忽視)
轉載請注明出處:blog.csdn.net/szlcw1
SVM的原理是什么?
SVM是一種二類分類模型。它的基本模型是在特征空間中尋找間隔最大化的分離超平面的線性分類器。(間隔最大是它有別于感知機)
(1)當訓練樣本線性可分時,通過硬間隔最大化,學習一個線性分類器,即線性可分支持向量機;
(2)當訓練數據近似線性可分時,引入松弛變量,通過軟間隔最大化,學習一個線性分類器,即線性支持向量機;
(3)當訓練數據線性不可分時,通過使用核技巧及軟間隔最大化,學習非線性支持向量機。
注:以上各SVM的數學推導應該熟悉:硬間隔最大化(幾何間隔)—學習的對偶問題—軟間隔最大化(引入松弛變量)—非線性支持向量機(核技巧)。
SVM為什么采用間隔最大化?
當訓練數據線性可分時,存在無窮個分離超平面可以將兩類數據正確分開。
感知機利用誤分類最小策略,求得分離超平面,不過此時的解有無窮多個。
線性可分支持向量機利用間隔最大化求得最優分離超平面,這時,解是唯一的。另一方面,此時的分隔超平面所產生的分類結果是最魯棒的,對未知實例的泛化能力最強。
然后應該借此闡述,幾何間隔,函數間隔,及從函數間隔—>求解最小化12||w||212||w||2 時的w和b。即線性可分支持向量機學習算法—最大間隔法的由來。
為什么要將求解SVM的原始問題轉換為其對偶問題?
一、是對偶問題往往更易求解(當我們尋找約束存在時的最優點的時候,約束的存在雖然減小了需要搜尋的范圍,但是卻使問題變得更加復雜。為了使問題變得易于處理,我們的方法是把目標函數和約束全部融入一個新的函數,即拉格朗日函數,再通過這個函數來尋找最優點。)
二、自然引入核函數,進而推廣到非線性分類問題。
為什么SVM要引入核函數?
當樣本在原始空間線性不可分時,可將樣本從原始空間映射到一個更高維的特征空間,使得樣本在這個特征空間內線性可分。
引入映射后的對偶問題:
在學習預測中,只定義核函數K(x,y)K(x,y),而不是顯式的定義映射函數??。因為特征空間維數可能很高,甚至可能是無窮維,因此直接計算?(x)??(y)?(x)·?(y)是比較困難的。相反,直接計算K(x,y)K(x,y)比較容易(即直接在原來的低維空間中進行計算,而不需要顯式地寫出映射后的結果)。
核函數的定義:K(x,y)=<?(x),?(y)>K(x,y)=<?(x),?(y)>,即在特征空間的內積等于它們在原始樣本空間中通過核函數K計算的結果。
除了 SVM 之外,任何將計算表示為數據點的內積的方法,都可以使用核方法進行非線性擴展。
svm RBF核函數的具體公式?
Gauss徑向基函數則是局部性強的核函數,其外推能力隨著參數σ的增大而減弱。
這個核會將原始空間映射為無窮維空間。不過,如果 σ 選得很大的話,高次特征上的權重實際上衰減得非常快,所以實際上(數值上近似一下)相當于一個低維的子空間;反過來,如果 σ 選得很小,則可以將任意的數據映射為線性可分——當然,這并不一定是好事,因為隨之而來的可能是非常嚴重的過擬合問題。不過,總的來說,通過調控參數σ ,高斯核實際上具有相當高的靈活性,也是使用最廣泛的核函數之一。
為什么SVM對缺失數據敏感?
這里說的缺失數據是指缺失某些特征數據,向量數據不完整。SVM沒有處理缺失值的策略(決策樹有)。而SVM希望樣本在特征空間中線性可分,所以特征空間的好壞對SVM的性能很重要。缺失特征數據將影響訓練結果的好壞。
Sklearn/libsvm中的SVM都有什么參數可以調節?
Sklearn
class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False, max_iter=-1, decision_function_shape='ovr', random_state=None) C : float, optional (default=1.0)誤差項的懲罰參數,一般取值為10的n次冪,如10的-5次冪,10的-4次冪......10的0次冪,10,1000,1000,在python中可以使用pow(10,n) n=-5~infC越大,相當于懲罰松弛變量,希望松弛變量接近0,即對誤分類的懲罰增大,趨向于對訓練集全分對的情況,這樣會出現訓練集測試時準確率很高,但泛化能力弱。C值小,對誤分類的懲罰減小,容錯能力增強,泛化能力較強。 kernel : string, optional (default=’rbf’)svc中指定的kernel類型。可以是: ‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ 或者自己指定。 默認使用‘rbf’ 。 degree : int, optional (default=3)當指定kernel為 ‘poly’時,表示選擇的多項式的最高次數,默認為三次多項式。若指定kernel不是‘poly’,則忽略,即該參數只對‘poly’有作用。 gamma : float, optional (default=’auto’)當kernel為‘rbf’, ‘poly’或‘sigmoid’時的kernel系數。如果不設置,默認為 ‘auto’ ,此時,kernel系數設置為:1/n_features coef0 : float, optional (default=0.0)kernel函數的常數項。只有在 kernel為‘poly’或‘sigmoid’時有效,默認為0。 probability : boolean, optional (default=False)是否采用概率估計。必須在fit()方法前使用,該方法的使用會降低運算速度,默認為False。 shrinking : boolean, optional (default=True)如果能預知哪些變量對應著支持向量,則只要在這些樣本上訓練就夠了,其他樣本可不予考慮,這不影響訓練結果,但降低了問題的規模并有助于迅速求解。進一步,如果能預知哪些變量在邊界上(即a=C),則這些變量可保持不動,只對其他變量進行優化,從而使問題的規模更小,訓練時間大大降低。這就是Shrinking技術。Shrinking技術基于這樣一個事實:支持向量只占訓練樣本的少部分,并且大多數支持向量的拉格朗日乘子等于C。 tol : float, optional (default=1e-3)誤差項達到指定值時則停止訓練,默認為1e-3,即0.001。 cache_size : float, optional指定內核緩存的大小,默認為200M。 class_weight : {dict, ‘balanced’}, optional權重設置。如果不設置,則默認所有類權重值相同。以字典形式傳入。##(這個具體使用還不是很清楚)##Set the parameter C of class i to class_weight[i]*C for SVC. If not given, all classes are supposed to have weight one. The “balanced” mode uses the values of y to automatically adjust weights inversely proportional to class frequencies in the input data as n_samples / (n_classes * np.bincount(y)) verbose : bool, default: False是否啟用詳細輸出。多線程時可能不會如預期的那樣工作。默認為False。 max_iter : int, optional (default=-1)強制設置最大迭代次數。默認設置為-1,表示無窮大迭代次數。Hard limit on iterations within solver, or -1 for no limit. decision_function_shape : ‘ovo’, ‘ovr’, default=’ovr’##這個用法也不是很理解##Whether to return a one-vs-rest (‘ovr’) decision function of shape (n_samples, n_classes) as all other classifiers, or the original one-vs-one (‘ovo’) decision function of libsvm which has shape (n_samples, n_classes * (n_classes - 1) / 2).Changed in version 0.19: decision_function_shape is ‘ovr’ by default.New in version 0.17: decision_function_shape=’ovr’ is recommended.Changed in version 0.17: Deprecated decision_function_shape=’ovo’ and None. random_state : int, RandomState instance or None, optional (default=None)偽隨機數使用數據。主要調節的參數有:C、kernel、degree、gamma、coef0。
SVC函數的訓練時間是隨訓練樣本平方級增長,所以不適合超過10000的樣本。
libsvm
待補充
SVM如何處理多分類問題?
一般有兩種做法:一種是直接法,直接在目標函數上修改,將多個分類面的參數求解合并到一個最優化問題里面。看似簡單但是計算量卻非常的大。
另外一種做法是間接法:對訓練器進行組合。其中比較典型的有一對一,和一對多。
一對多,就是對每個類都訓練出一個分類器,由svm是二分類,所以將此而分類器的兩類設定為目標類為一類,其余類為另外一類。這樣針對k個類可以訓練出k個分類器,當有一個新的樣本來的時候,用這k個分類器來測試,那個分類器的概率高,那么這個樣本就屬于哪一類。這種方法效果不太好,bias比較高。
一對一法(one-vs-one),針對任意兩個類訓練出一個分類器,如果有k類,一共訓練出C(2,k) 個分類器,這樣當有一個新的樣本要來的時候,用這C(2,k) 個分類器來測試,每當被判定屬于某一類的時候,該類就加一,最后票數最多的類別被認定為該樣本的類。
總結
- 上一篇: 统计回文
- 下一篇: ImportError: No modu