作者:匿名用戶鏈接:https://www.zhihu.com/question/52992079/answer/156294774來源:知乎著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。 (sklearn官方指南:Choosing the right estimator) 0 ...
作者:匿名用戶
鏈接:https://www.zhihu.com/question/52992079/answer/156294774
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
(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。
作者:NightyNight
鏈接:https://www.zhihu.com/question/52992079/answer/132946166
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
更新…題中問得是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←_←