99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀機(jī)器學(xué)習(xí)python應(yīng)用,簡(jiǎn)單機(jī)器學(xué)習(xí)項(xiàng)目實(shí)踐!
機(jī)器學(xué)習(xí)python應(yīng)用,簡(jiǎn)單機(jī)器學(xué)習(xí)項(xiàng)目實(shí)踐!
2020-05-25
收藏

上一篇文章中介紹了機(jī)器學(xué)習(xí)的簡(jiǎn)單知識(shí),還有python中進(jìn)行機(jī)器學(xué)習(xí)實(shí)踐需要的生態(tài)環(huán)境,接下來(lái)將會(huì)通過(guò)鳶尾花分類(lèi)這個(gè)例子對(duì)機(jī)器學(xué)習(xí)做一個(gè)簡(jiǎn)要的介紹。通過(guò)一步一步地實(shí)現(xiàn)這個(gè)項(xiàng)目來(lái)介紹以下內(nèi)容。

  • 導(dǎo)入和使用python機(jī)器學(xué)習(xí)的各個(gè)方面的類(lèi)庫(kù)。
  • 導(dǎo)入數(shù)據(jù),并通過(guò)描述性分析、可視化等對(duì)數(shù)據(jù)進(jìn)行分析。
  • 創(chuàng)建六個(gè)模型,并從中選擇準(zhǔn)確度最高的模型。

可以說(shuō)這并不是一個(gè)正式的項(xiàng)目,只是用來(lái)做一個(gè)簡(jiǎn)單的展示,用于給初次接觸機(jī)器學(xué)習(xí)的讀者快速了解機(jī)器學(xué)習(xí)的過(guò)程和結(jié)果。

1 機(jī)器學(xué)習(xí)中的Hello World頂目

學(xué)習(xí)編程時(shí),往往我們的第一句代碼就是print(“Hello World”),而接下來(lái)的這個(gè)數(shù)據(jù)集,可以說(shuō)得上是機(jī)器學(xué)習(xí)中的Hello World頂目,入門(mén)學(xué)習(xí)機(jī)器學(xué)習(xí)的過(guò)程中最常見(jiàn)的一個(gè)數(shù)據(jù)集。

這個(gè)項(xiàng)目是針對(duì)鳶尾花(Iris Flower)進(jìn)行分類(lèi)的一個(gè)項(xiàng)目,數(shù)據(jù)集是含鳶尾花的三個(gè)亞屬的分類(lèi)信息,通過(guò)機(jī)器學(xué)習(xí)算法生成一個(gè)模型,自動(dòng)分類(lèi)新數(shù)據(jù)到這三個(gè)亞屬的某一個(gè)中。項(xiàng)目中使用的鳶尾花數(shù)據(jù)集是一個(gè)非常容易理解的數(shù)據(jù)集,這個(gè)數(shù)據(jù)集具有以下特點(diǎn):

  • 所有的特征數(shù)據(jù)都是數(shù)字,不需要考慮如何導(dǎo)入和處理數(shù)據(jù) 。
  • 這是一個(gè)分類(lèi)問(wèn)題,可以很方便地通過(guò)有監(jiān)督學(xué)習(xí)算法來(lái)解決問(wèn)題。
  • 這是一個(gè)多分類(lèi)問(wèn)題,也許需要一些特殊的處理。
  • 所有的特征的數(shù)值采用相同的單位,不需要進(jìn)行尺度的轉(zhuǎn)換 。
  • 三個(gè)類(lèi)屬的數(shù)據(jù)完全一樣,沒(méi)有類(lèi)別不平衡問(wèn)題。
  • 有著較為明顯的區(qū)分,機(jī)器學(xué)習(xí)分類(lèi)效果較為明顯。

接下來(lái)我們將通過(guò)這個(gè)例子一步步地來(lái)展示一個(gè)機(jī)器學(xué)習(xí)項(xiàng)目的簡(jiǎn)化步驟。我們將按照下面的步驟實(shí)現(xiàn)這個(gè)項(xiàng)目 :

(1)導(dǎo)入數(shù)據(jù)。

(2)概述數(shù)據(jù)。

(3)數(shù)據(jù)可視化。

(4)評(píng)估算法。

(5)實(shí)施預(yù)測(cè)。

在整個(gè)項(xiàng)目的過(guò)程中,最好嘗試自己輸入每一行代碼,以加深對(duì)機(jī)器學(xué)習(xí)項(xiàng)目流程的理解。

2 導(dǎo)入數(shù)據(jù)

導(dǎo)入項(xiàng)目所需的各種數(shù)據(jù)處理、數(shù)據(jù)可視化以及機(jī)器學(xué)習(xí)相關(guān)庫(kù)和鳶尾花(Iris Flower)數(shù)據(jù)集。

2.1 導(dǎo)入類(lèi)庫(kù)

導(dǎo)入在項(xiàng)目中將要使用的類(lèi)庫(kù)和方法 。 代碼如下 :

# 導(dǎo)入類(lèi)庫(kù) from pandas import read_csv
from pandas.plotting import scatter_matrix
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
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.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC

所有類(lèi)庫(kù)的導(dǎo)入都不應(yīng)有錯(cuò)誤提示。如果出現(xiàn)了錯(cuò)誤提示,那么暫時(shí)停下來(lái),先設(shè)置一個(gè)能夠運(yùn)行的SciPy環(huán)境。

2.2 導(dǎo)入數(shù)據(jù)集

在本項(xiàng)目中我們使用的是 UCI 機(jī)器學(xué)習(xí)數(shù)據(jù)倉(cāng)庫(kù)中的鳶尾花(Iris Flower)數(shù)據(jù)集(
http://archive.ics.uci.edu/rnl/datasets/Iris),不需要下載,可以通過(guò)sklearn模塊中datasets導(dǎo)入數(shù)據(jù)直接使用。在這里將使用Pandas來(lái)導(dǎo)入數(shù)據(jù)和對(duì)數(shù)據(jù)進(jìn)行描述性統(tǒng)計(jì)分析,并利用 Matplotlib實(shí)現(xiàn)數(shù)據(jù)可視化。需要注意的是,在導(dǎo)入數(shù)據(jù)時(shí),為每個(gè)數(shù)據(jù)特征設(shè)定了名稱,這有助于后面對(duì)數(shù)據(jù)的展示工作,尤其是通過(guò)圖表展示數(shù)據(jù)。 代碼如下:

## 導(dǎo)入數(shù)據(jù) import pandas as pd             # 導(dǎo)入pandas庫(kù)
from sklearn import datasets    # 導(dǎo)入sklearn模塊中的datasets,用以導(dǎo)入數(shù)據(jù)
iris = datasets.load_iris()     # 直接導(dǎo)入數(shù)據(jù)
dataset = pd.DataFrame(data=iris.data,columns=iris.feature_names)   # 用DataFrame存放數(shù)據(jù)

3 概述數(shù)據(jù)

在導(dǎo)入數(shù)據(jù)之后,我們需要先看一下數(shù)據(jù),增加對(duì)數(shù)據(jù)的理解,以便選擇合適的算法。我們將從以下幾個(gè)角度來(lái)審查數(shù)據(jù):

(1)數(shù)據(jù)的維度。

(2)查看數(shù)據(jù)自身 。

(3)統(tǒng)計(jì)描述所有的數(shù)據(jù)特征。

(4)數(shù)據(jù)分類(lèi)的分布情況。

不要擔(dān)心這會(huì)需要很多代碼,每一種審查方法只有一行代碼。這些代碼非常有效,在以后的項(xiàng)目中也會(huì)用到。

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

通過(guò)查看數(shù)據(jù)的維度,可以對(duì)數(shù)據(jù)集有一個(gè)大概的了解,如數(shù)據(jù)集中有多少行數(shù)據(jù)、數(shù)據(jù)有幾個(gè)屬性等。代碼如下 :

#顯示數(shù)據(jù)維度 print('數(shù)據(jù)維度: 行 %s,列 %s' % dataset.shape) 

將會(huì)得到一個(gè)具有 150 行數(shù)據(jù), 4 個(gè)數(shù)據(jù)特征屬性的結(jié)果,執(zhí)行結(jié)果如下:

數(shù)據(jù)維度:  150,列 4 

3.2 查看數(shù)據(jù)自身

查看數(shù)據(jù)自身也是一個(gè)很好的理解數(shù)據(jù)的方法,通過(guò)查看數(shù)據(jù)可以直觀地看到數(shù)據(jù)的特征、數(shù)據(jù)的類(lèi)型,以及大概的數(shù)據(jù)分布范圍等。代碼如下:

# 查看數(shù)據(jù)的前10行 print(dataset.head(10)) 

在這里查看前10行記錄,執(zhí)行結(jié)果如下:

sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0                5.1 3.5 1.4 0.2 1 4.9 3.0 1.4 0.2 2 4.7 3.2 1.3 0.2 3 4.6 3.1 1.5 0.2 4 5.0 3.6 1.4 0.2 5 5.4 3.9 1.7 0.4 6 4.6 3.4 1.4 0.3 7 5.0 3.4 1.5 0.2 8 4.4 2.9 1.4 0.2 9 4.9 3.1 1.5 0.1 

3.3 統(tǒng)計(jì)描述數(shù)據(jù)

數(shù)據(jù)特征的統(tǒng)計(jì)描述信息包括數(shù)據(jù)的行數(shù)、中位值、最大值、最小值、均值、四分位值等統(tǒng)計(jì)數(shù)據(jù)信息。我們需要通過(guò)這些統(tǒng)計(jì)的信息來(lái)大致了解數(shù)據(jù)的情況。配合箱線圖能夠很好了了解數(shù)據(jù)的分布和數(shù)值大小還有異常值情況等,代碼如下:

# 統(tǒng)計(jì)描述數(shù)據(jù)信息 print(dataset.describe()) 

執(zhí)行結(jié)果如下:

sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) count 150.000000 150.000000 150.000000 150.000000 mean 5.843333 3.057333 3.758000 1.199333 std 0.828066 0.435866 1.765298 0.762238 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 數(shù)據(jù)分類(lèi)分布

接下來(lái)看一下數(shù)據(jù)在不同分類(lèi)的分布情況,執(zhí)行程序后得到的將是每個(gè)分類(lèi)數(shù)據(jù)量的絕對(duì)的數(shù)值,看一下各個(gè)分類(lèi)的數(shù)據(jù)分布是否均衡。代碼如下:

# 分類(lèi)分布情況 target = [x for x in iris.target] for item in set(target):  print("{} : {}".format(item,target.count(item))) 

這里就是通過(guò)前面設(shè)定的數(shù)據(jù)特征名稱來(lái)查看數(shù)據(jù)的 。 執(zhí)行結(jié)果如下:

0 : 50 1 : 50 2 : 50 

我們可以看到鶯尾花的三個(gè)亞屬的數(shù)據(jù)各 50 條,分布非常平衡。如果數(shù)據(jù)的分布不平衡時(shí),可能會(huì)影響到模型的準(zhǔn)確度。因此,當(dāng)數(shù)據(jù)分布不平衡時(shí),需要對(duì)數(shù)據(jù)進(jìn)行處理,調(diào)整數(shù)據(jù)到相對(duì)平衡的狀態(tài)。調(diào)整數(shù)據(jù)平衡時(shí)有以下幾種方法。

  • 擴(kuò)大數(shù)據(jù)樣本: 定向增加類(lèi)別較少的數(shù)據(jù),使其與其他類(lèi)別達(dá)到一定的比列,但數(shù)據(jù)是非常珍貴的,通常情況下我們建模使用的數(shù)據(jù)就已經(jīng)是全部的數(shù)據(jù)了,也無(wú)法再增加數(shù)據(jù)了。
  • 數(shù)據(jù)的重新抽樣:過(guò)抽樣 (復(fù)制少數(shù)類(lèi)樣本)和欠抽樣(刪除多數(shù)類(lèi)樣本)。當(dāng)數(shù)據(jù)量很大時(shí)可以考慮測(cè)試欠抽樣,當(dāng)數(shù)據(jù)量比較少時(shí)可以考慮過(guò)抽樣。
  • 生成人工樣本: 比如SMOTE方法,根據(jù)現(xiàn)有的數(shù)據(jù),通過(guò)某些計(jì)算,生成更多的少類(lèi)別的數(shù)據(jù)。
  • 異常檢測(cè)和變化檢測(cè): 嘗試用不同的觀點(diǎn)進(jìn)行思考,以解決問(wèn)題。異常檢測(cè)是對(duì)罕見(jiàn)事件的檢測(cè)。這種思維的轉(zhuǎn)變?cè)谟诳紤]以小類(lèi)作為異常值類(lèi),它可以幫助獲得一種新方法來(lái)分離和分類(lèi)樣本。

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

通過(guò)對(duì)數(shù)據(jù)集的審查,對(duì)數(shù)據(jù)有了一個(gè)基本的了解,接下來(lái)將通過(guò)圖表來(lái)進(jìn)一步查看數(shù)據(jù)特征的分布情況和數(shù)據(jù)不同特征之間的相互關(guān)系 。

  • 使用單變量圖表可以更好地理解每一個(gè)特征屬性。
  • 多變量圖表用于理解不同特征屬性之間的關(guān)系。 我們可以先看一下前面剛剛提到的分類(lèi)分布情況,執(zhí)行代碼如下:
## 畫(huà)圖顯示 import matplotlib.pyplot as plt
%matplotlib inline # 直方圖
plt.hist(target,[-0.5,0.5,1.5,2.5],rwidth=0.6)
plt.show()
案例算法 | <a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>機(jī)器學(xué)習(xí)</a><a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>應(yīng)用,簡(jiǎn)單<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>機(jī)器學(xué)習(xí)</a>項(xiàng)目實(shí)踐


“C:\Users\CDA\Desktop\CDA\02 - SEO\01 - 原創(chuàng)\【算法應(yīng)用】機(jī)器學(xué)習(xí)python應(yīng)用-簡(jiǎn)單機(jī)器學(xué)習(xí)項(xiàng)目實(shí)踐\圖片\類(lèi)別情況.png”

相對(duì)于數(shù)值而言,數(shù)據(jù)可視化后就非常直觀,我們可以清晰地了解到數(shù)據(jù)中的標(biāo)簽類(lèi)別個(gè)數(shù)以及每種類(lèi)別間的大致比例情況。

4.1 單變量圖表

單變量圖表可以顯示每一個(gè)單獨(dú)的特征屬性,因?yàn)槊總€(gè)特征屬性都是數(shù)字,因此我們可以通過(guò)箱線圖來(lái)展示屬性與中位值的離散速度,了解數(shù)據(jù)偏向和異常值情況。 代碼如下:

# 箱線圖 dataset.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False) plt.show()

執(zhí)行結(jié)果:

案例算法 | <a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>機(jī)器學(xué)習(xí)</a><a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>應(yīng)用,簡(jiǎn)單<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>機(jī)器學(xué)習(xí)</a>項(xiàng)目實(shí)踐

還可以通過(guò)直方圖來(lái)顯示每個(gè)特征屬性的分布狀況。 代碼如下:

# 直方圖 dataset.hist() plt.show()

在輸出的圖表中,我們看到 separ- length 和 separ-width 這兩個(gè)特征比較符合高斯分布。執(zhí)行結(jié)果如圖 3-2 所示 。

案例算法 | <a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>機(jī)器學(xué)習(xí)</a><a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>應(yīng)用,簡(jiǎn)單<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>機(jī)器學(xué)習(xí)</a>項(xiàng)目實(shí)踐

4.2 多變量圖表

通過(guò)多變量圖表可以查看不同特征屬性之間的關(guān)系。我們通過(guò)散點(diǎn)矩陣圖來(lái)查看每個(gè)屬性之間的影響關(guān)系。

# 散點(diǎn)矩陣圖 import seaborn as sns                   # 導(dǎo)入畫(huà)圖庫(kù)-seaborn 
plt.figure(figsize=(15.0, 10.0))
sns.pairplot(dataset, diag_kind = 'kde', 
             plot_kws = {'alpha': 0.6, 's': 80, 'edgecolor': 'k'},
             size =3)
# 保存圖片
plt.savefig('scatter_matrix.jpg', dpi=100, bbox_inches='tight')

執(zhí)行結(jié)果如下所示,對(duì)角線上的四副圖是四個(gè)特征的分布情況,其意義和前面的直方圖內(nèi)容的意義是一致的,很明顯看出 separ- length 和 separ-width 這兩個(gè)特征是單峰的,比較符合高斯分布;而 petal length 和 petal width是雙峰的。除了對(duì)角線外的其他圖則是散點(diǎn)圖的形式,它們表示的是不同特征間的相關(guān)性,從圖中我們可以看出 petal length 和 petal width這兩個(gè)特征間有著明顯的線性相關(guān)性。如果是回歸模型中,出現(xiàn)多重共線性的特征是需要進(jìn)行處理的,但我們目前只是簡(jiǎn)單的展示一下分類(lèi)機(jī)器學(xué)習(xí)的大致流程,所以就沒(méi)必須做處理了。

案例算法 | <a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>機(jī)器學(xué)習(xí)</a><a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>應(yīng)用,簡(jiǎn)單<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>機(jī)器學(xué)習(xí)</a>項(xiàng)目實(shí)踐

5 數(shù)據(jù)處理

一般在機(jī)器學(xué)習(xí)的項(xiàng)目中,數(shù)據(jù)清洗、數(shù)據(jù)處理就占去了整個(gè)項(xiàng)目的80%的工作量,所以這是機(jī)器學(xué)習(xí)項(xiàng)目中非常重要的一個(gè)環(huán)節(jié),但在本項(xiàng)目中,iris的數(shù)據(jù)已經(jīng)是非常完善的,不需要再進(jìn)行過(guò)多的數(shù)據(jù)處理過(guò)程。如此我們只需要簡(jiǎn)單處理一下原數(shù)據(jù),使其更適合在某些有特殊要求的算法上使用。

5.1 數(shù)據(jù)標(biāo)準(zhǔn)化

不同的算法對(duì)數(shù)據(jù)也有不同的要求,比如KNN算法,因?yàn)橐话闶腔跉W式距離進(jìn)行計(jì)算,所以也要求數(shù)據(jù)必須要做標(biāo)準(zhǔn)化,否則建模過(guò)程中大小不一的特征的實(shí)際權(quán)重也會(huì)不同,數(shù)值較大的特征將會(huì)覆蓋掉數(shù)值較小的特征。為了解決這中影響,我們可以將數(shù)據(jù)標(biāo)準(zhǔn)化,執(zhí)行代碼如下:

# 標(biāo)準(zhǔn)化處理
from sklearn import preprocessing
#建立StandardScaler對(duì)象 std = preprocessing.StandardScaler()
data_std = std.fit_transform(dataset)

5.2 分離出評(píng)估數(shù)據(jù)集

模型被創(chuàng)建后需要知道創(chuàng)建的模型是否足夠好。在選擇算法的過(guò)程中會(huì)采用統(tǒng)計(jì)學(xué)方法來(lái)評(píng)估算法模型。但是,我們更想知道算法模型對(duì)真實(shí)數(shù)據(jù)的準(zhǔn)確度如何,這就是保留一部分?jǐn)?shù)據(jù)來(lái)評(píng)估算法模型的主要原因。下面將按照70%的訓(xùn)練數(shù)據(jù)集,30%的評(píng)估數(shù)據(jù)集來(lái)分離數(shù)據(jù)。代碼如下:

# 分離數(shù)據(jù)集 ## 原數(shù)據(jù) X_train, X_validation, Y_train, Y_validation = train_test_split(dataset, target, test_size=0.3, random_state=12) ## 標(biāo)準(zhǔn)化數(shù)據(jù) X_train_std, X_validation_std, Y_train, Y_validation = train_test_split(data_std, target, test_size=0.3, random_state=12) 

現(xiàn)在就分離出了 X_train 和 Y_train 或者標(biāo)準(zhǔn)化后的X_train_std和Y_train用來(lái)訓(xùn)練算法創(chuàng)建模型, x_validation(X_validation_std)和Y_validation 在后面會(huì)用來(lái)驗(yàn)證評(píng)估模型。

6 評(píng)估算法

通過(guò)不同的算法來(lái)創(chuàng)建模型,并評(píng)估它們的準(zhǔn)確度,以便找到最合適的算法。將按照下面的步驟進(jìn)行操作:

(1)采用 10 折交叉驗(yàn)證來(lái)評(píng)估算法模型 。

(2)生成幾個(gè)常用的分類(lèi)模型來(lái)預(yù)測(cè)新數(shù)據(jù) 。

(3)選擇最優(yōu)模型

6.1 評(píng)估模式

在這里將通過(guò) 10 折交叉驗(yàn)證來(lái)分離訓(xùn)練數(shù)據(jù)集,并評(píng)估算法模型的準(zhǔn)確度。10 折交叉驗(yàn)證是隨機(jī)地將數(shù)據(jù)分成 10 份,9 份用來(lái)訓(xùn)練模型,1 份用來(lái)評(píng)估算法。后面我們會(huì)使用相同的數(shù)據(jù)對(duì)每一種算法進(jìn)行訓(xùn)練和評(píng)估 , 并從中選擇最好的模型。

6.2 創(chuàng)建模型

對(duì)任何問(wèn)題來(lái)說(shuō),不能僅通過(guò)對(duì)數(shù)據(jù)進(jìn)行審查,就判斷出哪個(gè)算法最有效。通過(guò)前面的圖表,發(fā)現(xiàn)有些數(shù)據(jù)特征符合線性分布,所有可以期待算法會(huì)得到比較好的結(jié)果 。

接下來(lái)評(píng)估六種不同的算法:

這個(gè)算法列表中包含了線性算法(LR)和非線性算法(ANN、KNN 、CART、NB和SVM)。在每次對(duì)算法進(jìn)行評(píng)估前都會(huì)重新設(shè)置隨機(jī)數(shù)的種子,以確保每次對(duì)算法的評(píng)估都使用相同的數(shù)據(jù)集,保證算法評(píng)估的準(zhǔn)確性。接下來(lái)就創(chuàng)建并評(píng)估這六種算法模型。代碼如下:

# 算法審查
models = {}
models['LR'] = LogisticRegression()
models['ANN'] = MLPClassifier()
models['KNN'] = KNeighborsClassifier()
models['CART'] = DecisionTreeClassifier()
models['NB'] = GaussianNB()
models['SVM'] = SVC()

# 評(píng)估算法
results = [] for key in models:
    kfold = KFold(n_splits=10, random_state=seed)
    cv_results = cross_val_score(models[key], X_train, Y_train, cv=kfold, scoring='accuracy')
    results.append(cv_results) print('原數(shù)據(jù):%s: %f (%f)' %(key, cv_results.mean(), cv_results.std()))

results = [] for key in models:
    kfold = KFold(n_splits=10, random_state=seed)
    cv_results = cross_val_score(models[key], X_train_std, Y_train, cv=kfold, scoring='accuracy')
    results.append(cv_results) print('標(biāo)準(zhǔn)化數(shù)據(jù):%s: %f (%f)' %(key, cv_results.mean(), cv_results.std()))

6.3 選擇最優(yōu)模型

現(xiàn)在已經(jīng)有了六種模型,并且評(píng)估了它們的精確度。接下來(lái)就需要比較這六種模型,并選出準(zhǔn)確度最高的算法。執(zhí)行上面的代碼,結(jié)果如下 :

原數(shù)據(jù):LR: 0.933636 (0.062463)
原數(shù)據(jù):ANN: 0.972727 (0.041660)
原數(shù)據(jù):KNN: 0.972727 (0.041660)
原數(shù)據(jù):CART: 0.914545 (0.066953)
原數(shù)據(jù):NB: 0.933636 (0.062463)
原數(shù)據(jù):SVM: 0.963636 (0.060302)

標(biāo)準(zhǔn)化數(shù)據(jù):LR: 0.887273 (0.069734)
標(biāo)準(zhǔn)化數(shù)據(jù):ANN: 0.942727 (0.064801)
標(biāo)準(zhǔn)化數(shù)據(jù):KNN: 0.942727 (0.046895)
標(biāo)準(zhǔn)化數(shù)據(jù):CART: 0.914545 (0.066953)
標(biāo)準(zhǔn)化數(shù)據(jù):NB: 0.933636 (0.062463)
標(biāo)準(zhǔn)化數(shù)據(jù):SVM: 0.951818 (0.065813)

通過(guò)上面的結(jié)果,可以看出實(shí)際上用原數(shù)據(jù)進(jìn)行建模的結(jié)果反而更好,說(shuō)明這份數(shù)據(jù)不需要再更變動(dòng)了。然后6種算法中神經(jīng)網(wǎng)絡(luò)KNN算法的準(zhǔn)確率最高,這種情況下怎么辦,該如何確定哪個(gè)才是更好的。接下來(lái)創(chuàng)建一個(gè)箱線圖,通過(guò)圖表來(lái)比較算法的評(píng)估結(jié)果。 代碼如下 :

# 箱線圖比較算法 fig = plt.figure() fig.suptitle('Algorithm Comparison') ax = fig.add_subplot(111) plt.boxplot(results) ax.set_xticklabels(models.keys()) plt.show() 

執(zhí)行結(jié)果:

案例算法 | <a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>機(jī)器學(xué)習(xí)</a><a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>應(yīng)用,簡(jiǎn)單<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>機(jī)器學(xué)習(xí)</a>項(xiàng)目實(shí)踐

我們可以看出,雖然總體的平均準(zhǔn)確率和標(biāo)準(zhǔn)差是一樣的,但是ANN算法的中值相對(duì)KNN的更高,說(shuō)明ANN算法的相對(duì)來(lái)說(shuō)會(huì)更好一點(diǎn)。

7 實(shí)施預(yù)測(cè)

評(píng)估的結(jié)果顯示,神經(jīng)網(wǎng)絡(luò)(ANN) 是準(zhǔn)確度最高的算法?,F(xiàn)在使用預(yù)留的評(píng)估數(shù)據(jù)集來(lái)驗(yàn)證這個(gè)算法模型。這將會(huì)對(duì)生成的算法模型的準(zhǔn)確度有一個(gè)更加直觀的認(rèn)識(shí)?,F(xiàn)在使用全部訓(xùn)練集的數(shù)據(jù)生成神經(jīng)網(wǎng)絡(luò)(ANN)的算法模型,并用預(yù)留的評(píng)估數(shù)據(jù)集給出一個(gè)算法模型的報(bào)告。 代碼如下:

#使用評(píng)估數(shù)據(jù)集評(píng)估算法 ann = MLPClassifier() ann.fit(X=X_train, y=Y_train) predictions = ann.predict(X_validation) print("準(zhǔn)確率:",accuracy_score(Y_validation, predictions)) print(confusion_matrix(Y_validation, predictions)) print(classification_report(Y_validation, predictions)) 

執(zhí)行程序后,看到算法模型的準(zhǔn)確度是0.98。通過(guò)混淆矩陣看到只有一個(gè)數(shù)據(jù)預(yù)測(cè)錯(cuò)誤。最后還提供了一個(gè)包含精確率(precision)、召回率(recall)、Fl 值(Fl-score)等數(shù)據(jù)的報(bào)告。結(jié)果如下:

準(zhǔn)確率: 0.9777777777777777 [[20 0 0] [ 0 13 1] [ 0 0 11]] precision recall f1-score support 0 1.00 1.00 1.00 20 1 1.00 0.93 0.96 14 2 0.92 1.00 0.96 11 accuracy 0.98 45 macro avg 0.97 0.98 0.97 45 weighted avg 0.98 0.98 0.98 45 

8 總結(jié)

到這里已經(jīng)完成了第一個(gè)機(jī)器學(xué)習(xí)項(xiàng)目。這個(gè)項(xiàng)目包含從數(shù)據(jù)導(dǎo)入到生成模型,以及通過(guò)模型對(duì)數(shù)據(jù)進(jìn)行分類(lèi)的全部過(guò)程。通過(guò)這個(gè)項(xiàng)目我們熟悉了機(jī)器學(xué)習(xí)項(xiàng)目中的各個(gè)步驟。接下來(lái)將介紹在本文中用到的對(duì)數(shù)據(jù)進(jìn)行處理分析的技巧和算法,以及改進(jìn)算法的實(shí)踐。

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }