sklearn中各種分類器回歸器都適用於什麼樣的數據呢?

我是一個新手,剛剛接觸這些,我想知道的是,sklearn中這些分類器回歸器都適用於什麼樣的數據呢?

比如這些各種分類回歸器,當我們看到一個數據集並且了解這個數據集的特點之後,我們肯定會優先想到應該用這些分類器中的某一個來先進行訓練。然後再嘗試其他的。

說明某一分類器更適合具有某些特點的數據集。或者說效果可能會更好。

因為是新手,雖然自己通過看各種博客已經簡單了解了各種分類器的優劣勢。但是在具體到實踐的時候,遇到一個數據集還是不知道應該先用哪個,其實還是對這些工具的理解不夠深。

所以希望各位大神能為我解答一下困惑。


(sklearn官方指南:Choosing the right estimator)

0)選擇合適的機器學習演算法

All models are wrong, but some models are useful. — George Box (Box and Draper 1987)

根據No free lunch theorem,在機器學習中,不存在一個在各方面都最好的模型/演算法,因為每一個模型都或多或少地對數據分布有先驗的統計假設。取所有可能的數據分布的平均,每個模型的表現都一樣好(或者一樣糟糕)。因此,我們需要針對具體的問題,找到最好的機器學習演算法。

1)數據分析(Exploratory Data Analysis)

在選擇具體的演算法之前,最好對數據中每一個特徵的模式和產生原理有一定的了解:

  • 特徵是連續的(real-valued)還是離散的(discrete)?
  • 如果特徵是連續的,它的直方圖(histogram)長什麼樣?它的mean和variance是如何分布的?
  • 如果特徵是離散的,不同的特徵值之間是否存在某種順序關係?例如,豆瓣上從1星到5星的打分,雖然是離散數據,但有一個從低到高的順序。如果某個特徵是「地址」,則不太可能存在一個明確的順序。
  • 特徵數據是如何被採集的?

2)特徵工程(Feature Engineering)

特徵工程(根據現有的特徵,製造出新的、有價值的特徵)決定了機器學習能力的上限,各種演算法不過是在逼近這個上限而已。不同的機器學習演算法一般會有其對應的不同的特徵工程。在實踐中,特徵工程、調整演算法參數這兩個步驟常常往複進行。

3)由簡至繁:具體演算法的選擇

sklearn包括了眾多機器學習演算法。為了簡化問題,在此只討論幾大類常見的分類器、回歸器。至於演算法的原理,sklearn的文檔中往往有每個演算法的參考文獻,機器學習的課本也都有所涉及。

3.1)General Linear Models

最開始建立模型時,我個人一般會選擇high bias, low variance的線性模型。線性模型的優點包括計算量小、速度快、不太占內存、不容易過擬合。

常用線性回歸器的有Ridge(含有L2正則化的線性回歸)和Lasso(含有L1正則化的線性回歸,自帶特徵選擇,可以獲得sparse coefficients)。同時,如果對於超參數沒有什麼特別細緻的要求,那麼可以使用sklearn提供的RidgeCV和LassoCV,自動通過高效的交叉驗證來確定超參數的值。

假如針對同一個數據集X(m samples * n features),需要預測的y值不止一個(m samples * n targets),則可以使用multitask的模型。

線性分類器中,最好用的是LogisticRegression和相應的LogisticRegressionCV。

SGDClassifier和SGDRegressor可以用於極大的數據集。然而,如果數據集過大的話,最好從數據中取樣,然後和小數據一樣分析建模,未必一開始就要在整個數據集上跑演算法。

3.2)Ensemble Methods

ensemble能夠極大提升各種演算法,尤其是決策樹的表現。在實際應用中,單獨決策樹幾乎不會被使用。Bagging(如RandomForest)通過在數據的不同部分訓練一群high variance演算法來降低演算法們整體的variance;boosting通過依次建立high bias演算法來提升整體的variance。

最常用的ensemble演算法是RandomForest和GradientBoosting。不過,在sklearn之外還有更優秀的gradient boosting演算法庫:XGBoost和LightGBM。

BaggingClassifier和VotingClassifier可以作為第二層的meta classifier/regressor,將第一層的演算法(如xgboost)作為base estimator,進一步做成bagging或者stacking。

我個人比較傾向於使用這一類模型。

3.3)支持向量機(SVM)

SVM相關的知識可以參考Andrew Ng教授在Coursera上的CS229(有能力的可以去看youtube或者網易公開課上的原版CS229)。svm的API文檔很完善,當一個調包俠也沒有太大困難。不過在大多數的數據挖掘競賽(如kaggle)中,SVM的表現往往不如xgboost。

3.4)神經網路(Neural Network)

相比業內頂尖的神經網路庫(如TensorFlow和Theano),sklearn的神經網路顯得比較簡單。個人而言,如果要使用神經網路進行分類/回歸,我一般會使用keras或者pytorch。


更新…題中問得是sklearn怎麼用,我答案里的確沒提到具體的sklearn…機器學慣用什麼語言用什麼包不是關鍵。

平時也是sklearn黨,方法也就是這些。建議你自己寫一個函數,調用不同分類方法用默認參數去做cross-validation,然後print一下score輸出或者畫一下ROC曲線啥的。見識的數據集多了,經驗豐富了,概率統計學的好點,水平也就上去了…我也是還在練級的過程中。

————————————————

以下是原答案:

謝邀。近期有兩個比賽,比較忙,所以只大致講一下,為題主更深入研究提供一點方向。

選擇分類/回歸器是基於數據特徵的。

舉個例子,比如,在預測某種商品是否被某位顧客購買時,預測的target是該顧客是否購買某種商品, 也就是true or false(也就可以用1和0表示),二分類。

然後,能夠用來分析的訓練集信息,除開targets之外,還有對應顧客的年齡、性別、是否有陪伴者、顧客的衣著樣式、商品的價格、商品的種類、商品的品牌等等。

我們觀察這些特徵,年齡是一些整數,並且這些整數之間的間隔是有意義的——而對於顧客的衣著樣式,如果它也是一些整數,像0,1,2,3,4…這樣的。

不同整數表示不同的樣式,那麼這些整數之間的間隔,則缺乏一個實際意義的解釋,因為,這些順序不過是對於"衣著樣式"中像"西式正裝"、"休閑"這樣的詞的一個確定方式的排序。你想啊,對於兩個樣本,在其他特徵一致的情況下,年齡值上存在一點小差異,我們推測這兩個樣本還是很可能有相同的表現(target);

但是,如果在衣著樣式的值上有一點小差異,我感覺時髦的年輕人喜歡高褲腳,那如果高褲腳是30,而高褲腰帶是31,你覺得這兩者的target能一樣嗎?

而對於幾個特徵張成的歐式空間,有些演算法傾向於將它切割成幾塊,每一塊具有相似的性質,但是高褲腰帶和高褲腳顯然是相似不了的。

像SVM這樣的,基於分割空間的方法,遇到上述「衣著樣式」這種連續性非常不好的特徵,它的誤差就可能很大,因為有異常點(相互靠近的樣本表現差異大)。

而像基於樹模型的方法,決策時並不關心函數(從特徵張成的空間到target取值的數集{0,1}的函數,為方便記為F)的連續性,而考慮的是如何在每個特徵上做合適的劃分,這樣一來,就會有效地規避分割空間帶來的誤差(雖然實際上,它也分割了空間,但它的理論基礎不是這個)。

同時,對於特徵主次分明的情況,樹模型也通常帶來良好的效益。

如果非要用線性模型來分類,可以將導致F不連續的特徵進行啞編碼,啞編碼可以將一些非線性的特徵變得「更線性」,代價是帶來了稀疏性,這在自然語言處理中很常見。

上面只是分析特徵並進行分類器選擇的部分過程。題主可以看一下,應該會有啟發。

再扯一點人生的經驗:

1.稀疏的大規模數據:SGD和邏輯回歸。

2.歸一化的實數數據:SVM

3.預處理做的不好的數據,弱分類器集成。

4.明顯的概率分布問題:貝葉斯(用的少,但在有大語料庫的文本處理問題中比較有效)。

5.神經網路relu, relu, relu←_←


推薦閱讀:

scikit-learn中如何保存模型?

TAG:數據挖掘 | Kaggle | sklearn |