6個(gè)套路入門ML:用鳶尾花data建立python機(jī)器學(xué)習(xí)的初步印象(二)

(五)用一些算法進(jìn)行估計(jì)
重點(diǎn)地方到了,機(jī)器學(xué)習(xí)開始發(fā)揮作用了蠕搜。
這部分包括:1怎茫、對(duì)數(shù)據(jù)集進(jìn)行分離(分為訓(xùn)練集、驗(yàn)證集等);2轨蛤、采用10倍交叉驗(yàn)證設(shè)置測試機(jī)制蜜宪;3、根據(jù)鳶尾花測量維度構(gòu)建5種不同模型來預(yù)測其種類祥山;4圃验、選擇最佳模型

5.1 建立驗(yàn)證數(shù)據(jù)集
建立驗(yàn)證數(shù)據(jù)集的目的是尋找我們所建立的模型中最優(yōu)者,因此我們需要一部分與機(jī)器學(xué)習(xí)算法獨(dú)立的數(shù)據(jù)集缝呕,從而采用一些統(tǒng)計(jì)方法對(duì)這部分未知數(shù)據(jù)進(jìn)行評(píng)估澳窑,以判斷我們使用的估計(jì)模型的準(zhǔn)確性,我們將把加載的數(shù)據(jù)集分為兩部分供常,其中80%將用于訓(xùn)練我們的模型摊聋,20%將被用作驗(yàn)證數(shù)據(jù)集。

# Split-out validation dataset
array = dataset.values #將數(shù)據(jù)庫轉(zhuǎn)換成數(shù)組形式
X = array[:,0:4] #取前四列麻裁,即屬性數(shù)值
Y = array[:,4] #取最后一列,種類
validation_size = 0.20 #驗(yàn)證集規(guī)模
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 and Y_train就是訓(xùn)練集瞻鹏,X_validation and Y_validation就是驗(yàn)證集悲立。
5.2 測試機(jī)制
采用10倍交叉驗(yàn)證來評(píng)估模型的準(zhǔn)確性赫悄。通過把我們的數(shù)據(jù)集分為10份原献,其中9份用于訓(xùn)練,1份用于驗(yàn)證埂淮,并重復(fù)訓(xùn)練分組的所有組合姑隅。

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

我們設(shè)置scoring變量對(duì)所構(gòu)建的每個(gè)模型進(jìn)行評(píng)估,其中accuracy用以評(píng)估模型的一個(gè)度量值倔撞,它等于模型正確預(yù)測實(shí)際數(shù)據(jù)的數(shù)量/數(shù)據(jù)集中所有數(shù)據(jù)總數(shù)讲仰,這一比率乘以100%(比如95%的精確度)。
5.3 構(gòu)建模型
在不知道哪種算法最好的條件下痪蝇,根據(jù)圖形可以看到某些類在某些方面是部分可線性分離的鄙陡,因此,我們期望一般意義上的好結(jié)果躏啰。
在這里采用6種算法:邏輯回歸(LR)趁矾、線性判別分析(LDA)、K最近鄰(KNN)给僵、分類和回歸樹(CART)毫捣、高斯樸素貝葉斯(NB)、支持向量機(jī)(SVM)。這里綜合了簡單線性(LR和LDA)蔓同,非線性(KNN饶辙,CART,NB和SVM)算法牌柄,我們在每次運(yùn)行之前重置隨機(jī)數(shù)種子畸悬,以確保使用完全相同的數(shù)據(jù)隔離來執(zhí)行每個(gè)算法的評(píng)估,以確保結(jié)果直接可以比較珊佣。

# Spot Check Algorithms
models = [] #建立列表
models.append(('LR', LogisticRegression())) #往maodels添加元組(算法名稱,算法函數(shù))
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: #將算法名稱與函數(shù)分別讀取
    kfold = model_selection.KFold(n_splits=10, random_state=seed) #建立10倍交叉驗(yàn)證
    cv_results = model_selection.cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring) #每一個(gè)算法模型作為其中的參數(shù)披粟,計(jì)算每一模型的精度得分
    results.append(cv_results)
    names.append(name)
    msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std()) 
    print(msg) 

5.4 選擇最優(yōu)模型
通過運(yùn)行咒锻,得到每個(gè)模型的評(píng)估精度:
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ì)精度最高,括號(hào)內(nèi)為估計(jì)結(jié)果的標(biāo)準(zhǔn)誤守屉。
我們還可以繪制模型評(píng)估結(jié)果的圖形惑艇,并比較每個(gè)模型的差異和平均精度。 每個(gè)算法有一個(gè)精確度量的群體拇泛,因?yàn)槊總€(gè)算法被評(píng)估10次(10次交叉驗(yàn)證)滨巴。

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

得到:


Paste_Image.png

算法比較的箱形圖,可以看到每個(gè)算法精度的上沿基本貼著1俺叭,表明模型估計(jì)精度較高恭取。

6、預(yù)測
在得到KNN算法為測試中最佳模型的基礎(chǔ)上熄守,現(xiàn)在我們想了解驗(yàn)證集上模型的準(zhǔn)確性蜈垮。我們將對(duì)該算法進(jìn)行獨(dú)立性的終極檢驗(yàn),在這里設(shè)置驗(yàn)證集的作用體現(xiàn)出來了裕照,以防止訓(xùn)練過程中的失誤攒发,比如訓(xùn)練集體過度擬合或者數(shù)據(jù)遺漏,兩者都將導(dǎo)致過于樂觀的結(jié)果晋南。
我們可以直接在驗(yàn)證集上運(yùn)行KNN模型惠猿,并將結(jié)果總結(jié)為最終準(zhǔn)確度得分,混淆矩陣和分類報(bào)告负间。我們可以看到準(zhǔn)確度是0.9或90%偶妖。 混淆矩陣提供了三個(gè)錯(cuò)誤的指示。 最后唉擂,分類報(bào)告通過精確度餐屎,召回率,f1得分和支持顯示出優(yōu)異的結(jié)果(授予驗(yàn)證數(shù)據(jù)集很型嫠睢)提供每個(gè)類別的細(xì)目腹缩。

# Make predictions on validation dataset
knn = KNeighborsClassifier()
knn.fit(X_train, Y_train) #knn擬合序列集
predictions = knn.predict(X_validation) #預(yù)測驗(yàn)證集
print(accuracy_score(Y_validation, predictions)) #驗(yàn)證集精度得分
print(confusion_matrix(Y_validation, predictions)) #混淆矩陣
print(classification_report(Y_validation, predictions)) #分類預(yù)測報(bào)告

輸出以下結(jié)果:
0.9

[[ 7 0 0]
[ 0 11 1]
[ 0 2 9]]
(混淆矩陣每一行代表實(shí)際類別,每一列代表預(yù)測的類別,因此有三個(gè)類別藏鹊,第一行表明類別1的7個(gè)被全部預(yù)測準(zhǔn)確润讥,第二行類別2的12個(gè)有11個(gè)預(yù)測準(zhǔn)確,另一個(gè)被預(yù)測到了類3中盘寡;第三行則是11個(gè)有9個(gè)預(yù)測準(zhǔn)確楚殿,2個(gè)杯預(yù)測到了類別2,基于此竿痰,下邊就計(jì)算了分類預(yù)測精度的報(bào)告)
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

簡單介紹一下混淆矩陣:混淆矩陣(confusion matrix)脆粥,又稱為可能性表格或是錯(cuò)誤矩陣。它是一種特定的矩陣用來呈現(xiàn)算法性能的可視化效果影涉,通常是監(jiān)督學(xué)習(xí)(非監(jiān)督學(xué)習(xí)变隔,通常用匹配矩陣:matching matrix)。其每一列代表預(yù)測值蟹倾,每一行代表的是實(shí)際的類別匣缘。這個(gè)名字來源于它可以非常容易的表明多個(gè)類別是否有混淆。
最后一行是用support 加權(quán)平均算出來的鲜棠,如0.90= (71.00+120.85+11*0.86)/ 30

總結(jié):通過本文你就可以使用python進(jìn)行機(jī)器學(xué)習(xí)肌厨,基于上面教程,最多需要5到10分鐘豁陆。
根據(jù)上面初步的python機(jī)器學(xué)習(xí)柑爸,,筆者認(rèn)為献联,完成上面的內(nèi)容竖配,并不需要你掌握關(guān)于編程、機(jī)器學(xué)習(xí)的一切內(nèi)容:
你不需要了解一切里逆。(至少不是現(xiàn)在)你只需按照教程輸入代碼并運(yùn)行,得到結(jié)果,你暫時(shí)并不需要了解一切,大量使用Python中的幫助(“FunctionName”)來了解您正在使用的所有功能进胯。

你不需要知道算法如何工作。了解選取和如何配置機(jī)器學(xué)習(xí)算法很重要原押。但是學(xué)習(xí)算法可以稍后再來胁镐。您需要在很長一段時(shí)間內(nèi)慢慢地建立這個(gè)算法知識(shí)。今天诸衔,從平臺(tái)開始吧盯漂。

你不需要是Python程序員。如果您是新手笨农,Python語言的語法比較直觀的就缆。就像其他語言一樣,這樣可以讓你大部分時(shí)間專注于函數(shù)調(diào)用(例如函數(shù)())和賦值(例如a =“b”)谒亦。若你是一個(gè)開發(fā)人員竭宰,你知道如何真正快速地掌握語言的基礎(chǔ)知識(shí)空郊。稍后開始深入細(xì)節(jié)。
您不需要成為機(jī)器學(xué)習(xí)專家切揭。您可以稍后了解各種算法的優(yōu)點(diǎn)和局限性狞甚,還有很多帖子可以以后閱讀,以了解機(jī)器學(xué)習(xí)項(xiàng)目的步驟廓旬,以及使用交叉驗(yàn)證評(píng)估準(zhǔn)確性的重要性哼审。
機(jī)器學(xué)習(xí)項(xiàng)目中的其他步驟如何。我們沒有涵蓋機(jī)器學(xué)習(xí)項(xiàng)目中的所有步驟孕豹,因?yàn)檫@是您的第一個(gè)項(xiàng)目涩盾,我們需要關(guān)注關(guān)鍵步驟。即励背,加載數(shù)據(jù)旁赊,查看數(shù)據(jù),評(píng)估一些算法并做出一些預(yù)測椅野。在后面的教程中,我們可以查看其他數(shù)據(jù)準(zhǔn)備和結(jié)果改進(jìn)任務(wù)籍胯。
這也是本文的初衷竟闪。
本文完整代碼見:https://github.com/zhangjuying20000/iris-machine-learning

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市杖狼,隨后出現(xiàn)的幾起案子炼蛤,更是在濱河造成了極大的恐慌,老刑警劉巖蝶涩,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件理朋,死亡現(xiàn)場離奇詭異,居然都是意外死亡绿聘,警方通過查閱死者的電腦和手機(jī)嗽上,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熄攘,“玉大人兽愤,你說我怎么就攤上這事∨不” “怎么了浅萧?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哲思。 經(jīng)常有香客問我洼畅,道長,這世上最難降的妖魔是什么棚赔? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任帝簇,我火速辦了婚禮徘郭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘己儒。我一直安慰自己崎岂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布闪湾。 她就那樣靜靜地躺著冲甘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪途样。 梳的紋絲不亂的頭發(fā)上江醇,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音何暇,去河邊找鬼陶夜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛裆站,可吹牛的內(nèi)容都是我干的条辟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼宏胯,長吁一口氣:“原來是場噩夢啊……” “哼羽嫡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肩袍,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤杭棵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后氛赐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體魂爪,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年艰管,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滓侍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛙婴,死狀恐怖粗井,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情街图,我是刑警寧澤浇衬,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站餐济,受9級(jí)特大地震影響耘擂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜絮姆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一醉冤、第九天 我趴在偏房一處隱蔽的房頂上張望秩霍。 院中可真熱鬧,春花似錦蚁阳、人聲如沸铃绒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颠悬。三九已至,卻和暖如春定血,著一層夾襖步出監(jiān)牢的瞬間赔癌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工澜沟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灾票,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓茫虽,卻偏偏與公主長得像刊苍,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子濒析,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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