在這篇教程中,你將用Python完成你的第一個機器學習項目。
在以下的教程中,你將學到:
1.下載并安裝Python SciPy,為Python中的機器學習安裝最有用的軟件包。
2.使用統(tǒng)計摘要和數(shù)據(jù)可視化加載數(shù)據(jù)集并了解其結構。
3.創(chuàng)建6個機器學習模型,并挑選出最佳模型以確保準確性。
如果你是一個機器學習初學者,并希望開始使用Python進行你的機器學習項目,那么本教程是為你量身打造的。
話不多說,開始正題吧
如何使用Python開始機器學習?
學習機器學習的最好方式是設計和完成小型項目。
在入門Python時遇到的困難
Python是一種當下流行并且功能強大的解釋型語言。與R語言不同,Python是一個完善的語言和平臺,能用來研究和開發(fā)。
還有很多模塊和庫可以選擇,提供多種方式來完成每個任務。
開始使用Python進行機器學習的最好方法是完成一個項目。
它將促使你安裝并啟動Python解釋器。
它讓你全面的觀察如何開發(fā)一個小項目。
它會給你信心,也許還會驅動你繼續(xù)做自己的小項目。
初學者需要一個小型的端到端項目
很多書籍和課程讓人失望。他們給你很多方法和片段,但你永遠不會看到他們?nèi)绾稳诤显谝黄稹?/p>
當你將機器學習應用在自己的數(shù)據(jù)集時,你已經(jīng)開始了一個項目。
機器學習項目可能不是線性的,但它有許多典型的步驟:
定義問題
準備數(shù)據(jù)
評估算法。
改善成績。
得到結果。
真正開始新平臺或工具的最好的方法是通過一個機器學習項目進行端到端的工作,并覆蓋關鍵步驟。也就是從加載數(shù)據(jù)、總結數(shù)據(jù)、評估算法和做出一些預測。
如果可以這樣做,你將有一個可以在數(shù)據(jù)集之后使用數(shù)據(jù)集上的模板。一旦你有更多的信心,你可以進一步的填補數(shù)據(jù)和改進結果的任務.
機器學習的Hello World
開始使用新工具的最好的小項目是鳶尾花的分類(如鳶尾花數(shù)據(jù)集 https://archive.ics.uci.edu/ml/datasets/Iris)。
這是一個很好理解的項目。
屬性是數(shù)值型的,因此你必須弄清楚如何加載和處理數(shù)據(jù)。
這是一個分類問題,讓你可以練習更簡單的監(jiān)督學習算法。
這是一個多類的分類問題(多項式),可能需要一些專門的處理。
它只有4種屬性和150行,這意味著它很小,很容易適應內(nèi)存(以及屏幕或A4頁面)。
所有的數(shù)值屬性都是相同的單位和相同的比例,不需要任何特殊的縮放或變換就可以開始。
讓我們開始使用Python中的hello world機器學習項目。
Python中的機器學習:分步教程
在本節(jié)中,我們將通過端到端的小型機器學習項目進行工作。
以下是我們將要介紹的內(nèi)容:
安裝Python和SciPy平臺
加載數(shù)據(jù)集
匯總數(shù)據(jù)集
可視化數(shù)據(jù)集
評估一些算法
做一些預測
慢慢來,一步一步做。
你可以嘗試自己輸入命令也可以通過復制粘貼來加快速度。
1
下載,安裝和啟動Python SciPy
如果你的系統(tǒng)上尚未安裝,請安裝Python和SciPy平臺。
我不想太詳細地介紹這個,因為有別人已經(jīng)介紹過了,這對一個開發(fā)人員來說很簡單。
1.1安裝SciPy庫
本教程假設Python版本為2.7或3.5。
你需要安裝5個關鍵庫。以下是本教程所需的Python SciPy庫列表:
SciPy
numpy
matplotlib
pandas
sklearn
有很多方法來安裝這些庫,我的建議是選擇一種方法,然后在安裝每個庫時保持一致。
該SciPy的安裝頁面(https://www.scipy.org/install.html)對多個不同的平臺提供了極好的說明書,如Linux,Mac OS X和Windows。如果你有任何疑問或疑問,請參閱本說明。
在Mac OS X上,你可以使用macports來安裝Python 2.7和這些庫。
在Linux上,你可以使用包管理器,例如Fedora上的yum來安裝RPM。
如果你使用Windows或者你沒什么信心,我建議安裝免費版本的Anaconda(https://www.anaconda.com/download/),其中包含你需要的一切。
注意:本教程假設你已經(jīng)安裝scikit-learn版本0.18或更高版本。
1.2啟動Python并檢查版本
確保你的Python環(huán)境安裝成功并按預期工作,這是很有必要的。
下面的腳本將幫助你測試你的環(huán)境。它導入本教程中所需的每個庫并打印出版本。
打開命令行并啟動python解釋器:
1 | python |
我建議直接在解釋器中工作,或者編寫腳本并在命令行上運行它們,而不是用大型編輯器和IDE。不要很復雜的操作,把中心放在機器學習而不是工具鏈上。
鍵入或者復制粘貼以下腳本:
01 | # Check the versions of libraries |
02 |
03 | # Python version |
04 | importsys |
05 | print('Python: {}'.format(sys.version)) |
06 | # scipy |
07 | importscipy |
08 | print('scipy: {}'.format(scipy.__version__)) |
09 | # numpy |
10 | importnumpy |
11 | print('numpy: {}'.format(numpy.__version__)) |
12 | # matplotlib |
13 | importmatplotlib |
14 | print('matplotlib: {}'.format(matplotlib.__version__)) |
15 | # pandas |
16 | importpandas |
17 | print('pandas: {}'.format(pandas.__version__)) |
18 | # scikit-learn |
19 | importsklearn |
20 | print('sklearn: {}'.format(sklearn.__version__)) |
這是我在我的OS X工作站上得到的輸出:
1 | Python:2.7.11(default, Mar12016,18:40:10) |
2 | [GCC4.2.1Compatible Apple LLVM7.0.2(clang-700.1.81)] |
3 | scipy:0.17.0 |
4 | numpy:1.10.4 |
5 | matplotlib:1.5.1 |
6 | pandas:0.17.1 |
7 | sklearn:0.18.1 |
將以上輸出與你的版本進行比較。
理想情況下,你的版本應該匹配或更新。這些API不會很快改變,所以如果你的版本更高,不必擔心,本教程中的所有內(nèi)容很有可能仍然適用于你。
如果你出現(xiàn)錯誤,請停止?,F(xiàn)在是修復它的時候了。
如果你無法正常運行上述腳本,你將無法完成本教程。
我最好的建議是在Google上搜索你的錯誤信息。
2
加載數(shù)據(jù)
我們將使用鳶尾花數(shù)據(jù)集。這個數(shù)據(jù)集很有名,因為它被用作機器學習和統(tǒng)計中的“hello world”。
該數(shù)據(jù)集包含150個鳶尾花觀測值。有四列測量花的尺寸。第五列是觀察到的花的種類。所有觀察到的花屬于三種物種之一。
在此步驟中,我們將從CSV文件的URL加載鳶尾數(shù)據(jù)。
2.1導入庫
首先,我們將導入我們將在本教程中使用的所有模塊,函數(shù)和對象。
01 | # Load libraries |
02 | importpandas |
03 | frompandas.tools.plottingimportscatter_matrix |
04 | importmatplotlib.pyplot as plt |
05 | fromsklearnimportmodel_selection |
06 | fromsklearn.metricsimportclassification_report |
07 | fromsklearn.metricsimportconfusion_matrix |
08 | fromsklearn.metricsimportaccuracy_score |
09 | fromsklearn.linear_modelimportLogisticRegression |
10 | fromsklearn.treeimportDecisionTreeClassifier |
11 | fromsklearn.neighborsimportKNeighborsClassifier |
12 | fromsklearn.discriminant_analysisimportLinearDiscriminantAnalysis |
13 | fromsklearn.naive_bayesimportGaussianNB |
14 | fromsklearn.svmimportSVC |
這些加載正常情況下是沒錯的。如果出現(xiàn)錯誤,請停止?;氐缴厦?,你需要一個可行的SciPy環(huán)境。請參閱上面關于設置環(huán)境的建議。
2.2加載數(shù)據(jù)集
我們可以直接從UCI機器學習存儲庫加載數(shù)據(jù)。
我們正在使用pandas來加載數(shù)據(jù)。我們還將使用pandas來探索具有描述性統(tǒng)計數(shù)據(jù)和數(shù)據(jù)可視化的數(shù)據(jù)。
請注意,我們在裝載數(shù)據(jù)時指定了每個列的名稱。這有助于我們稍后研究數(shù)據(jù)。
1 | # Load dataset |
2 | url="https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data" |
3 | names=['sepal-length','sepal-width','petal-length','petal-width','class'] |
4 | dataset=pandas.read_csv(url, names=names) |
數(shù)據(jù)集應該會加載的很順利
如果你有網(wǎng)絡問題,可以下載iris數(shù)據(jù)(https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data)。將文件放入工作目錄,并使用相同的方法加載它,將URL更改為本地文件名。
3
匯總數(shù)據(jù)集
現(xiàn)在是查看數(shù)據(jù)的時候了。
在這一步中,我們將以幾種不同的方式來查看數(shù)據(jù):
數(shù)據(jù)集的維度。
仔細觀察數(shù)據(jù)本身。
所有屬性的統(tǒng)計匯總。
按類變量細分數(shù)據(jù)。
記住查看數(shù)據(jù),一個數(shù)據(jù)集就是一個命令。這些都是有用的命令,你可以在以后的項目中反復使用。
3.1數(shù)據(jù)集的尺寸
我們可以快速通過shape屬性了解數(shù)據(jù)中包含多少個實例(行)和多少個屬性(列)
1 | # shape |
2 | print(dataset.shape) |
你應該看到150個實例和5個屬性:
1 | (150,5) |
3.2觀察數(shù)據(jù)
仔細觀察你的數(shù)據(jù)
1 | # head |
2 | print(dataset.head(20)) |
你應該會看到數(shù)據(jù)的前20行:
01 | sepal-length sepal-width petal-length petal-widthclass |
02 | 05.13.51.40.2Iris-setosa |
03 | 14.93.01.40.2Iris-setosa |
04 | 24.73.21.30.2Iris-setosa |
05 | 34.63.11.50.2Iris-setosa |
06 | 45.03.61.40.2Iris-setosa |
07 | 55.43.91.70.4Iris-setosa |
08 | 64.63.41.40.3Iris-setosa |
09 | 75.03.41.50.2Iris-setosa |
10 | 84.42.91.40.2Iris-setosa |
11 | 94.93.11.50.1Iris-setosa |
12 | 105.43.71.50.2Iris-setosa |
13 | 114.83.41.60.2Iris-setosa |
14 | 124.83.01.40.1Iris-setosa |
15 | 134.33.01.10.1Iris-setosa |
16 | 145.84.01.20.2Iris-setosa |
17 | 155.74.41.50.4Iris-setosa |
18 | 165.43.91.30.4Iris-setosa |
19 | 175.13.51.40.3Iris-setosa |
20 | 185.73.81.70.3Iris-setosa |
21 | 195.13.81.50.3Iris-setosa |
3.3統(tǒng)計匯總
現(xiàn)在我們可以看一下每個屬性的總結。
這包括計數(shù),平均值,最小值和最大值以及一些百分位數(shù)。
1 | # descriptions |
2 | print(dataset.describe()) |
我們可以看到,所有的數(shù)值都有相同的單位(厘米),范圍在0到8厘米之間。
1 | sepal-length sepal-width petal-length petal-width |
2 | count150.000000150.000000150.000000150.000000 |
3 | mean5.8433333.0540003.7586671.198667 |
4 | std0.8280660.4335941.7644200.763161 |
5 | min4.3000002.0000001.0000000.100000 |
6 | 25%5.1000002.8000001.6000000.300000 |
7 | 50%5.8000003.0000004.3500001.300000 |
8 | 75%6.4000003.3000005.1000001.800000 |
9 | max7.9000004.4000006.9000002.500000 |
3.4分類
現(xiàn)在來看看屬于每個類的實例(行)的數(shù)量。我們可以將其視為絕對數(shù)。
1 | # class distribution |
2 | print(dataset.groupby('class').size()) |
我們可以看到每個類具有相同數(shù)量的實例(50或者說33%的數(shù)據(jù)集)。
1 | class |
2 | Iris-setosa50 |
3 | Iris-versicolor50 |
4 | Iris-virginica50 |
4
數(shù)據(jù)可視化
我們現(xiàn)在對數(shù)據(jù)有一個基本的了解。我們需要通過一些可視化來讓自己更了解它。
我們要看兩種圖:
單變量圖讓你更好地了解每個屬性。
多變量圖讓你更好地了解屬性之間的關系。
4.1單變量圖
我們從一些單變量開始,即每個變量的曲線。
鑒于輸入變量是數(shù)值型,我們可以創(chuàng)建每個輸入變量的盒型圖。
1 | # box and whisker plots |
2 | dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False) |
3 | plt.show() |
這使我們對輸入屬性的分布有了更清晰的認識,我們還可以創(chuàng)建每個輸入變量的直方圖來獲得分布的概念。
1 | # histograms |
2 | dataset.hist() |
3 | plt.show() |
看起來可能有兩個輸入變量具有高斯分布。這一點很有用,因為我們可以使用這種假設比較算法的準確性。
4.2多變量圖
現(xiàn)在我們可以看一下變量之間的相互作用。
首先,我們來看看所有屬性對的散點圖。這可以有助于發(fā)現(xiàn)輸入變量之間的結構化關系。
1 | # scatter plot matrix |
2 | scatter_matrix(dataset) |
3 | plt.show() |
注意這些接近對角線的組,這是高度的相關性和可預測關系的表現(xiàn)。
5
評估算法
現(xiàn)在創(chuàng)建一些數(shù)據(jù)模型,并評估它們對未來數(shù)據(jù)預測的準確性。
下面是我們將要討論的內(nèi)容是:
抽離一個驗證數(shù)據(jù)集。
設置測試工具使用10倍交叉驗證。
建立5種不同的模型來預測花卉測量中的種類。
選擇最好的模型。
5.1創(chuàng)建驗證數(shù)據(jù)集
我們需要知道,我們創(chuàng)建的模型有什么用。
之后,我們將使用統(tǒng)計方法來估計我們在預測的數(shù)據(jù)上創(chuàng)建模型的準確性。我們還希望通過對實際預測數(shù)據(jù)進行評估,從而更具體地估計出最佳模型的準確性。
也就是說,我們將保留一些算法無法看到的數(shù)據(jù),我們將利用這些數(shù)據(jù)來確定模型究竟有多精確。
我們將把加載的數(shù)據(jù)集分為兩部分,其中80%將用于訓練我們的模型,20%將被用作驗證數(shù)據(jù)集。
1 | # Split-out validation dataset |
2 | array=dataset.values |
3 | X=array[:,0:4] |
4 | Y=array[:,4] |
5 | validation_size=0.20 |
6 | seed=7 |
7 | X_train, X_validation, Y_train, Y_validation=model_selection.train_test_split(X, Y, test_size=validation_size, random_state=seed) |
你現(xiàn)在可以在X_train和Y_train中訓練數(shù)據(jù)為準備模型和X_validation和Y_validation集,因為我們一會兒用得上。
5.2測試工具
我們將使用10倍交叉驗證來估計精度。
這將把我們的數(shù)據(jù)集分為10個部分,在9上訓練,并在1上進行測試,并重復訓練分組的所有組合。
1 | # Test options and evaluation metric |
2 | seed=7 |
3 | scoring='accuracy' |
我們使用“accuracy” 的度量來評估模型。這是正確預測實例的數(shù)量除以數(shù)據(jù)集中的實例總數(shù)乘以100的百分比(例如95%準確)的比率。當我們運行構建并評估每個模型時,我們將使用評分變量。
5.3建立模型
我們不知道哪些算法對這個問題或什么配置使用是好的。我們從圖中得出一些想法,即某些類在某些方面是部分可線性分離的,所以我們期望一般的結果很好。
我們來評估6種不同的算法:
邏輯回歸(LR)
線性判別分析(LDA)
鄰近算法(KNN)。
分類和回歸樹(CART)。
高斯樸素貝葉斯(NB)。
支持向量機(SVM)。
這是簡單線性(LR和LDA),非線性(KNN,CART,NB和SVM)算法的良好混合。我們在每次運行之前重置隨機數(shù)種子,以確保使用完全相同的數(shù)據(jù)分割來執(zhí)行每個算法的評估。它確保結果直接可比。
我們來建立和評估我們的五個模型:
01 | # Spot Check Algorithms |
02 | models=[] |
03 | models.append(('LR', LogisticRegression())) |
04 | models.append(('LDA', LinearDiscriminantAnalysis())) |
05 | models.append(('KNN', KNeighborsClassifier())) |
06 | models.append(('CART', DecisionTreeClassifier())) |
07 | models.append(('NB', GaussianNB())) |
08 | models.append(('SVM', SVC())) |
09 | # evaluate each model in turn |
10 | results=[] |
11 | names=[] |
12 | forname, modelinmodels: |
13 | kfold=model_selection.KFold(n_splits=10, random_state=seed) |
14 | cv_results=model_selection.cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring) |
15 | results.append(cv_results) |
16 | names.append(name) |
17 | msg="%s: %f (%f)"%(name, cv_results.mean(), cv_results.std()) |
18 | print(msg) |
5.4選擇最佳模型
我們現(xiàn)在每個都有6個模型和精度估計。我們需要將模型相互比較,并選擇最準確的。
運行上面的例子,我們得到以下原始結果:
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具有最高的估計精度分數(shù)。
我們還可以創(chuàng)建模型評估結果的圖,并比較每個模型的差異和平均精度。每個算法有一個精確度量的群體,因為每個算法被評估10次(10次交叉驗證)。
1 | # Compare Algorithms |
2 | fig=plt.figure() |
3 | fig.suptitle('Algorithm Comparison') |
4 | ax=fig.add_subplot(111) |
5 | plt.boxplot(results) |
6 | ax.set_xticklabels(names) |
7 | plt.show() |
你可以看到盒型圖在頂部被壓扁,許多樣品達到100%的準確度。
6
做預測
KNN算法是我們測試的最精確的模型。現(xiàn)在我們想了解驗證集上模型的準確性。
這讓我們對最佳模型的準確性進行獨立的最終檢查。保持一個驗證集是有用的,以防萬一你在訓練過程中犯錯,比如過擬合或數(shù)據(jù)外泄。兩者都將導致過于樂觀的結果。
我們可以直接在驗證集上運行KNN模型,并將結果總結為最終準確度分數(shù),混淆矩陣和分類報告。
1 | # Make predictions on validation dataset |
2 | knn=KNeighborsClassifier() |
3 | knn.fit(X_train, Y_train) |
4 | predictions=knn.predict(X_validation) |
5 | print(accuracy_score(Y_validation, predictions)) |
6 | print(confusion_matrix(Y_validation, predictions)) |
7 | print(classification_report(Y_validation, predictions)) |
我們可以看到準確度是0.9即90%?;煜仃囂峁┝巳齻€錯誤的指示。最后,分類報告通過精確度,召回率,f1分數(shù)和支撐顯示出優(yōu)異的結果(授予驗證數(shù)據(jù)集很?。┨峁┟總€類別的細目。
view source
01 | 0.9 |
02 |
03 | [[700] |
04 | [0111] |
05 | [029]] |
06 |
07 | precision recall f1-score support |
08 |
09 | Iris-setosa1.001.001.007 |
10 | Iris-versicolor0.850.920.8812 |
11 | Iris-virginica0.900.820.8611 |
12 |
13 | avg/total0.900.900.9030 |
完成上面的教程,只需要5到10分鐘。
7
概要
在這篇文章中,你會逐步發(fā)現(xiàn)如何在Python中完成第一個機器學習項目。
你將發(fā)現(xiàn),完成一個小型的端到端項目并將數(shù)據(jù)加載到預測中,是熟悉新平臺的最佳途徑。
-
機器學習
+關注
關注
66文章
8428瀏覽量
132832 -
python
+關注
關注
56文章
4801瀏覽量
84857
原文標題:教程篇 | 一步步教你如何使用python進行第一個機器學習項目
文章出處:【微信號:machinelearningai,微信公眾號:機器學習算法與人工智能】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論