基于Python和Scikit-Learn的機器學習探索
你好,%用戶名%!
我叫Alex,我在機器學習和網絡圖分析(主要是理論)有所涉獵。我同時在為一家俄羅斯移動運營商開發(fā)大數據產品。這是我第一次在網上寫文章,不喜勿噴。
現在,很多人想開發(fā)高效的算法以及參加機器學習的競賽。所以他們過來問我:”該如何開始?”。一段時間以前,我在一個俄羅斯聯邦政府的下屬機構中領導了媒體和社交網絡大數據分析工具的開發(fā)。我仍然有一些我團隊使用過的文檔,我樂意與你們分享。前提是讀者已經有很好的數學和機器學習方面的知識(我的團隊主要由MIPT(莫斯科物理與技術大學)和數據分析學院的畢業(yè)生構成)。
這篇文章是對數據科學的簡介,這門學科最近太火了。機器學習的競賽也越來越多(如,Kaggle, TudedIT),而且他們的資金通常很可觀。
R和Python是提供給數據科學家的最常用的兩種工具。每一個工具都有其優(yōu)缺點,但Python最近在各個方面都有所勝出(僅為鄙人愚見,雖然我兩者都用)。這一切的發(fā)生是因為Scikit-Learn庫的騰空出世,它包含有完善的文檔和豐富的機器學習算法。
請注意,我們將主要在這篇文章中探討機器學習算法。通常用Pandas包去進行主數據分析會比較好,而且這很容易你自己完成。所以,讓我們集中精力在實現上。為了確定性,我們假設有一個特征-對象矩陣作為輸入,被存在一個*.csv文件中。
數據加載
首先,數據要被加載到內存中,才能對其操作。Scikit-Learn庫在它的實現用使用了NumPy數組,所以我們將用NumPy來加載*.csv文件。讓我們從UCI Machine Learning Repository下載其中一個數據集。
import numpy as np import urllib # url with dataset url = “http://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data” # download the file raw_data = urllib.urlopen(url) # load the CSV file as a numpy matrix dataset = np.loadtxt(raw_data, delimiter=“,”) # separate the data from the target attributes X = dataset[:,0:7] y = dataset[:,8]
我們將在下面所有的例子里使用這個數據組,換言之,使用X特征物數組和y目標變量的值。
數據標準化
我們都知道大多數的梯度方法(幾乎所有的機器學習算法都基于此)對于數據的縮放很敏感。因此,在運行算法之前,我們應該進行標準化,或所謂的規(guī)格化。標準化包括替換所有特征的名義值,讓它們每一個的值在0和1之間。而對于規(guī)格化,它包括數據的預處理,使得每個特征的值有0和1的離差。Scikit-Learn庫已經為其提供了相應的函數。
from sklearn import metrics from sklearn.ensemble import ExtraTreesClassifier model = ExtraTreesClassifier() model.fit(X, y)# display the relative importance of each attribute print(model.feature_importances_)
特征的選取
毫無疑問,解決一個問題最重要的是是恰當選取特征、甚至創(chuàng)造特征的能力。這叫做特征選取和特征工程。雖然特征工程是一個相當有創(chuàng)造性的過程,有時候更多的是靠直覺和專業(yè)的知識,但對于特征的選取,已經有很多的算法可供直接使用。如樹算法就可以計算特征的信息量。
from sklearn import metrics from sklearn.ensemble import ExtraTreesClassifier model = ExtraTreesClassifier() model.fit(X, y)# display the relative importance of each attribute print(model.feature_importances_)
其他所有的方法都是基于對特征子集的高效搜索,從而找到最好的子集,意味著演化了的模型在這個子集上有最好的質量。遞歸特征消除算法(RFE)是這些搜索算法的其中之一,Scikit-Learn庫同樣也有提供。
from sklearn.feature_selection import RFE from sklearn.linear_model import LogisticRegression model = LogisticRegression()# create the RFE model and select 3 attributes rfe = RFE(model, 3) rfe = rfe.fit(X, y)# summarize the selection of the attributes print(rfe.support_) print(rfe.ranking_)
算法的開發(fā)
正像我說的,Scikit-Learn庫已經實現了所有基本機器學習的算法。讓我來瞧一瞧它們中的一些。
邏輯回歸
大多數情況下被用來解決分類問題(二元分類),但多類的分類(所謂的一對多方法)也適用。這個算法的優(yōu)點是對于每一個輸出的對象都有一個對應類別的概率。
from sklearn import metrics from sklearn.linear_model import LogisticRegression model = LogisticRegression() model.fit(X, y) print(model)# make predictions expected = y predicted = model.predict(X)# summarize the fit of the model print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted))
樸素貝葉斯
它也是最有名的機器學習的算法之一,它的主要任務是恢復訓練樣本的數據分布密度。這個方法通常在多類的分類問題上表現的很好。
from sklearn import metrics from sklearn.naive_bayes import GaussianNB model = GaussianNB() model.fit(X, y) print(model)# make predictions expected = y predicted = model.predict(X)# summarize the fit of the model print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted))
k-最近鄰
kNN(k-最近鄰)方法通常用于一個更復雜分類算法的一部分。例如,我們可以用它的估計值做為一個對象的特征。有時候,一個簡單的kNN
from sklearn import metrics from sklearn.neighbors import KNeighborsClassifier# fit a k - nearest neighbor model to the data model = KNeighborsClassifier() model.fit(X, y) print(model)# make predictions expected = y predicted = model.predict(X)# summarize the fit of the model print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted))
決策樹
分類和回歸樹(CART)經常被用于這么一類問題,在這類問題中對象有可分類的特征且被用于回歸和分類問題。決策樹很適用于多類分類。
from sklearn import metrics from sklearn.tree import DecisionTreeClassifier# fit a CART model to the data model = DecisionTreeClassifier() model.fit(X, y) print(model)# make predictions expected = y predicted = model.predict(X)# summarize the fit of the model print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted))
支持向量機
SVM(支持向量機)是最流行的機器學習算法之一,它主要用于分類問題。同樣也用于邏輯回歸,SVM在一對多方法的幫助下可以實現多類分類。
from sklearn import metrics from sklearn.svm import SVC # fit a SVM model to the data model = SVC() model.fit(X, y) print(model) # make predictions expected = y predicted = model.predict(X) # summarize the fit of the model print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted))
除了分類和回歸問題,Scikit-Learn還有海量的更復雜的算法,包括了聚類, 以及建立混合算法的實現技術,如Bagging和Boosting。
如何優(yōu)化算法的參數
在編寫高效的算法的過程中最難的步驟之一就是正確參數的選擇。一般來說如果有經驗的話會容易些,但無論如何,我們都得尋找。幸運的是Scikit-Learn提供了很多函數來幫助解決這個問題。
作為一個例子,我們來看一下規(guī)則化參數的選擇,在其中不少數值被相繼搜索了:
import numpy as np from sklearn.linear_model import Ridge from sklearn.grid_search import GridSearchCV# prepare a range of alpha values to test alphas = np.array([1, 0.1, 0.01, 0.001, 0.0001, 0])# create and fit a ridge regression model, testing each alpha model = Ridge() grid = GridSearchCV(estimator = model, param_grid = dict(alpha = alphas)) grid.fit(X, y) print(grid)# summarize the results of the grid search print(grid.best_score_) print(grid.best_estimator_.alpha)
有時候隨機地從既定的范圍內選取一個參數更為高效,估計在這個參數下算法的質量,然后選出最好的。
import numpy as np from scipy.stats import uniform as sp_rand from sklearn.linear_model import Ridge from sklearn.grid_search import RandomizedSearchCV# prepare a uniform distribution to sample for the alpha parameter param_grid = {‘ alpha': sp_rand() }# create and fit a ridge regression model, testing random alpha values model = Ridge() rsearch = RandomizedSearchCV(estimator = model, param_distributions = param_grid, n_iter = 100) rsearch.fit(X, y) print(rsearch)# summarize the results of the random parameter search print(rsearch.best_score_) print(rsearch.best_estimator_.alpha)
至此我們已經看了整個使用Scikit-Learn庫的過程,除了將結果再輸出到一個文件中。這個就作為你的一個練習吧,和R相比Python的一大優(yōu)點就是它有很棒的文檔說明。
總結
以上就是本文關于基于Python和Scikit-Learn的機器學習探索的全部內容,感興趣的朋友可以參閱:python 排序算法總結及實例詳解、Java 蒙特卡洛算法求圓周率近似值實例詳解、Java常見數據結構面試題(帶答案)以及本站其他相關專題,如有不足之處,歡迎留言指出,小編一定及時回復大家并改正,為廣大編程愛好者提供更優(yōu)質的文章以及更好的幫助,感謝朋友們對本站的支持!
- Python機器學習庫scikit-learn入門開發(fā)示例
- 使用Python和scikit-learn創(chuàng)建混淆矩陣的示例詳解
- Python機器學習工具scikit-learn的使用筆記
- Python機器學習算法庫scikit-learn學習之決策樹實現方法詳解
- python機器學習庫scikit-learn:SVR的基本應用
- Python機器學習之scikit-learn庫中KNN算法的封裝與使用方法
- python的scikit-learn將特征轉成one-hot特征的方法
- Python機器學習庫scikit-learn安裝與基本使用教程
- Python scikit-learn 做線性回歸的示例代碼
- Python數據分析之使用scikit-learn構建模型
相關文章
aws 通過boto3 python腳本打pach的實現方法
這篇文章主要介紹了aws 通過boto3 python腳本打pach的實現方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05舉例講解Linux系統(tǒng)下Python調用系統(tǒng)Shell的方法
這篇文章主要介紹了舉例講解Linux系統(tǒng)下Python調用系統(tǒng)Shell的方法,包括用Python和shell讀取文件某一行的實例,需要的朋友可以參考下2015-11-11TensorFlow2基本操作之 張量排序 填充與復制 查找與替換
這篇文章主要介紹了TensorFlow2基本操作之 張量排序 填充與復制 查找與替換,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09對tensorflow中cifar-10文檔的Read操作詳解
今天小編就為大家分享一篇對tensorflow中cifar-10文檔的Read操作詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02在Python的Tornado框架中實現簡單的在線代理的教程
這篇文章主要介紹了在Python的Tornado框架中實現簡單的在線代理的教程,代理功能是一個常見的網絡編程實現,需要的朋友可以參考下2015-05-05