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