Python 和 Scikit-Learn

Reference:http://mp.weixin.qq.com/s?src=3&timestamp=1474985436&ver=1&signature=at24GKibwNNoE9VsETitURyMHzXYeytp1MoUyAFx-2WOZTdPelAdJBv9nkMPyczdr4riYdUZWOaUInIFOxWELVDugvJJxpeEgp5KWDFFtwR8VYalYfPvdWdrmi*Qoq9shyPnROU3Tch32ieV9V8clw==html

python data analysis | python數據預處理(基於scikit-learn模塊)​​​​​​​python

如今,不少人想開發高效的算法以及參加機器學習的競賽。因此他們過來問我:」該如何開始?」。一段時間之前,我在一個俄羅斯聯邦政府的下屬機構中領導了媒體和社交網絡大數據分析工具的開發。我仍然有一些我團隊使用過的文檔,我樂意與大家分享。前提是讀者已經有很好的數學和機器學習方面的知識(個人團隊主要由MIPT(莫斯科物理與技術大學)和數據分析學院的畢業生構成)。算法

這篇文章是對數據科學的簡介,這門學科最近太火了。機器學習的競賽也愈來愈多(如,Kaggle, TudedIT),並且他們的資金一般很可觀。數組

R和Python是提供給數據科學家的最經常使用的兩種工具。每個工具都有其優缺點,但Python最近在各個方面都有所勝出(僅爲鄙人愚見,雖然我二者都用)。這一切的發生是由於Scikit-Learn庫的騰空出世,它包含有完善的文檔和豐富的機器學習算法。網絡

請注意,咱們將主要在這篇文章中探討機器學習算法。一般用Pandas包去進行主數據分析會比較好,並且這很容易你本身完成。因此,讓咱們集中精力在實現上。爲了肯定性,咱們假設有一個特徵-對象矩陣做爲輸入,被存在一個*.csv文件中。dom

數據加載機器學習

首先, 下載ftp://ftp.ics.uci.edu/pub/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data 數據保存到本地磁盤,而後numpy在加載信息,才能對其操做。Scikit-Learn庫在它的實現用使用了NumPy數組,因此咱們將用NumPy來加載*.csv文件。函數

import numpy as np
 
dataset = np.loadtxt("d:\\test.csv",delimiter=",")
X = dataset[:,0:7]
y = dataset[:,8]


咱們將在下面全部的例子裏使用這個數據組,換言之,使用X特徵物數組和y目標變量的值。工具

數據標準化學習

咱們都知道大多數的梯度方法(幾乎全部的機器學習算法都基於此)對於數據的縮放很敏感。所以,在運行算法以前,咱們應該進行標準化,或所謂的規格化。標準化包括替換全部特徵的名義值,讓它們每個的值在0和1之間。而對於規格化,它包括數據的預處理,使得每一個特徵的值有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_)


特徵的選取

毫無疑問,解決一個問題最重要的是是恰當選取特徵、甚至創造特徵的能力。這叫作特徵選取和特徵工程。雖然特徵工程是一個至關有創造性的過程,有時候更多的是靠直覺和專業的知識,但對於特徵的選取,已經有不少的算法可供直接使用。如樹算法就能夠計算特徵的信息量。

其餘全部的方法都是基於對特徵子集的高效搜索,從而找到最好的子集,意味着演化了的模型在這個子集上有最好的質量。遞歸特徵消除算法(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_)


算法的開發

正像我說的,Scikit-Learn庫已經實現了全部基本機器學習的算法。讓我來瞧一瞧它們中的一些。

邏輯迴歸

大多數狀況下被用來解決分類問題(二元分類),但多類的分類(所謂的一對多方法)也適用。這個算法的優勢是對於每個輸出的對象都有一個對應類別的機率。

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.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))


k-最近鄰

kNN(k-最近鄰)方法一般用於一個更復雜分類算法的一部分。例如,咱們能夠用它的估計值作爲一個對象的特徵。有時候,一個簡單的kNN算法在良好選擇的特徵上會有很出色的表現。當參數(主要是metrics)被設置得當,這個算法在迴歸問題中一般表現出最好的質量。

from sklearn import metrics
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier()
model.fit(X, Y)
print(model)
expected = Y
predicted = model.predict(X)
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))


決策樹

分類和迴歸樹(CART)常常被用於這麼一類問題,在這類問題中對象有可分類的特徵且被用於迴歸和分類問題。決策樹很適用於多類分類。

from sklearn import metrics
from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
model.fit(X, Y)
print(model)
expected = Y
predicted = model.predict(X)
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))


支持向量機

SVM(支持向量機)是最流行的機器學習算法之一,它主要用於分類問題。一樣也用於邏輯迴歸,SVM在一對多方法的幫助下能夠實現多類分類。

from sklearn import metrics
from sklearn.svm import SVC
model = SVC()
model.fit(X, Y)
print(model)
expected = Y
predicted = model.predict(X)
print(metrics.classification_report(expected, predicted))
print(metrics.confusion_matrix(expected, predicted))


除了分類和迴歸問題,Scikit-Learn還有海量的更復雜的算法,包括了聚類, 以及創建混合算法的實現技術,如Bagging和Boosting。

如何優化算法的參數

在編寫高效的算法的過程當中最難的步驟之一就是正確參數的選擇。通常來講若是有經驗的話會容易些,但不管如何,咱們都得尋找。幸運的是Scikit-Learn提供了不少函數來幫助解決這個問題。

做爲一個例子,咱們來看一下規則化參數的選擇,在其中很多數值被相繼搜索了:

import numpy as np
from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV
alphas = np.array([1,0.1,0.01,0.001,0.0001,0])
model = Ridge()
grid = GridSearchCV(estimator=model, param_grid=dict(alpha=alphas))
grid.fit(X, Y)
print(grid)
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.model_selection import RandomizedSearchCV
param_grid = {'alpha': sp_rand()}
model = Ridge()
rsearch = RandomizedSearchCV(estimator=model, param_distributions=param_grid, n_iter=100)
rsearch.fit(X, Y)
print(rsearch)
print(rsearch.best_score_)
print(rsearch.best_estimator_.alpha)


至此咱們已經看了整個使用Scikit-Learn庫的過程,除了將結果再輸出到一個文件中。這個就做爲你的一個練習吧,和R相比Python的一大優勢就是它有很棒的文檔說明。
test.csv

相關文章
相關標籤/搜索