SGDClassifier和LR,SVM的區別
看了許多文獻,以及最近的專案經驗,終於真正地搞懂了LR。
以前總聽大家說,看你對機器學習搞得透徹不透徹,就看你邏輯迴歸理解得怎麼樣;自己是統計出身的我,一直很有自信,以為無非就是個極大似然估計,求那個似然函式的極大值而已。然而實際上,這個之中也有很多的說法在裡面,比如,求引數的方法。
在邏輯迴歸中,我們極大似然估計的引數是可以通過“極大化該引數值”得到的,然而得到引數之後,並不代表我們就完成了,因為成千上萬的樣本,我們的引數要“收斂”才是一個穩定的model。
那麼問題來了,怎樣更新我的引數,讓其收斂呢?
有兩種方式:在sklearn的LogisticRegression裡,是通過每次增加負樣本權重【】的方式,讓樣本“重新排列”,之後得到了一個新的theta,直到兩次樣本基本上都不怎麼變。
在sklearn裡,還有一個分類器,之前一直沒搞懂,感覺跟logistic迴歸的結果啊,目的啊都是一樣的啊,那麼它出現的意義是什麼?
後來我重新讀了一遍,發現LR那裡面的引數沒有學習率,衰減率,等等。
讓我突然意識到這個LR的引數好像不是通過梯度下降求的。
後面這個SGDClassification,裡面有learning rate,有decay等等,後來發現,是通過真正的梯度下降來求參的。【名稱也就是“隨機梯度下降”】
然後,看見許多人都說,在大規模資料下,基本上都要用到梯度下降的方法
【以下轉自“機器學習演算法一覽,應用建議與解決思路 ”】
3.3 關於大資料樣本集和高維特徵空間
我們在小樣本的toy dataset上,怎麼搗鼓都有好的方法。但是當資料量和特徵樣本空間膨脹非常厲害時,很多東西就沒有那麼好使了,至少是一個很耗時的過程。舉個例子說,我們現在重新生成一份資料集,但是這次,我們生成更多的資料,更高的特徵維度,而分類的類別也提高到5。
3.3.1 大資料情形下的模型選擇與學習曲線
在上面提到的那樣一份資料上,我們用LinearSVC可能就會有點慢了,我們注意到機器學習演算法使用圖譜推薦我們使用SGDClassifier。其實本質上說,這個模型也是一個線性核函式的模型,不同的地方是,它使用了隨機梯度下降做訓練,所以每次並沒有使用全部的樣本,收斂速度會快很多。再多提一點,SGDClassifier對於特徵的幅度非常敏感,也就是說,我們在把資料灌給它之前,應該先對特徵做幅度調整,當然,用sklearn的StandardScaler可以很方便地完成這一點。
SGDClassifier每次只使用一部分(mini-batch)做訓練,在這種情況下,我們使用交叉驗證(cross-validation)並不是很合適,我們會使用相對應的progressive validation:簡單解釋一下,estimator每次只會拿下一個待訓練batch在本次做評估,然後訓練完之後,再在這個batch上做一次評估,看看是否有優化。
【轉載結束】
然後,在VW中,實際上也就是優化了一個SGD,因為VW裡的引數基本上都是各種學習率。
所以說,我理解,VW實際上就是一個優化了的,通過梯度下降的方法來解決各種求解loss function的分類器。
如果loss function是hinge loss 那麼就是SVM
如果是log 那就是LR
如果是square 平方誤差,那麼就是線性迴歸
如果是quantile,那麼就是求解中位數的線性迴歸
如果是0-1損失 就是說“計數缺失了多少”,那麼【在vw後面加binary】
【以下轉自知乎】
1.資料集很大還是優先考慮 SGD regressor。
尤其特別大資料集,SGD外,幾乎別無他法。跑不動。
2.不是特別特別大的,
先試試嶺迴歸或linear kernal的SVR。
3.不管用,換RBF kernal或者Ensemble regressor。
4.如果有important features要先feature selection,則適用Lasso,ElasticNet。同樣是指非特大資料集。
作者:Fu Tiffany
連結:https://www.zhihu.com/question/21704547/answer/74404131
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
總結
用自己語言總結一下,可能不全面,有機會再補充:
1. LR有兩種求引數的方法,一種是梯度下降,一種是改變正負樣本權重。梯度下降的時候,把特徵歸一化會有利於梯度的下降【參見知乎:為什麼 feature scaling 會使 gradient descent 的收斂更好?https://www.zhihu.com/question/37129350】扁平的梯度下降的方向不是真正速率最快的方向。
2. FTRL用的就是隨機梯度下降SGD(OGD)的方法,它不同點在於每個特徵都是獨立隨機下降的。而且會根據某個特徵出現的比例來載入權重的。因此會導致某幾個特徵出現的值很大,影響評分。【因為負樣本的存在】
3. LR輸出的是樣本的概率
4. BFGS用的是擬牛頓的辦法,模仿了逆hessian矩陣。避免了儲存逆hessian矩陣。
5. LR和SVM的區別:SVM尋求的是一個超平面,因此並不是每個樣本都對其平面有影響;LR是每個樣本點對超平面都有影響。SVM是無法輸出概率的,得到的也是距離超平面的一個距離的函式。【libsvm也是一個距離的測度,求解的時候也是轉換成lr再求解的】
6. SVM必須中心化,因為這是跟“距離”有關的,不正規化之後會出問題
7. LR的損失函式是log loss SVM的損失函式是hinge LOSS
--------------------- 本文來自 tianbwin2995 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/tianbwin2995/article/details/51853869?utm_source=copy
相關文章
- 感知器、logistic與svm 區別與聯絡
- ../和./和/的區別
- 基於 SVM 和增強型 PCP 特徵的和絃識別特徵
- 和 的區別
- as 和 with的區別
- ||和??的區別
- /*和/**的區別
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- ./ 和sh 的區別
- JQuery this和$(this)的區別jQuery
- jquery $(this) 和this的區別jQuery
- T和?的區別
- ++a和a++的區別
- makefile =和:=的區別
- Mybatis中#{}和${}傳參的區別及#和$的區別小結MyBatis
- 和區別
- MYSQL和SQL的區別MySql
- varchar和char的區別
- &self 和 self 的區別
- var和public的區別
- filter和interceptor的區別Filter
- useEffect 和 useLayoutEffect 的區別
- SDK和API的區別?API
- var 和 let 的區別
- WebApi和MVC的區別WebAPIMVC
- service和systemctl的區別
- GET和POST的區別?
- GET和POST的區別
- button和submit的區別MIT
- GET 和 POST 的區別
- 【Java】equals 和 == 的區別Java
- django和flask的區別DjangoFlask
- promise 和 Observable 的區別Promise
- sass和less的區別
- POST 和 GET 的區別
- cookie和session的區別CookieSession
- MTV和MVC的區別MVC