數據科學家必備的10種機器學習演算法
原文來源:towardsdatascience
作者:Shashank Gupta
「雷克世界」編譯:嗯~是阿童木呀、KABUDA、EVA
可以說,機器學習從業者都是個性迥異的。雖然其中一些人會說「我是X方面的專家,X可以在任何類型的數據上進行訓練」,其中,X =某種演算法;而其他一些人則是「能夠在適合的工作中施展其才華」。他們中的很多人認可「涉獵所有行業,而是其中一個領域的專家」策略,即他們在一個領域內擁有一個深厚的專業知識,並且對機器學習的不同領域有所了解。也就是說,沒有人能否認這樣的事實:作為數據科學家的實踐者,我們必須了解一些通用機器學習的基礎知識演算法,這將幫助我們解決所遇到的新領域問題。本文對通用機器學習演算法進行了簡要的闡述,並列舉了它們的相關資源,從而幫助你能夠快速掌握其中的奧妙。
1.主成分分析(PCA)/ SVD
PCA是一種無監督的方法,用於對由向量組成的數據集的全局屬性進行理解。本文分析了數據點的協方差矩陣,以了解哪些維度(大部分情況)/數據點(少數情況)更為重要,即它們之間具有很多的變化,但與其他變數之間的協變性較低)。考慮一個矩陣頂級主成分(PC)的一種方式是考慮它的具有最高特徵值的特徵向量。奇異值分解(SVD)本質上也是計算有序組件的一種方法,但你在沒有獲得點的協方差矩陣的情況下也可以得到它。
該演算法通過獲取維度縮小的數據點的方式來幫助人們克服維度難題。
庫:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.svd.html
http://scikitlearn.org/stable/modules/generated/sklearn.decomposition.PCA.html
入門教程:
https://arxiv.org/pdf/1404.1100.pdf
2a.最小二乘法和多項式擬合
還記得你在大學時所學的數值分析(Numerical Analysis)代碼嗎?其中,你使用直線和曲線連接點從而得到一個等式方程。在機器學習中,你可以將它們用於擬合具有低維度的小型數據集的曲線。(而對於具有多個維度的大型數據或數據集來說,實驗的結果可能總是過度擬合,所以不必麻煩)。OLS有一個封閉形式的解決方案,所以你不需要使用複雜的優化技術。
如上圖所示,很明顯,使用這種演算法對簡單的曲線/回歸進行擬合是非常方便的。
庫:
https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html
https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.polyJt.html
入門教程:
https://lagunita.stanford.edu/c4x/HumanitiesScience/StatLearning/asset/linear_regression.pdf
2b.約束線性回歸
最小二乘法可能會與異常值(outliers)、假欄位(spurious fields)和數據中的雜訊相混淆。因此,我們需要約束以減少數據集上所進行擬合的線的方差。正確的方法是使用一個線性回歸模型,以確保權重不會出錯。模型可以有L1範數(LASSO)或L2(嶺回歸,Ridge Regression)或兼具兩者(彈性回歸)。均方損失得到優化。
將這些演算法用於擬合帶有約束的回歸線,避免過度擬合併對模型中雜訊維度進行掩碼。
庫:
http://scikit-learn.org/stable/modules/linear_model.html
入門教程:
https://www.youtube.com/watch?v=5asL5Eq2x0A
https://www.youtube.com/watch?v=jbwSCwoT51M
3. K均值聚類
這是大家最喜歡的無監督聚類演算法。給定一組向量形式的數據點,我們可以根據它們之間的距離製作點集群。這是一個期望最大化演算法,它迭代地移動集群中心,然後架構每集群中心點聚焦在一起。該演算法所採用的輸入是將要生成的集群的數量,以及它將嘗試聚集集群的迭代次數。
顧名思義,你可以使用此演算法在數據集中創建K個集群。
庫:
http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
入門教程:
https://www.youtube.com/watch?v=hDmNF9JG3lo
https://www.datascience.com/blog/k-means-clustering
4.Logistic回歸
Logistic回歸是有限線性回歸,在應用權重後帶有非線性(大多數使用sigmoid函數,或者你也可以使用tanh函數)應用,因此把輸出限制到接近+/-類(在sigmoid的情況下是1和0)。利用梯度下降法對交叉熵損失函數(Cross-Entropy Loss functions)進行優化。
初學者需要注意的是:Logistic回歸用於分類,而不是回歸。你也可以把logistic回歸看成是一層神經網路。Logistic回歸使用諸如梯度下降或LBFGS等最優化方法進行訓練。從事自然語言處理的的人員通常會稱它為最大熵分類器(Maximum Entropy Classifier)。
Sigmoid函數是這個樣子的:
使用LR對簡單但具有魯棒性的分類器進行訓練。
庫:
http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
入門教程:
https://www.youtube.com/watch?v=-la3q9d7AKQ
5.支持向量機 (Support Vector Machines,SVM )
支持向量機是線性模型,就像線性/ Logistic回歸一樣,不同之處在於它們有不同的基於邊緣的損失函數(支持向量機的推導是我見過的最漂亮的數學結果和特徵值計算之一)。你可以使用諸如L-BFGS甚至SGD這樣的最優化方法來優化損失函數。
支持向量機中的另一個創新是將內核用於數據,以體現工程師的特色。如果你有很好的領域洞察力,你可以用更聰明的方法來替代優秀但是老舊的RBF內核並從中獲利。
支持向量機能做一件獨特的事情:學習一類分類器。
可以使用支持向量機來訓練分類器(甚至是回歸量)。
庫:
http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
入門教程:
https://www.youtube.com/watch?v=eHsErlPJWUU
6.前饋神經網路(Feedforward Neural Networks, FFNN)
這些基本上都是多層的logistic回歸分類器。許多權重的層被非線性函數(sigmoid、tanh、relu+softmax和炫酷的selu)分隔了。它們另一個流行的名字是多層感知器(Multi-Layered Perceptron)。可以將FFNN作為自動編碼器用於分類和非監督的特徵學習。
多層感知器(Multi-Layered perceptron)
FFNN作為自動編碼器
可以使用FFNN作為自動編碼器來訓練分類器或提取特徵。
庫:
http://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPClassifier.html#sklearn.neural_network.MLPClassifier
http://scikit-learn.org/stable/modules/generated/sklearn.neural_network.MLPRegressor.html
https://github.com/keras-team/keras/blob/master/examples/reuters_mlp_relu_vs_selu.py
入門教程:
http://www.deeplearningbook.org/contents/mlp.html
http://www.deeplearningbook.org/contents/autoencoders.html
http://www.deeplearningbook.org/contents/representation.html
7.卷積神經網路(Convents)
目前,世界上近乎所有基於視覺的機器學習結果都是使用卷積神經網路實現的。它們可用於圖像分類、目標檢測及圖像分割。Yann Lecun於80年代末90年代初提出卷積神經網路,其特徵是卷積層,它起著提取分層特徵的作用。你可以在文本(甚至圖形)中使用它們。
利用卷積神經網路對圖像和文本進行分類,並進行目標檢測和圖像分割。
庫:
https://developer.nvidia.com/digits
https://github.com/kuangliu/torchcv
https://github.com/chainer/chainercv
https://keras.io/applications/
入門教程:
http://cs231n.github.io/
https://adeshpande3.github.io/A-Beginner%27s-Guide-To-Understanding-Convolutional-Neural-Networks/
8.循環神經網路(RNNs)
RNNs模型序列通過在時間t遞歸地對聚集器狀態施加相同的權重集,並且在時間t輸入(給定一個序列,在時間0..t..T處有輸入,並且在每個時間t具有隱藏狀態,來自RNN的t-1步驟的輸出)。現在很少使用純RNN(pure RNN),但是像LSTM和GRU這類旗鼓相當的演算法在大多數序列建模任務中仍是最先進的。
RNN(如果這裡是密集連接的單元與非線性,那麼現在f一般是LSTM或GRU)。LSTM單元用於替代純RNN中的簡單緻密層。
使用RNN進行人物序列建模任務,特別是文本分類、機器翻譯及語言建模。
庫:
https://github.com/tensorqow/models
https://github.com/wabyking/TextClassiJcationBenchmark
http://opennmt.net/
入門教程:
http://cs224d.stanford.edu/
http://www.wildml.com/category/neural-networks/recurrent-neural-networks/
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
9.條件隨機場(CRFs)
CRFs或許是概率圖形模型(PGMs)中使用頻率最高的模型。它們可用於類似於RNN的序列建模,也可與RNN結合使用。在神經機器翻譯系統出現之前,CRF是最先進的技術,在許多具有小數據集的序列標註任務中,它們仍然會比那些需要大量數據才能推廣的RNN表現得更好。它們也可被用於其他結構化的預測任務,如圖像分割等。CRF對序列中的每個元素(例如句子)進行建模,這樣近鄰會影響序列中某個組件的標籤,而不是所有的標籤相互獨立。
使用CRFs標記序列(如文本、圖像、時間序列及DNA等)。
庫:
https://sklearn-crfsuite.readthedocs.io/en/latest/
入門教程:
http://blog.echen.me/2012/01/03/introduction-to-conditional-random-Jelds/
Hugo Larochelle在Youtube上的系列講座: https://www.youtube.com/watch?v=GF3iSJkgPbA
10.決策樹
例如我有一張有關各種水果數據的Excel工作表,我必須標明哪些是蘋果。我們需要做的是提出一個問題「哪些水果是紅的,哪些水果是圓的?」然後根據答案,將「是」與「否」的水果區分開。然後,我們得到的紅色和圓形的水果並不一定都是蘋果,所有蘋果也不一定都是紅色和圓形的。因此,我會面向紅色和圓形的水果提出一個問題,「哪些水果上有紅色或黃色的標記」 ?向不是紅色和圓形的水果提出一個問題,「哪些水果是綠色和圓形的」。基於這些問題,我可以非常準確的分辨出哪些是蘋果。這一系列的問題展示了什麼是決策樹。然而,這是基於我個人直覺的決策樹。直覺並不能處理高維度和複雜的問題。我們必須通過查看標記的數據來自動得出問題的級聯,這就是基於機器學習的決策樹所做的工作。早期的CART樹曾被用於簡單的數據,但隨著數據集的不斷擴大,偏差-方差的權衡需要用更好地演算法來解決。目前常用的兩種決策樹演算法是隨機森林(Random Forests)(在屬性的隨機子集上建立不同的分類器,並將它們結合起來輸出)和提升樹(Boosting trees)(在其他樹的基礎上對樹的級聯進行訓練,糾正它們下面的錯誤)
決策樹可以用於分類數據點(甚至回歸)。
庫:
http://scikitlearn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassiJer.html
http://scikitlearn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassiJer.html
http://xgboost.readthedocs.io/en/latest/
https://catboost.yandex/
入門教程:
http://xgboost.readthedocs.io/en/latest/model.html
https://arxiv.org/abs/1511.05741
https://arxiv.org/abs/1407.7502
http://education.parrotprediction.teachable.com/p/practical-xgboost-in-python
TD演算法
你不必思考上述哪種演算法能夠像DeepMind那樣擊敗圍棋世界冠軍,因為它們都不能做到這一點。我們之前談及的10種演算法都是模式識別,而非策略學習者。為了學習能夠解決多步驟問題的策略,比如贏得一盤棋或玩Atari遊戲機,我們需要讓一個空白的智能體在這世界上根據其自身面臨的獎懲進行學習。這種類型的機器學習被稱為強化學習。近期,在這個領域內所取得的很多(並非全部)成果都是通過將convnet或LSTM的感知能力與一組名為時間差分學習演算法(Temporal Difference Learning)的演算法組合而得來的。這其中包括Q-Learning、SARSA及其他演算法。這些演算法是對貝爾曼方程的巧妙應用,從而得到一個可以利用智能體從環境中得到的獎勵來訓練的損失函數。
這些演算法主要用於自動運行遊戲中,並在其他語言生成和目標檢測項目中予以應用。
庫:
https://github.com/keras-rl/keras-rl
https://github.com/tensorqow/minigo
入門教程:
Sutton與Barto的免費書籍:https://web2.qatar.cmu.edu/~gdicaro/15381/additional/SuttonBarto-RL-5Nov17.pdf
觀看David Silver的課程: https://www.youtube.com/watch?v=2pWv7GOvuf0
我們介紹了可以助你成為數據科學家的10中機器學習演算法。
你可以在這裡瀏覽機器學習庫:https://blog.paralleldots.com/data-science/lesser-known-machine-learning-libraries-part-ii/
※加州大學提出從因果革命七大成就中為機器學習尋求良好的模型指導
※一文詳解群體機器人中的實體進化到底是什麼?
TAG:雷克世界 |