Python機器學習入門小例子

本文參考了About Jason Brownlee的博文

英文鏈接:https://machinelearningmastery.com/machine-learning-in-python-step-by-step/

本文主要是上文的一些翻譯谓谦,附加了自己實際中的總結(jié)和心得

這個項目從一個小的實例開始啊犬,經(jīng)典的鳶尾花的分類。編寫實例對新手學習一門工具來說是一個好的開始,如同編程中的hello world幅垮。

大綱:

  • 安裝Python和SciPy平臺
  • 導入數(shù)據(jù)集
  • 總結(jié)數(shù)據(jù)集
  • 可視化數(shù)據(jù)集
  • 評估算法
  • 做出一些預(yù)測

1 下載安裝和開始使用Python SciPy

安裝過程可以參考本上的上一篇博文拱层,基本上這個流程過了一遍之后下面的步驟都沒什么問題了虹菲。
安裝與配置環(huán)境:http://www.reibang.com/p/b9f3b5440dfe

1.1 安裝SciPy庫

Python的版本號是2.7或者3.5憋肖,本人的是3.5
有五個庫需要預(yù)先安裝好:

  • scipy
  • numpy
  • matplotlib
  • pandas
  • sklearn

如果是windows下的話,強烈推薦安裝Anaconda胰苏,正如本節(jié)開頭所寫硕蛹,參考上一篇博文。

有一點注意的是硕并,本人安裝Anaconda的時候法焰,scikit-learn版本為0.17,現(xiàn)在已經(jīng)不夠新了鲤孵,這個教程推薦的scikit-learn版本至少為0.18以上壶栋,所以這里做了一個更新。

更新scikit-learn庫只需要在cmd中輸入 :

pip install –U scikit-learn

完成后如圖:


update-sklearn.jpg

完成了自動更新普监。

1.2 運行Python 和檢查版本

下面檢查Python和上文的庫是否已經(jīng)安裝成功了
打開一個cmd命令框贵试,輸入:

python

然后復(fù)制如下代碼:

# import sys
# print('Python:{}'.format(sys.version))
import scipy
print('scipy: {}'.format(scipy.__version__))
import numpy
print('numpy: {}'.format(numpy.__version__))
import matplotlib
print('matplotlib:{}'.format(matplotlib.__version__))
import pandas
print('pandas: {}'.format(pandas.__version__))
import sklearn
print('sklearn: {}'.format(sklearn.__version__))

測試輸出的結(jié)果,本人的運行結(jié)果顯示如下:

Python:3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul 5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)]
scipy: 0.18.1
numpy: 1.13.0
matplotlib: 1.5.3
pandas: 0.18.1
sklearn: 0.19.1

理想情況下凯正,應(yīng)該是跟上面差不多或者更新一些水泉,如果差一點也沒關(guān)系感帅。但是如果報錯的話驶俊,立刻停下來剥汤,檢查原因,處理好錯誤再繼續(xù)允睹。如果這段運行不通過运准,后續(xù)代碼也無法進行。

2 導入數(shù)據(jù)

我們使用鳶尾花(iris)數(shù)據(jù)集缭受。這是個很有名的數(shù)據(jù)集胁澳,被稱為機器學習界的hello world。
這個數(shù)據(jù)集的詳情:learn more about this dataset on Wikipedia.

2.1 導入庫

# Load libraries
import pandas

from pandas.tools.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 

這些導入過程不應(yīng)該有錯誤米者,如果有韭畸,停下來檢查宇智,看看上面的搭建環(huán)境的內(nèi)容,排除錯誤然后繼續(xù)胰丁。

2.2 導入數(shù)據(jù)集

# Load dataset
url = "https://archive.ics.uci.edu/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ù)文件随橘,然后修改url中的路徑去加載它。

3 統(tǒng)計數(shù)據(jù)集

然后看看數(shù)據(jù)锦庸,在這一步注意了解以下幾點:

  • 數(shù)據(jù)的維度
  • 數(shù)據(jù)本身
  • 統(tǒng)計所有的數(shù)據(jù)集屬性
  • 根據(jù)不同類別進行數(shù)據(jù)細分

3.1數(shù)據(jù)的維度

#shape
Print(dataset.shape)

將得到150個實例和5個屬性(變量)

3.2 了解數(shù)據(jù)本身

# head
print(dataset.head(20))

將看到前20行的數(shù)據(jù)

    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)計所有的數(shù)據(jù)集屬性

接下來看看數(shù)據(jù)的屬性机蔗,包括樣本值,均值酸员,最小值蜒车,最大值讳嘱,以及百分比值幔嗦。可以看到所有的數(shù)值都有著相似的區(qū)間(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根據(jù)不同類別進行數(shù)據(jù)細分

按“class”統(tǒng)計行數(shù)沥潭,

# class distribution
print(dataset.groupby('class').size())

我們可以看到每種花的樣本數(shù)都是50

class
Iris-setosa  50
Iris-versicolor 50
Iris-virginica 50
dtype: int64

4 數(shù)據(jù)可視化

主要是兩種圖:

  • 單變量圖用來更好的理解每個屬性

  • 多變量圖用來更好的理解屬性間的關(guān)系

4.1 單變量圖

單變量圖邀泉,顧名思義,就是指每個圖對應(yīng)單個變量钝鸽,繪制箱線圖(box and whisker plots)

# box and whisker plots
dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False)
plt.show()

得到了一個直觀的屬性分布圖

box-whisker.png

還可以創(chuàng)建一個直方圖汇恤,便于對各屬性有個整體的認識

# histograms

dataset.hist()

plt.show()
hist.png

看來似乎有兩個輸入變量呈高斯分布,這有助于以后我們用算法驗證它拔恰。

4.2 多變量圖

然后我們看看變量之間的關(guān)系

首先我們看素有屬性對之間的散點圖因谎,這有助于發(fā)現(xiàn)輸入變量之間的結(jié)構(gòu)化關(guān)系。

# scatter plot matrix
scatter_matrix(dataset)
plt.show()

值得注意的是颜懊,許多屬性之間的兩兩關(guān)系呈現(xiàn)出的對角線分布趨勢财岔,這提示著一種高相關(guān)性和可預(yù)測性的關(guān)系。

scatter_matrix.png

5 算法評估舉例

接下來創(chuàng)建一些模型河爹,并評估各算法的精度匠璧,包括以下幾步:

  • 對驗證數(shù)據(jù)集進行分離
  • 使用10折交叉驗證( cross validation)建立測試框架( test harness)
  • 根據(jù)花的測量屬性建立5個不同的模型預(yù)測其的種類
  • 選擇最好的模型

5.1 創(chuàng)建驗證數(shù)據(jù)集

使用統(tǒng)計學方法評估模型的精度。同時我們希望對其中的最優(yōu)模型得到一個更精確的估計咸这。

我們將把加載的數(shù)據(jù)集分為兩部分夷恍。80%用來訓練模型,20%留作驗證數(shù)據(jù)集媳维。

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

然后就獲得了訓練數(shù)據(jù)X_train酿雪,Y_train

5.2 測試框架

將使用10折交叉驗證( cross validation)評估精度,就是說把數(shù)據(jù)集分成10份侄刽,輪流將其中9份作為訓練數(shù)據(jù)指黎,1份作為測試數(shù)據(jù),進行試驗唠梨。每次試驗都會得到相應(yīng)的正確率袋励。10次的結(jié)果的正確率的平均值作為對算法精度的估計。

# Test options and evaluation metric
seed = 7
scoring = 'accuracy'

這里使用'accuracy'作為評估模型的度量值。它是正確預(yù)測結(jié)果和全部用例數(shù)量的比值茬故,乘以100%的結(jié)果(例如95%)盖灸,接下來使用scoring變量評估每個模型。

5.3 建立模型

我們并不知道哪種模型在某個問題上是最好的也不知道該用什么樣的配置磺芭,但根據(jù)圖形可以看出某些分類在某些維度上是部份線性分離的赁炎,這可以幫助我們產(chǎn)生好的測試結(jié)果。

接下來我們評價6種不同的算法

  • 邏輯回歸(LR, Logistic regression)
  • 線性判別分析(LDA, Linear Discriminant Analysis)
  • K-近鄰算法(KNN, K-Nearest Neighbors)
  • 分類與回歸樹(CART, Classific and Regression Tree)
  • 高斯樸素貝葉斯(NB, Gaussian Naive Bayes)
  • 支持向量機(SVM, Support Vector Machines)

其中有簡單線性算法(LR和LDA)钾腺,非線性算法(KNN, CART, NB 和SVM)徙垫。我們在每次運行前重置隨機數(shù)種子來確保對算法的評估是基于完全相同的數(shù)據(jù)分支的。這確保了結(jié)果可以直接進行比較放棒。

接下來構(gòu)建和評估五個模型:

# 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 選擇最好的模型

這樣就得到了6個模型和他們的精確度估計姻报,運行上面的代碼得到如下的結(jié)果:

LR: 0.966667 (0.040825)
LDA: 0.975000 (0.038188)
KNN: 0.983333 (0.033333)
CART: 0.966667 (0.040825)
NB: 0.975000 (0.053359)
SVM: 0.991667 (0.025000)

看起來KNN得到了最大的精度估計。

我們也可以創(chuàng)建一張圖表來反映模型評估的結(jié)果间螟,每種算法都被評估了10次(10折交叉驗證)

# Compare Algorithms
fig = plt.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(names)
plt.show()

然后得到了箱線圖:

compare.png

可以看到很多算法的精度都比較高吴旋。

6 做出預(yù)測

根據(jù)測試,KNN算法是精度最高的厢破,然后我們想得到在驗證集上的準確性荣瑟。

這將是我們對最優(yōu)模型獨立性的一個最終確認。這樣做是有意義的摩泪,以防止訓練中出現(xiàn)的失誤笆焰,例如數(shù)據(jù)的過擬合或者數(shù)據(jù)泄露。這都會導致一個過于樂觀的結(jié)果见坑。

我們可以驗證數(shù)據(jù)集上直接運行KNN模型嚷掠,總結(jié)結(jié)果作為最終分數(shù),混淆矩陣(confusion matrix)和分類報告鳄梅。

# 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%叠国,混淆矩陣提示了三類錯誤。最后分類報告提供了每一類的準確率戴尸,召回率粟焊,F(xiàn)1值,并顯示了優(yōu)異的結(jié)果

0.9

[[ 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

這里補充一下:

precision 體現(xiàn)了模型對負樣本的區(qū)分能力孙蒙,precision越高项棠,說明模型對負樣本的區(qū)分能力越強。recall 體現(xiàn)了分類模型H對正樣本的識別能力挎峦,recall 越高香追,說明模型對正樣本的識別能力越強。F1-score 是兩者的綜合坦胶。F1-score 越高透典,說明分類模型越穩(wěn)健晴楔。

classification_repor的最后一行是用support 加權(quán)平均算出來的,如:

0.90 =( 1.007 + 0.8512 + 0.9*11) / 30

總結(jié)

這一節(jié)我們一步步的學習了如何使用Python完成一個簡單的機器學習工程峭咒。

從加載數(shù)據(jù)開始到預(yù)測結(jié)果的一個小的工程税弃,是熟悉一個新平臺的最佳途徑。

本人初學凑队,如有不足之處则果,好望高手們指教。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漩氨,一起剝皮案震驚了整個濱河市西壮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌叫惊,老刑警劉巖款青,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赋访,居然都是意外死亡可都,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門蚓耽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人旋炒,你說我怎么就攤上這事步悠。” “怎么了瘫镇?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵鼎兽,是天一觀的道長。 經(jīng)常有香客問我铣除,道長谚咬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任尚粘,我火速辦了婚禮择卦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘郎嫁。我一直安慰自己秉继,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布泽铛。 她就那樣靜靜地躺著尚辑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盔腔。 梳的紋絲不亂的頭發(fā)上杠茬,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天月褥,我揣著相機與錄音,去河邊找鬼瓢喉。 笑死吓坚,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的灯荧。 我是一名探鬼主播礁击,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逗载!你這毒婦竟也來了哆窿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤厉斟,失蹤者是張志新(化名)和其女友劉穎挚躯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擦秽,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡码荔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了感挥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缩搅。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖触幼,靈堂內(nèi)的尸體忽然破棺而出硼瓣,到底是詐尸還是另有隱情,我是刑警寧澤置谦,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布堂鲤,位于F島的核電站,受9級特大地震影響媒峡,放射性物質(zhì)發(fā)生泄漏瘟栖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一谅阿、第九天 我趴在偏房一處隱蔽的房頂上張望半哟。 院中可真熱鬧,春花似錦奔穿、人聲如沸镜沽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缅茉。三九已至,卻和暖如春男摧,著一層夾襖步出監(jiān)牢的瞬間蔬墩,已是汗流浹背译打。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拇颅,地道東北人奏司。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像樟插,于是被迫代替她去往敵國和親韵洋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容