你是否想使用python進(jìn)行機(jī)器學(xué)習(xí)但卻難以入門?
在這篇教程中,你將用Python完成你的第一個(gè)機(jī)器學(xué)習(xí)項(xiàng)目。
在以下的教程中,你將學(xué)到:
1.下載并安裝Python SciPy,為Python中的機(jī)器學(xué)習(xí)安裝最有用的軟件包。
2.使用統(tǒng)計(jì)摘要和數(shù)據(jù)可視化加載數(shù)據(jù)集并了解其結(jié)構(gòu)。
3.創(chuàng)建6個(gè)機(jī)器學(xué)習(xí)模型,并挑選出最佳模型以確保準(zhǔn)確性。
如果你是一個(gè)機(jī)器學(xué)習(xí)初學(xué)者,并希望開始使用Python進(jìn)行你的機(jī)器學(xué)習(xí)項(xiàng)目,那么本教程是為你量身打造的。
話不多說,開始正題吧
如何使用Python開始機(jī)器學(xué)習(xí)?
學(xué)習(xí)機(jī)器學(xué)習(xí)的最好方式是設(shè)計(jì)和完成小型項(xiàng)目。
在入門Python時(shí)遇到的困難
Python是一種當(dāng)下流行并且功能強(qiáng)大的解釋型語言。與R語言不同,Python是一個(gè)完善的語言和平臺(tái),能用來研究和開發(fā)。
還有很多模塊和庫可以選擇,提供多種方式來完成每個(gè)任務(wù)。
開始使用Python進(jìn)行機(jī)器學(xué)習(xí)的最好方法是完成一個(gè)項(xiàng)目。
它將促使你安裝并啟動(dòng)Python解釋器。
它讓你全面的觀察如何開發(fā)一個(gè)小項(xiàng)目。
它會(huì)給你信心,也許還會(huì)驅(qū)動(dòng)你繼續(xù)做自己的小項(xiàng)目。
初學(xué)者需要一個(gè)小型的端到端項(xiàng)目
很多書籍和課程讓人失望。他們給你很多方法和片段,但你永遠(yuǎn)不會(huì)看到他們?nèi)绾稳诤显谝黄稹?/p>
當(dāng)你將機(jī)器學(xué)習(xí)應(yīng)用在自己的數(shù)據(jù)集時(shí),你已經(jīng)開始了一個(gè)項(xiàng)目。
機(jī)器學(xué)習(xí)項(xiàng)目可能不是線性的,但它有許多典型的步驟:
定義問題
準(zhǔn)備數(shù)據(jù)
評估算法。
改善成績。
得到結(jié)果。
真正開始新平臺(tái)或工具的最好的方法是通過一個(gè)機(jī)器學(xué)習(xí)項(xiàng)目進(jìn)行端到端的工作,并覆蓋關(guān)鍵步驟。也就是從加載數(shù)據(jù)、總結(jié)數(shù)據(jù)、評估算法和做出一些預(yù)測。
如果可以這樣做,你將有一個(gè)可以在數(shù)據(jù)集之后使用數(shù)據(jù)集上的模板。一旦你有更多的信心,你可以進(jìn)一步的填補(bǔ)數(shù)據(jù)和改進(jìn)結(jié)果的任務(wù).
機(jī)器學(xué)習(xí)的Hello World
開始使用新工具的最好的小項(xiàng)目是鳶尾花的分類(如鳶尾花數(shù)據(jù)集 https://archive.ics.uci.edu/ml/datasets/Iris)。
這是一個(gè)很好理解的項(xiàng)目。
屬性是數(shù)值型的,因此你必須弄清楚如何加載和處理數(shù)據(jù)。
這是一個(gè)分類問題,讓你可以練習(xí)更簡單的監(jiān)督學(xué)習(xí)算法。
這是一個(gè)多類的分類問題(多項(xiàng)式),可能需要一些專門的處理。
它只有4種屬性和150行,這意味著它很小,很容易適應(yīng)內(nèi)存(以及屏幕或A4頁面)。
所有的數(shù)值屬性都是相同的單位和相同的比例,不需要任何特殊的縮放或變換就可以開始。
讓我們開始使用Python中的hello world機(jī)器學(xué)習(xí)項(xiàng)目。
Python中的機(jī)器學(xué)習(xí):分步教程
在本節(jié)中,我們將通過端到端的小型機(jī)器學(xué)習(xí)項(xiàng)目進(jìn)行工作。
以下是我們將要介紹的內(nèi)容:
安裝Python和SciPy平臺(tái)
加載數(shù)據(jù)集
匯總數(shù)據(jù)集
可視化數(shù)據(jù)集
評估一些算法
做一些預(yù)測
慢慢來,一步一步做。
你可以嘗試自己輸入命令也可以通過復(fù)制粘貼來加快速度。
1
下載,安裝和啟動(dòng)Python SciPy
如果你的系統(tǒng)上尚未安裝,請安裝Python和SciPy平臺(tái)。
我不想太詳細(xì)地介紹這個(gè),因?yàn)橛袆e人已經(jīng)介紹過了,這對一個(gè)開發(fā)人員來說很簡單。
1.1安裝SciPy庫
本教程假設(shè)Python版本為2.7或3.5。
你需要安裝5個(gè)關(guān)鍵庫。以下是本教程所需的Python SciPy庫列表:
SciPy
numpy
matplotlib
pandas
sklearn
有很多方法來安裝這些庫,我的建議是選擇一種方法,然后在安裝每個(gè)庫時(shí)保持一致。
該SciPy的安裝頁面(https://www.scipy.org/install.html)對多個(gè)不同的平臺(tái)提供了極好的說明書,如Linux,Mac OS X和Windows。如果你有任何疑問或疑問,請參閱本說明。
在Mac OS X上,你可以使用macports來安裝Python 2.7和這些庫。
在Linux上,你可以使用包管理器,例如Fedora上的yum來安裝RPM。
如果你使用Windows或者你沒什么信心,我建議安裝免費(fèi)版本的Anaconda(https://www.anaconda.com/download/),其中包含你需要的一切。
注意:本教程假設(shè)你已經(jīng)安裝scikit-learn版本0.18或更高版本。
1.2啟動(dòng)Python并檢查版本
確保你的Python環(huán)境安裝成功并按預(yù)期工作,這是很有必要的。
下面的腳本將幫助你測試你的環(huán)境。它導(dǎo)入本教程中所需的每個(gè)庫并打印出版本。
打開命令行并啟動(dòng)python解釋器:
1 | python |
我建議直接在解釋器中工作,或者編寫腳本并在命令行上運(yùn)行它們,而不是用大型編輯器和IDE。不要很復(fù)雜的操作,把中心放在機(jī)器學(xué)習(xí)而不是工具鏈上。
鍵入或者復(fù)制粘貼以下腳本:
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 |
將以上輸出與你的版本進(jìn)行比較。
理想情況下,你的版本應(yīng)該匹配或更新。這些API不會(huì)很快改變,所以如果你的版本更高,不必?fù)?dān)心,本教程中的所有內(nèi)容很有可能仍然適用于你。
如果你出現(xiàn)錯(cuò)誤,請停止?,F(xiàn)在是修復(fù)它的時(shí)候了。
如果你無法正常運(yùn)行上述腳本,你將無法完成本教程。
我最好的建議是在Google上搜索你的錯(cuò)誤信息。
2
加載數(shù)據(jù)
我們將使用鳶尾花數(shù)據(jù)集。這個(gè)數(shù)據(jù)集很有名,因?yàn)樗挥米鳈C(jī)器學(xué)習(xí)和統(tǒng)計(jì)中的“hello world”。
該數(shù)據(jù)集包含150個(gè)鳶尾花觀測值。有四列測量花的尺寸。第五列是觀察到的花的種類。所有觀察到的花屬于三種物種之一。
在此步驟中,我們將從CSV文件的URL加載鳶尾數(shù)據(jù)。
2.1導(dǎo)入庫
首先,我們將導(dǎo)入我們將在本教程中使用的所有模塊,函數(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 |
這些加載正常情況下是沒錯(cuò)的。如果出現(xiàn)錯(cuò)誤,請停止?;氐缴厦?,你需要一個(gè)可行的SciPy環(huán)境。請參閱上面關(guān)于設(shè)置環(huán)境的建議。
2.2加載數(shù)據(jù)集
我們可以直接從UCI機(jī)器學(xué)習(xí)存儲(chǔ)庫加載數(shù)據(jù)。
我們正在使用pandas來加載數(shù)據(jù)。我們還將使用pandas來探索具有描述性統(tǒng)計(jì)數(shù)據(jù)和數(shù)據(jù)可視化的數(shù)據(jù)。
請注意,我們在裝載數(shù)據(jù)時(shí)指定了每個(gè)列的名稱。這有助于我們稍后研究數(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ù)集應(yīng)該會(huì)加載的很順利
如果你有網(wǎng)絡(luò)問題,可以下載iris數(shù)據(jù)(https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data)。將文件放入工作目錄,并使用相同的方法加載它,將URL更改為本地文件名。
3
匯總數(shù)據(jù)集
現(xiàn)在是查看數(shù)據(jù)的時(shí)候了。
在這一步中,我們將以幾種不同的方式來查看數(shù)據(jù):
數(shù)據(jù)集的維度。
仔細(xì)觀察數(shù)據(jù)本身。
所有屬性的統(tǒng)計(jì)匯總。
按類變量細(xì)分?jǐn)?shù)據(jù)。
記住查看數(shù)據(jù),一個(gè)數(shù)據(jù)集就是一個(gè)命令。這些都是有用的命令,你可以在以后的項(xiàng)目中反復(fù)使用。
3.1數(shù)據(jù)集的尺寸
我們可以快速通過shape屬性了解數(shù)據(jù)中包含多少個(gè)實(shí)例(行)和多少個(gè)屬性(列)
1 | # shape |
2 | print(dataset.shape) |
你應(yīng)該看到150個(gè)實(shí)例和5個(gè)屬性:
1 | (150,5) |
3.2觀察數(shù)據(jù)
仔細(xì)觀察你的數(shù)據(jù)
1 | # head |
2 | print(dataset.head(20)) |
你應(yīng)該會(huì)看到數(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)計(jì)匯總
現(xiàn)在我們可以看一下每個(gè)屬性的總結(jié)。
這包括計(jì)數(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)在來看看屬于每個(gè)類的實(shí)例(行)的數(shù)量。我們可以將其視為絕對數(shù)。
1 | # class distribution |
2 | print(dataset.groupby('class').size()) |
我們可以看到每個(gè)類具有相同數(shù)量的實(shí)例(50或者說33%的數(shù)據(jù)集)。
1 | class |
2 | Iris-setosa50 |
3 | Iris-versicolor50 |
4 | Iris-virginica50 |
4
數(shù)據(jù)可視化
我們現(xiàn)在對數(shù)據(jù)有一個(gè)基本的了解。我們需要通過一些可視化來讓自己更了解它。
我們要看兩種圖:
單變量圖讓你更好地了解每個(gè)屬性。
多變量圖讓你更好地了解屬性之間的關(guān)系。
4.1單變量圖
我們從一些單變量開始,即每個(gè)變量的曲線。
鑒于輸入變量是數(shù)值型,我們可以創(chuàng)建每個(gè)輸入變量的盒型圖。
1 | # box and whisker plots |
2 | dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False) |
3 | plt.show() |
這使我們對輸入屬性的分布有了更清晰的認(rèn)識(shí),我們還可以創(chuàng)建每個(gè)輸入變量的直方圖來獲得分布的概念。
1 | # histograms |
2 | dataset.hist() |
3 | plt.show() |
看起來可能有兩個(gè)輸入變量具有高斯分布。這一點(diǎn)很有用,因?yàn)槲覀兛梢允褂眠@種假設(shè)比較算法的準(zhǔn)確性。
4.2多變量圖
現(xiàn)在我們可以看一下變量之間的相互作用。
首先,我們來看看所有屬性對的散點(diǎn)圖。這可以有助于發(fā)現(xiàn)輸入變量之間的結(jié)構(gòu)化關(guān)系。
1 | # scatter plot matrix |
2 | scatter_matrix(dataset) |
3 | plt.show() |
注意這些接近對角線的組,這是高度的相關(guān)性和可預(yù)測關(guān)系的表現(xiàn)。
5
評估算法
現(xiàn)在創(chuàng)建一些數(shù)據(jù)模型,并評估它們對未來數(shù)據(jù)預(yù)測的準(zhǔn)確性。
下面是我們將要討論的內(nèi)容是:
抽離一個(gè)驗(yàn)證數(shù)據(jù)集。
設(shè)置測試工具使用10倍交叉驗(yàn)證。
建立5種不同的模型來預(yù)測花卉測量中的種類。
選擇最好的模型。
5.1創(chuàng)建驗(yàn)證數(shù)據(jù)集
我們需要知道,我們創(chuàng)建的模型有什么用。
之后,我們將使用統(tǒng)計(jì)方法來估計(jì)我們在預(yù)測的數(shù)據(jù)上創(chuàng)建模型的準(zhǔn)確性。我們還希望通過對實(shí)際預(yù)測數(shù)據(jù)進(jìn)行評估,從而更具體地估計(jì)出最佳模型的準(zhǔn)確性。
也就是說,我們將保留一些算法無法看到的數(shù)據(jù),我們將利用這些數(shù)據(jù)來確定模型究竟有多精確。
我們將把加載的數(shù)據(jù)集分為兩部分,其中80%將用于訓(xùn)練我們的模型,20%將被用作驗(yàn)證數(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中訓(xùn)練數(shù)據(jù)為準(zhǔn)備模型和X_validation和Y_validation集,因?yàn)槲覀円粫?huì)兒用得上。
5.2測試工具
我們將使用10倍交叉驗(yàn)證來估計(jì)精度。
這將把我們的數(shù)據(jù)集分為10個(gè)部分,在9上訓(xùn)練,并在1上進(jìn)行測試,并重復(fù)訓(xùn)練分組的所有組合。
1 | # Test options and evaluation metric |
2 | seed=7 |
3 | scoring='accuracy' |
我們使用“accuracy” 的度量來評估模型。這是正確預(yù)測實(shí)例的數(shù)量除以數(shù)據(jù)集中的實(shí)例總數(shù)乘以100的百分比(例如95%準(zhǔn)確)的比率。當(dāng)我們運(yùn)行構(gòu)建并評估每個(gè)模型時(shí),我們將使用評分變量。
5.3建立模型
我們不知道哪些算法對這個(gè)問題或什么配置使用是好的。我們從圖中得出一些想法,即某些類在某些方面是部分可線性分離的,所以我們期望一般的結(jié)果很好。
我們來評估6種不同的算法:
邏輯回歸(LR)
線性判別分析(LDA)
鄰近算法(KNN)。
分類和回歸樹(CART)。
高斯樸素貝葉斯(NB)。
支持向量機(jī)(SVM)。
這是簡單線性(LR和LDA),非線性(KNN,CART,NB和SVM)算法的良好混合。我們在每次運(yùn)行之前重置隨機(jī)數(shù)種子,以確保使用完全相同的數(shù)據(jù)分割來執(zhí)行每個(gè)算法的評估。它確保結(jié)果直接可比。
我們來建立和評估我們的五個(gè)模型:
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)在每個(gè)都有6個(gè)模型和精度估計(jì)。我們需要將模型相互比較,并選擇最準(zhǔn)確的。
運(yùn)行上面的例子,我們得到以下原始結(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具有最高的估計(jì)精度分?jǐn)?shù)。
我們還可以創(chuàng)建模型評估結(jié)果的圖,并比較每個(gè)模型的差異和平均精度。每個(gè)算法有一個(gè)精確度量的群體,因?yàn)槊總€(gè)算法被評估10次(10次交叉驗(yàn)證)。
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() |
你可以看到盒型圖在頂部被壓扁,許多樣品達(dá)到100%的準(zhǔn)確度。
6
做預(yù)測
KNN算法是我們測試的最精確的模型。現(xiàn)在我們想了解驗(yàn)證集上模型的準(zhǔn)確性。
這讓我們對最佳模型的準(zhǔn)確性進(jìn)行獨(dú)立的最終檢查。保持一個(gè)驗(yàn)證集是有用的,以防萬一你在訓(xùn)練過程中犯錯(cuò),比如過擬合或數(shù)據(jù)外泄。兩者都將導(dǎo)致過于樂觀的結(jié)果。
我們可以直接在驗(yàn)證集上運(yùn)行KNN模型,并將結(jié)果總結(jié)為最終準(zhǔn)確度分?jǐn)?shù),混淆矩陣和分類報(bào)告。
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)) |
我們可以看到準(zhǔn)確度是0.9即90%?;煜仃囂峁┝巳齻€(gè)錯(cuò)誤的指示。最后,分類報(bào)告通過精確度,召回率,f1分?jǐn)?shù)和支撐顯示出優(yōu)異的結(jié)果(授予驗(yàn)證數(shù)據(jù)集很小)提供每個(gè)類別的細(xì)目。
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
概要
在這篇文章中,你會(huì)逐步發(fā)現(xiàn)如何在Python中完成第一個(gè)機(jī)器學(xué)習(xí)項(xiàng)目。
你將發(fā)現(xiàn),完成一個(gè)小型的端到端項(xiàng)目并將數(shù)據(jù)加載到預(yù)測中,是熟悉新平臺(tái)的最佳途徑。
-
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8349瀏覽量
132312 -
python
+關(guān)注
關(guān)注
55文章
4767瀏覽量
84375
原文標(biāo)題:教程篇 | 一步步教你如何使用python進(jìn)行第一個(gè)機(jī)器學(xué)習(xí)項(xiàng)目
文章出處:【微信號:machinelearningai,微信公眾號:機(jī)器學(xué)習(xí)算法與人工智能】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論