學習機器學習相關(guān)技術(shù)的最好方式就是先自己設(shè)計和完成一些小項目。 Python 是一種非常流行和強大的解釋性編程語言,。不像 R 語言,,Python 是個很完整的語言和平臺,你既可以用來做研發(fā),,也可以用來開發(fā)產(chǎn)品體系,。 而且,Python 還有很多模塊和程序庫供我們選擇,,從而針對一個任務能有很多個解決方案,。怎么樣,聽起來還是很厲害的吧,? 如果用 Python 執(zhí)行機器學習,,剛開始時最好方式就是先完成一個小項目,為什么這么說呢,? 因為這會讓你先懂得如何安裝和啟動 Python 解釋器(這是最起碼的要求吧),。 新手很需要一個完整的小項目練手 教材書還有課程這些東西還是比較煩人的,雖然給你講解的很細,,講的也很多,,但都太零碎,,你單靠這些很難領(lǐng)會這些知識點如何綜合運用到一起。 將機器學習運用到自己的數(shù)據(jù)集上時,,就算是開始一個項目了,。 一個機器學習項目可能并不是直線式的,但是很多步驟都是耳熟能詳:定義問題,。 真正掌握一個新平臺新工具的最好方法,,就是用它一步步完成一個完整的機器學習項目,,并涉及所有的重要步驟,也就是從導入數(shù)據(jù),,總結(jié)數(shù)據(jù),,評估算法到做出預測等。 這么一套流程操作下來,,你大概就能明白其中的套路了,。 機器學習的 Hello World先開始拿來練手的一個最好的小項目就是分類鳶尾花(數(shù)據(jù)集鏈接),這項目很適合新手,,因為非常簡單易懂,。 因為屬性都是數(shù)值,所以你要知道這么去導入和處理數(shù)據(jù),。 該項目是個分類問題,,能讓你練習操作一種相對簡單的監(jiān)督式學習算法。 同時它也是個多類分類問題,,因此可能需要一些特殊的處理方法,。 它只有 4 個屬性和 150 個示例,意味著數(shù)據(jù)集很小,,不會占太多內(nèi)存,。 所有數(shù)值屬性都有相同的單位和大小,在使用前無需進行特別的縮放和轉(zhuǎn)換,。 下面我們就開始學習如何用 Python 執(zhí)行機器學習中的 Hello World,。 用 Python 進行機器學習:手把手教程在這部分,我們會完成一個完整的機器學習小項目,,下面是主要步驟: 安裝 Python 和 SciPy 平臺,。 可以自己試著敲命令行代碼,,要想加快速度,,也可以復制粘貼我的代碼。 1.下載,、安裝和啟動 Python SciPy如果你電腦上沒安裝,,先安裝 Python 和 SciPy 平臺。 這部分不再細說,,因為網(wǎng)上有很多教程,。 1.1 安裝 SciPy 程序庫本文所用 Python 版本為 2.7 或 3.5 。 scipy numpy matplotlib pandas Sklearn 安裝上面這些程序庫有很多種方法,,建議選擇選擇一種方法,,然后安裝這些程序庫都用這種方法。 SciPy 安裝頁面上提供了在多種系統(tǒng)安裝上文程序庫的詳細方法: 在 Mac OS 上,,你可以用 macports 安裝 Python2.7 和這些程序庫,,更多信息點擊這里 注意:上面這些方法的基礎(chǔ)是你的電腦上已經(jīng)安裝了 0.18 或更高版本的 scikit-learn,。 1.2啟動 Python,檢查程序版本這一步很重要,,一定要確保你成功安裝了 Python 環(huán)境,,可以正常運行。 下面的腳本可以幫你測試你的 Python 環(huán)境,,它會導入本教程所需的每個程序庫,,并導出相應版本。 打開命令行,,啟動 Python 解釋器: Python 我建議你直接在解釋器上工作,,或者寫出腳本后在命令行上運行,不用在很大的編輯器和 IDE上跑腳本,。我們要關(guān)注的重點是機器學習,,而不是軟件工具。 輸入或復制粘貼以下腳本: # Check the versions of libraries # Python version import sys print('Python: {}'.format(sys.version)) # scipy import scipy print('scipy: {}'.format(scipy.__version__)) # numpy import numpy print('numpy: {}'.format(numpy.__version__)) # matplotlib import matplotlib print('matplotlib: {}'.format(matplotlib.__version__)) # pandas import pandas print('pandas: {}'.format(pandas.__version__)) # scikit-learn import sklearn print('sklearn: {}'.format(sklearn.__version__)) 如果在 OS X 工作站上運行,,會得到如下輸出: Python: 2.7.11 (default, Mar 1 2016, 18:40:10) [GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] scipy: 0.17.0 numpy: 1.10.4 matplotlib: 1.5.1 pandas: 0.17.1 sklearn: 0.18.1 可以和你自己的輸出對照一下,。 理想狀況下,兩者應該一樣或者大部分很接近,。API 一般不會快速變化,,所以如果你的版本有點低的話,,也不用擔心,本教程仍然適用你后面的學習,。 如果你在這里出現(xiàn)了錯誤,,先暫停一下,修正錯誤,。 如果你沒法流暢的運行上述腳本,,那你后面就沒法完整地完成這篇教程。 建議針對你出現(xiàn)的錯誤上網(wǎng)搜一下,,或者問問有經(jīng)驗的人,,比如上集智社區(qū)。 2.導入數(shù)據(jù)我們要用的是鳶尾花數(shù)據(jù)集,,這數(shù)據(jù)集很有名,,幾乎入門學習機器學習的人最先用的數(shù)據(jù)集就是它了,可以說是機器學習數(shù)據(jù)集中的 Hello Word,。 它包含了 150 個鳶尾花觀察值,花的測量值以厘米為單位分為 4 列,。第 5 列是觀察到的花朵的種類,。所有觀察花朵都屬于三個種類。 在這一步,,我們會從 CSV 文件 URL 中導入鳶尾花數(shù)據(jù),。 2.1 導入程序庫首先,我們導入本教程用到的所有模塊,、函數(shù)和對象,。 # Load libraries import pandas from pandas.plotting import scatter_matrix import matplotlib.pyplot as plt from sklearn import model_selection from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix from sklearn.metrics import accuracy_score from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.naive_bayes import GaussianNB from sklearn.svm import SVC 所有信息導入時必須準確無誤。如果出現(xiàn)錯誤,,馬上停止,。在繼續(xù)操作前,一定確保得到正確的 SciPy 環(huán)境,。 2.2 導入數(shù)據(jù)集我們可以從 UCI 機器學習庫中直接導入數(shù)據(jù),,使用工具為 Pandas。我們下面還會接著用它來進行數(shù)據(jù)統(tǒng)計和可視化工作,。 注意,,我們在導入數(shù)據(jù)時會指明每一列的名字,這有助于后面我們處理數(shù)據(jù),。 # Load dataset url = "https://archive.ics./ml/machine-learning-databases/iris/iris.data" names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class'] dataset = pandas.read_csv(url, names=names) 導入數(shù)據(jù)集時也應沒有任何差錯,。 如果你出現(xiàn)了網(wǎng)絡(luò)問題,可以將iris.data 文件下載至你的工作目錄,,然后將 URL 改為本地文件名,,用同樣的方法導入它,。 3.總結(jié)數(shù)據(jù)集 現(xiàn)在我們可以看一看數(shù)據(jù)了。 在這一步,,我們以多個方式分析一下數(shù)據(jù): 數(shù)據(jù)集的維度,。 別擔心,每種方式只有一行命令行,。這些命令行不是一次性的,,將來項目里可以重復使用,絕不浪費,。 3.1 數(shù)據(jù)集維度我們可以快速的了解數(shù)據(jù)的形狀屬性包含了多少行(示例)和多少列(屬性),。 # shape print(dataset.shape) 你應該會看到有 150 行和 5 列: (150, 5) 3.2 詳細查看數(shù)據(jù)認認真真看看你數(shù)據(jù)總歸是件好事。 # head print(dataset.head(20)) 你應該會看到數(shù)據(jù)的前20行: sepal-length sepal-width petal-length petal-width class 0 5.1 3.5 1.4 0.2 Iris-setosa 1 4.9 3.0 1.4 0.2 Iris-setosa 2 4.7 3.2 1.3 0.2 Iris-setosa 3 4.6 3.1 1.5 0.2 Iris-setosa 4 5.0 3.6 1.4 0.2 Iris-setosa 5 5.4 3.9 1.7 0.4 Iris-setosa 6 4.6 3.4 1.4 0.3 Iris-setosa 7 5.0 3.4 1.5 0.2 Iris-setosa 8 4.4 2.9 1.4 0.2 Iris-setosa 9 4.9 3.1 1.5 0.1 Iris-setosa 10 5.4 3.7 1.5 0.2 Iris-setosa 11 4.8 3.4 1.6 0.2 Iris-setosa 12 4.8 3.0 1.4 0.1 Iris-setosa 13 4.3 3.0 1.1 0.1 Iris-setosa 14 5.8 4.0 1.2 0.2 Iris-setosa 15 5.7 4.4 1.5 0.4 Iris-setosa 16 5.4 3.9 1.3 0.4 Iris-setosa 17 5.1 3.5 1.4 0.3 Iris-setosa 18 5.7 3.8 1.7 0.3 Iris-setosa 19 5.1 3.8 1.5 0.3 Iris-setosa 3.3 統(tǒng)計摘要 現(xiàn)在我們可以看看對每個屬性的統(tǒng)計摘要,,包含了數(shù)量,、平均值、最大值,、最小值,,還有一些百分位數(shù)值。 # descriptions print(dataset.describe()) 我們可以看到所有的數(shù)字值都有相同的單位(厘米),,大小也都在0到8厘米之間,。 sepal-length sepal-width petal-length petal-width count 150.000000 150.000000 150.000000 150.000000 mean 5.843333 3.054000 3.758667 1.198667 std 0.828066 0.433594 1.764420 0.763161 min 4.300000 2.000000 1.000000 0.100000 25% 5.100000 2.800000 1.600000 0.300000 50% 5.800000 3.000000 4.350000 1.300000 75% 6.400000 3.300000 5.100000 1.800000 max 7.900000 4.400000 6.900000 2.500000 3.4 類別分布 我們現(xiàn)在看一看屬于每個類別下的行的數(shù)量,可以將其看作一個絕對計數(shù),。 class Iris-setosa 50 Iris-versicolor 50 Iris-virginica 50 4.數(shù)據(jù)可視化我們現(xiàn)在對數(shù)據(jù)已經(jīng)有了一個基本的了解,,現(xiàn)在需要用一些可視化形式再擴展一下對數(shù)據(jù)的認識。 主要是看兩種可視化圖: 單變量圖形,,從而更好的理解每個屬性,。 4.1 單變量圖形我們先以一些單變量圖形開始,,也就是每個單獨變量的圖形。 考慮到輸入變量都是數(shù)字,,我們可以為每個輸入變量創(chuàng)建箱線圖,。 # box and whisker plots dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False) plt.show() 這能讓我們更清晰的看到輸入屬性的分布狀況: 我們也可以為每個輸入變量創(chuàng)建一個直方圖以了解它們的分布狀況。 # histograms dataset.hist() plt.show() 似乎其中兩個輸入變量呈高斯分布,,這點是有點用的,,因為我們后面可以用算法充分利用這個假設(shè)。 4.2 多變量圖形現(xiàn)在我們可以看看變量之間的相互作用。 首先,,我們看看全部屬性對的散點圖,,這有助于我們看出輸入變量之間的結(jié)構(gòu)化關(guān)系。 # scatter plot matrix scatter_matrix(dataset) plt.show() 注意一些屬性對呈對角線分布,,這顯示了它們之間有高度關(guān)聯(lián)性以及可預測的關(guān)系,。 5.評估算法現(xiàn)在我們?yōu)閿?shù)據(jù)搭建一些模型,并測試它們對不可見數(shù)據(jù)的準確度,。 這一部分的主要步驟為: 將數(shù)據(jù)集分離出一個驗證集,。 5.1 創(chuàng)建驗證集我們需要知道搭建的模型效果怎樣,。后面我們會用統(tǒng)計方法來驗證模型對新數(shù)據(jù)的準確度,。我們還希望通過評估模型在真正不可見數(shù)據(jù)時的表現(xiàn),來進一步確定模型的準確度,。 也就是我們會留一些數(shù)據(jù)不讓算法看到,,然后用這些數(shù)據(jù)來確定模型到底有多準確。 我們會將導入的數(shù)據(jù)集拆分為兩部分,,80% 用于訓練模型,,20% 用于驗證模型。 # Split-out validation dataset array = dataset.values X = array[:,0:4] Y = array[:,4] validation_size = 0.20 seed = 7 X_train, X_validation, Y_train, Y_validation = model_selection.train_test_split(X, Y, test_size=validation_size, random_state=seed) 得到的 X_train 和 Y_train 里的訓練數(shù)據(jù)用于準備模型,,得到的 X_validation 和 Y_validation 集我們后面會用到。 5.2 測試工具我們會用十折交叉驗證法測試模型的準確度,。 這會將我們的數(shù)據(jù)集分成 10 部分,,輪流將其中 9 份作為訓練數(shù)據(jù),1份作為測試數(shù)據(jù),,進行試驗,。 # Test options and evaluation metric seed = 7 scoring = 'accuracy' 現(xiàn)在我們用“準確率”這個維度去評估模型,也就是能正確預測出鳶尾花類別的比例,。我們后面運行和評估模型時會使用分數(shù)變量,。 5.3 搭建模型針對這個問題,我們并不知道哪個算法最好,,應當用哪些配置,。我們從可視化圖表中能夠得知在有些維度上一些類別的部分是線性可分的,因此我們預期總體效果會不錯,。 我們看看這 6 種算法: 邏輯回歸(LR) 這里面既有簡單的線性算法(LA和LDA),,也有非線性算法(KNN,CART,NB和SVM),。我們每次運行算法前都要重新設(shè)置隨機數(shù)量的種子,,以確保是在用相同的數(shù)據(jù)拆分來評估每個算法。這樣能保證最終結(jié)果可以直接進行比較,。 我們來搭建和評估模型: # Spot Check Algorithms models = [] models.append(('LR', LogisticRegression())) models.append(('LDA', LinearDiscriminantAnalysis())) models.append(('KNN', KNeighborsClassifier())) models.append(('CART', DecisionTreeClassifier())) models.append(('NB', GaussianNB())) models.append(('SVM', SVC())) # evaluate each model in turn results = [] names = [] for name, model in models: kfold = model_selection.KFold(n_splits=10, random_state=seed) cv_results = model_selection.cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring) results.append(cv_results) names.append(name) msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std()) print(msg) 5.4 選擇最佳模型我們現(xiàn)在獲得了 6 個模型以及每種模型的準確度評估狀況,。接下來需要將模型相互比較,選出最準確的那個,。 運行上面的例子,,會得到如下初步結(jié)果: LR: 0.966667 (0.040825) LDA: 0.975000 (0.038188) KNN: 0.983333 (0.033333) CART: 0.975000 (0.038188) NB: 0.975000 (0.053359) SVM: 0.981667 (0.025000) 我們可以看到似乎 KNN 的估計準確率分值最高。 我們也可以將模型評估結(jié)果用圖形表示出來,,比較每個模型的跨度和平均準確度,。這種衡量模型準確率的方法比較流行,因為每種算法都被評估了 10 次(十折交叉驗證法),。 # Compare Algorithms fig = plt.figure() fig.suptitle('Algorithm Comparison') ax = fig.add_subplot(111) plt.boxplot(results) ax.set_xticklabels(names) plt.show() 你可以看到箱線圖的頂部范圍 呈壓縮狀,,不少模型都達到了 100% 的準確率。 6.做出預測經(jīng)過驗證,,KNN 算法的準確率最高?,F(xiàn)在我們看看該模型在驗證集上的準確度。 我們最后來驗證一下最好的模型的準確率有多高,。拆分并保留一個驗證集很值得,,以防你在訓練期間出現(xiàn)錯誤,比如對訓練集過擬合或者數(shù)據(jù)泄露之類,,這兩種錯誤都會造成最終結(jié)果過于樂觀,。 我們可以直接在驗證集上運行 KNN 算法,將結(jié)果總結(jié)為一個最終準確率分值,,一個混淆矩陣和一個分類報告,。 # Make predictions on validation dataset knn = KNeighborsClassifier() knn.fit(X_train, Y_train) predictions = knn.predict(X_validation) print(accuracy_score(Y_validation, predictions)) print(confusion_matrix(Y_validation, predictions)) print(classification_report(Y_validation, predictions)) 我們可以看到模型的準確率為 0.9,即 90%,?;煜仃囷@示了所犯的三個錯誤。最終,,分類報告顯示了每個類別的精確率,、召回率、F1 值等,。 [[ 7 0 0] [ 0 11 1] [ 0 2 9]] precision recall f1-score support Iris-setosa 1.00 1.00 1.00 7 Iris-versicolor 0.85 0.92 0.88 12 Iris-virginica 0.90 0.82 0.86 11 avg / total 0.90 0.90 0.90 30 人人可用 Python 做機器學習任務把上面的這篇教程過一遍,,最多花你5-10分鐘! 你不需要什么都懂。 你的目標就是完整的跟著操作一遍這個教程,然后得到結(jié)果,。剛開始你不必什么都懂,??梢砸贿呑鲆贿吜谐鰡栴},,多用用 help(FunctionName) 幫你理解 Python 中的語法,,學習你正在用的函數(shù),。 你不需要明白算法的原理 ,。當然,,知道機器學習算法的局限性和配置方式很重要,但對算法原理的學習可以放在后頭,。你應該循序漸進的了解算法的原理,,在當前階段主要任務就是熟悉平臺。 你也不必是個Python程序員,。 如果你是個 Python 初學者,,Python 的語法會很陌生。和其它語言一樣,,重點關(guān)注函數(shù)調(diào)用和賦值,,后面再詳細深挖語法知識。 你也不用是個機器學習專家,。 你可以在后面學習每種算法的好處和局限性,,而且這方面有很多資料,比如關(guān)于機器學習項目的操作步驟,,以及用驗證集評估模型的重要性等,。 機器學習項目的其它步驟。 本文并沒有涉及機器學習項目的全部步驟,,因為這畢竟是我們的第一個項目,,關(guān)注重要步驟就行了,也就是:導入數(shù)據(jù),、查看數(shù)據(jù),、評估算法、做出預測. |
|