想挑戰(zhàn)智商?10大機(jī)器學(xué)習(xí)算法,看懂你就是數(shù)據(jù)科學(xué)家
想成為數(shù)據(jù)科學(xué)家?你得是個博聞強(qiáng)識,又對新鮮事物保持好奇心的人。正因?yàn)槿绱?,?shù)據(jù)科學(xué)家會掌握幾乎所有的常見算法,并精通其中一門,這樣可以快速適應(yīng)新領(lǐng)域的問題。
今天我們就來聊聊,每一位數(shù)據(jù)科技家都應(yīng)該了解的10大機(jī)器學(xué)習(xí)算法。下面是關(guān)于普遍機(jī)器學(xué)習(xí)算法和快速資源的風(fēng)暴之旅,準(zhǔn)好了嗎?燒腦挑戰(zhàn)開始:
1. 主成分分析(PCA)/奇異值分解(SVD)
PCA是一種非監(jiān)督學(xué)習(xí),用來理解由向量組成的數(shù)據(jù)集的全局特性的方法。這里分析了數(shù)據(jù)點(diǎn)的協(xié)方差模型,用來了解哪些維度(大部分)/數(shù)據(jù)點(diǎn)(有時)更重要,即在它們自身之間具有高方差,但與其他變量時協(xié)方差較低。
這種思考模型主要用于考量具有最高特征值的特征向量。此外,SVD本質(zhì)上也是一種計算有序成分的方法,但你不需要通過獲取數(shù)據(jù)點(diǎn)的協(xié)方差矩陣來實(shí)現(xiàn)它。

這種算法通過獲取已縮減維度的數(shù)據(jù)點(diǎn),有助于解決多維度產(chǎn)生的沖擊。
Libraries:
- https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.svd.html
- http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html
Introductory Tutorial:
- https://arxiv.org/pdf/1404.1100.pdf
2.1 最小二乘法和多項式擬合
還記得你在大學(xué)里學(xué)的數(shù)值分析編碼嗎?通過擬合直線和曲線得到一個方程?,F(xiàn)在,你可以使用它們來適配機(jī)器學(xué)習(xí)中的曲線,用于非常小的低維數(shù)據(jù)集。對于大數(shù)據(jù)或多維度的數(shù)據(jù)集,你可能會需要過度擬合,所以不用費(fèi)心。普通最小二乘法(OLS)具有封閉形式的解決方案,因此你不需要使用復(fù)雜的優(yōu)化技術(shù)。

很明顯,你可以使用這種算法擬合簡單曲線/回歸。
Libraries:
- https://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html
- https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.polyfit.html
Introductory Tutorial:
- https://lagunita.stanford.edu/c4x/HumanitiesScience/StatLearning/asset/linear_regression.pdf
2.2 約束性線性回歸
最小二乘法可能會被數(shù)據(jù)中的離群點(diǎn)、假維度和噪聲干擾。因此,我們需要用約束來減少數(shù)據(jù)集上擬合的線的方差。正確的方法是擬合一個權(quán)重可控的線性回歸模型。模型可以用L1正則(LASSO)或L2正則(Ridge Regression)或二者混合(elastic回歸)。經(jīng)過正則處理后對均方損失進(jìn)行優(yōu)化。

使用這些算法擬合具有約束性的回歸線,避免從模型中過度擬合和掩藏干擾維度。
Libraries:
- http://scikit-learn.org/stable/modules/linear_model.html
Introductory Tutorial(s):
- https://www.youtube.com/watch?v=5asL5Eq2x0A
- https://www.youtube.com/watch?v=jbwSCwoT51M
3. K-均值聚類
這是所有人都喜歡的非監(jiān)督學(xué)習(xí)聚類算法。給定一組矢量形式的數(shù)據(jù)點(diǎn),我們可以基于它們之間的距離生成數(shù)據(jù)點(diǎn)群。它是一種期望最大化的算法,反復(fù)地移動群組的中心,然后聚集每個群組中心點(diǎn)。此算法所采用的輸入是生成群組的數(shù)量,并且它將嘗試匯集群組的迭代次數(shù)。

從名稱中就可以看出,你可以使用這種算法在數(shù)據(jù)集中創(chuàng)建K集群。
Library:
- http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
Introductory Tutorial(s):
- https://www.youtube.com/watch?v=hDmNF9JG3lo
- https://www.datascience.com/blog/k-means-clustering
4. 邏輯回歸
邏輯回歸是一種約束線性回歸,它的結(jié)果進(jìn)行了非線性變換(常用的是sigmoid函數(shù),或者tanh也可以),因此把輸出限制成了+/-類的輸出(在sigmoid中是1和0)。
交叉熵?fù)p失函數(shù)(Cross-Entropy Loss)用梯度下降法(Gradient Descent)優(yōu)化。對初學(xué)者來說,邏輯回歸用于分類,而不是回歸。你也可以把邏輯回歸看作一層神經(jīng)網(wǎng)絡(luò)。邏輯回歸通過使用梯度下降法或者L-BFGS算法優(yōu)化。NLP自然語言處理者們通常把它稱之為最大熵分類器。

使用LR來訓(xùn)練非常簡單,卻是十分強(qiáng)有力的分類器。
Library:http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.htmlIntroductory Tutorial(s):https://www.youtube.com/watch?v=-la3q9d7AKQ
5.SVM(支持向量機(jī))
- SVM(支持向量機(jī))是線性模型,類似線性/邏輯回歸。不同之處在于它們具有不同的基于邊際損失函數(shù)(支持向量的推導(dǎo)是我所看到過的最美的數(shù)理成果之一,和特征值的計算可以媲美)。你可以使用諸如B-FGS甚至SGD等優(yōu)化方法來優(yōu)化損失函數(shù)。

- SVMs的另一個創(chuàng)新是,在特征工程中kernel使用。如果你有很好的領(lǐng)域洞察力,你可以用更好的kernel來代替舊的RBF kernel,并從中受益。
- SVMs獨(dú)一無二的特性就是可以學(xué)習(xí)一個類別的分類器
- SVMs可以用來訓(xùn)練分類器(甚至回歸函數(shù))。
Library:
- http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
Introductory Tutorial(s):
- https://www.youtube.com/watch?v=eHsErlPJWUU
6. 前饋神經(jīng)網(wǎng)絡(luò)
這些基本上是多層邏輯回歸分類器。許多層權(quán)重由非線性(SigMOID,TANH,Relu+SULTMax和cool new SELU)分隔。它另一個比較知名的名字是多層感知器。前饋神經(jīng)網(wǎng)絡(luò)作為自動編碼器,可用于分類和非監(jiān)督特征學(xué)習(xí)。


前饋神經(jīng)網(wǎng)絡(luò)作為自動編碼器,可用于訓(xùn)練分類器或提取特征。
Libraries:
- 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
Introductory Tutorial(s):
- http://www.deeplearningbook.org/contents/mlp.html
- http://www.deeplearningbook.org/contents/autoencoders.html
- http://www.deeplearningbook.org/contents/representation.html
7. 卷積神經(jīng)網(wǎng)絡(luò)(Convnets)
當(dāng)今,世界上幾乎所有基于視覺的機(jī)器學(xué)習(xí)成果,都已經(jīng)通過卷積神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)。它們可以用于圖像分類、目標(biāo)檢測甚至圖像分割。
這是Yann Lecun在上世紀(jì)80年代末90年代初的發(fā)明,其特征在于卷積層充當(dāng)分層特征提取器。你也可以在文本中使用它們(甚至是圖形)。

convnets用于最先進(jìn)的圖像和文本分類、目標(biāo)檢測、圖像分割。
Libraries:
- https://developer.nvidia.com/digits
- https://github.com/kuangliu/torchcv
- https://github.com/chainer/chainercv
- https://keras.io/applications/
Introductory Tutorial(s):
- http://cs231n.github.io/
- https://adeshpande3.github.io/A-Beginner%27s-Guide-To-Understanding-Convolutional-Neural-Networks/
8. 遞歸神經(jīng)網(wǎng)絡(luò)(RNNs)
RNN通過在聚合狀態(tài)下,遞歸的使用同樣的權(quán)重,來對一個序列建模。前提是這個序列在0..t..T時間點(diǎn)上有輸入,并且在時間t有從RNN的t-1步輸出的隱含層。
現(xiàn)在純的RNN已經(jīng)很少使用了,取而代之的是代表序列建模最前沿的,與它對應(yīng)的LSTMs和GRUs。

RNN(如果有緊密連接和非線性,現(xiàn)在f通常是LSTMs和GRUs的)。在純的RNN中,LSTM單元取代了緊密連接層。

使用RNNs去完成序列建模的任務(wù),如文本分類、機(jī)器翻譯、語言建模。
Library:
- https://github.com/tensorflow/models (Many cool NLP research papers from Google are here)
- https://github.com/wabyking/TextClassificationBenchmark
- http://opennmt.net/
Introductory Tutorial(s):
- http://cs224d.stanford.edu/
- http://www.wildml.com/category/neural-networks/recurrent-neural-networks/
- http://colah.github.io/posts/2015-08-Understanding-LSTMs/
9. 條件隨機(jī)場(CRFs)
CRFS可能是概率圖形模型家族(PGMs)中最常用的模型。它們被用于像RNNs這樣的序列建模,也可以與RNNs結(jié)合使用。它是神經(jīng)機(jī)器翻譯系統(tǒng)進(jìn)入CRFs之前最先進(jìn)的技術(shù),并且在許多序列中用小的數(shù)據(jù)集標(biāo)記任務(wù)。
目前,CRFS仍然比RNNs這樣需要大量數(shù)據(jù)量支撐的算法更有優(yōu)勢。它們也可用于其他結(jié)構(gòu)化預(yù)測任務(wù),如圖像分割等。CRF對序列中的每一個元素(例如一個句子)進(jìn)行建模,使得其序列中某個組件的標(biāo)簽相互影響,而不是所有的標(biāo)簽彼此獨(dú)立。
使用CRFs標(biāo)記序列(文本、圖像、時間序列、DNA等)。
Library:
- https://sklearn-crfsuite.readthedocs.io/en/latest/
Introductory Tutorial(s):
- http://blog.echen.me/2012/01/03/introduction-to-conditional-random-fields/
10. 決策樹
假如,我得到一份關(guān)于各種水果數(shù)據(jù)的Excel表格,并需要告知哪些是蘋果時,會拋出這么幾個問題:
第一個問題:“哪些水果是紅色+圓形的?” 并用“是”和“否”來區(qū)分所有水果。 不過,所有的紅色+圓形水果可能不是蘋果,所有的蘋果都不會只是紅色+圓形的。
第二個問題:在所有的紅色+圓形水果中“哪些有紅色or黃色的特征?” 同時我也會問,在所有非紅色的圓形水果中“哪些是綠色+圓的。”
基于這些問題,我可以準(zhǔn)確地分辨出哪些是蘋果。
這一連串的問題就是決策樹。
但是,這是一個基于我們直覺的決策樹。直覺并不能在高維和復(fù)雜的數(shù)據(jù)上工作。我們必須通過查看標(biāo)記數(shù)據(jù)來自動提出這一連串的問題。這就是基于決策樹的機(jī)器學(xué)習(xí)技術(shù)所要做的。
早期的版本如CART樹,曾經(jīng)被用于處理簡單的數(shù)據(jù),但隨著數(shù)據(jù)集越來越大,權(quán)衡方差與偏差需要用更好的算法來解決。如今正在使用的兩種常用決策樹算法是隨機(jī)森林(在屬性的隨機(jī)子集上建立不同的分類器,并將它們組合成輸出)和提升樹(它不停地訓(xùn)練上層,用于糾正下層的錯誤)
決策樹可以用來對數(shù)據(jù)點(diǎn)進(jìn)行分類(甚至回歸)。
Libraries:
- http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
- http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html
- http://xgboost.readthedocs.io/en/latest/
- https://catboost.yandex/
Introductory Tutorial:
- 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
(圖片來源于網(wǎng)絡(luò))
TD算法(值得擁有)
如果你還想知道上述任何一種算法,是如何做到像Deepmind Go那樣擊敗世界冠軍,很遺憾它們做不到。
在這之前我們討論的所有10種算法都是模式識別,而不是策略學(xué)習(xí)。要通過學(xué)習(xí)策略解決一個多步驟的問題,比如贏得國際象棋游戲或玩雅達(dá)利游戲機(jī),我們需要反復(fù)訓(xùn)練并從獎懲制度中學(xué)習(xí)。
這部分機(jī)器學(xué)習(xí)技術(shù)我們稱之為深度強(qiáng)化學(xué)習(xí)。在這一領(lǐng)域的許多成功案例是融合了Convent或LSTM的感知能力產(chǎn)生的結(jié)果,這一些列算法稱之為時間差異學(xué)習(xí)。
這里面包括Q-Learning, SARSA和一些其它變型。這些算法在Bellman’s equations貝爾曼方程中非常智能,它可以通過從環(huán)境中獲得的獎勵訓(xùn)練,從而獲取損失函數(shù)。
這些算法大多用于自動玩游戲,以及其他與語言生成和目標(biāo)檢測有關(guān)的應(yīng)用。