機(jī)器學(xué)習(xí)之模型建立及評(píng)估

常見(jiàn)的模型評(píng)價(jià)和在Python中的實(shí)現(xiàn)


python數(shù)據(jù)挖掘建模中,

第一個(gè)步驟是建立一個(gè)對(duì)象,這個(gè)對(duì)象是空白的,需要進(jìn)一步訓(xùn)練的;

然后,設(shè)置模型的參數(shù);

接著,通過(guò)fit()方法對(duì)模型進(jìn)行訓(xùn)練;

最后,通過(guò)predict()方法預(yù)測(cè)結(jié)果。也可以通過(guò)其他方法對(duì)模型評(píng)估,如score()等。

原文地址

KNN算法是一個(gè)非常優(yōu)秀的數(shù)據(jù)挖掘模型,它既可以解決離散型因變量的分類(lèi)問(wèn)題,也可以處理連續(xù)型因變量的預(yù)測(cè)問(wèn)題,而且該算法對(duì)數(shù)據(jù)的分布特征沒(méi)有任何的要求。在本次的實(shí)戰(zhàn)項(xiàng)目中,將利用該算法對(duì)學(xué)生知識(shí)的掌握程度作分類(lèi)判別,并對(duì)高爐發(fā)電量作預(yù)測(cè)分析。

Python中的sklearn模塊提供了有關(guān)KNN算法實(shí)現(xiàn)分類(lèi)和預(yù)測(cè)的功能,該功能存在于子模塊neighbors中。其中,KNeighborsClassifier“類(lèi)”可以解決分類(lèi)問(wèn)題,而KNeighborsRegressor“類(lèi)”則可以解決預(yù)測(cè)問(wèn)題。首先,針對(duì)這兩個(gè)“類(lèi)”的語(yǔ)法和參數(shù)含義作詳細(xì)描述:

neighbors.KNeighborsClassifier(n_neighbors=5,weights=’uniform’, algorithm=’auto’, leaf_size=30,p=2,metric=’minkowski’, metric_params=None, n_jobs=1)

neighbors.KNeighborsRegressor(n_neighbors=5,weights=’uniform’, algorithm=’auto’, leaf_size=30,p=2,metric=’minkowski’, metric_params=None, n_jobs=1)

n_neighbors:用于指定近鄰樣本個(gè)數(shù)K,默認(rèn)為5;

weights:用于指定近鄰樣本的投票權(quán)重,默認(rèn)為’uniform’,表示所有近鄰樣本的投票權(quán)重一樣;如果為’distance’,則表示投票權(quán)重與距離成反比,即近鄰樣本與未知類(lèi)別的樣本點(diǎn)距離越遠(yuǎn),權(quán)重越小,反之,權(quán)值越大;

algorithm:用于指定近鄰樣本的搜尋算法,如果為’ball_tree’,則表示使用球樹(shù)搜尋法尋找近鄰樣本;如果為’kd_tree’,則表示使用KD樹(shù)搜尋法尋找近鄰樣本;如果為’brute’,則表示使用暴力搜尋法尋找近鄰樣本。默認(rèn)為’auto’,表示KNN算法會(huì)根據(jù)數(shù)據(jù)特征自動(dòng)選擇最佳的搜尋算法;

leaf_size:用于指定球樹(shù)或KD樹(shù)葉子節(jié)點(diǎn)所包含的最小樣本量,它用于控制樹(shù)的生長(zhǎng)條件,會(huì)影響樹(shù)的查詢速度,默認(rèn)為30;

metric:用于指定距離的度量指標(biāo),默認(rèn)為閔可夫斯基距離;

p:當(dāng)參數(shù)metric為閔可夫斯基距離時(shí),p=1,表示計(jì)算點(diǎn)之間的曼哈頓距離;p=2,表示計(jì)算點(diǎn)之間的歐氏距離;該參數(shù)的默認(rèn)值為2;

metric_params:為metric參數(shù)所對(duì)應(yīng)的距離指標(biāo)添加關(guān)鍵字參數(shù);

n_jobs:用于設(shè)置KNN算法并行計(jì)算所需的CPU數(shù)量,默認(rèn)為1表示僅使用1個(gè)CPU運(yùn)行算法,即不使用并行運(yùn)算功能;

對(duì)比兩個(gè)“類(lèi)”的語(yǔ)法和參數(shù),可以發(fā)現(xiàn)兩者幾乎是完全一樣的,在本人看來(lái),有兩個(gè)比較重要的參數(shù),它們是n_neighbors和weights,在實(shí)際的項(xiàng)目應(yīng)用中需要對(duì)比各種可能的值,并從中挑出出理想的參數(shù)值。為了將KNN算法的理論知識(shí)應(yīng)用到實(shí)戰(zhàn)中,接下來(lái)將利用這兩個(gè)“類(lèi)”作分類(lèi)和預(yù)測(cè)分析。

KNN模型的分類(lèi)功能

對(duì)于分類(lèi)問(wèn)題的解決,將使用Knowledge數(shù)據(jù)集作為演示,該數(shù)據(jù)集來(lái)自于UCI主頁(yè)(http://archive.ics.uci.edu/ml/datasets.html)。數(shù)據(jù)集一共包含403個(gè)觀測(cè)和6個(gè)變量,首先預(yù)覽一下該數(shù)據(jù)集的前幾行信息:

# 導(dǎo)入第三方包import pandas as pd# 導(dǎo)入數(shù)據(jù)Knowledge= pd.read_excel(r’C:\Users\Administrator\Desktop\Knowledge.xlsx’)# 返回前5行數(shù)據(jù)Knowledge.head()

如上表所示,行代表每一個(gè)被觀察的學(xué)生;前5列分別為學(xué)生在目標(biāo)學(xué)科上的學(xué)習(xí)時(shí)長(zhǎng)(STG)、重復(fù)次數(shù)(SCG)、相關(guān)科目的學(xué)習(xí)時(shí)長(zhǎng)(STR)、相關(guān)科目的考試成績(jī)(LPR)和目標(biāo)科目的考試成績(jī)(PEG),這5個(gè)指標(biāo)都已做了歸一化的處理;最后一列是學(xué)生對(duì)知識(shí)掌握程度的高低分類(lèi)(UNS),一共含有四種不同的值,分別為Very Low、Low、Middle和High。 接下來(lái),利用該數(shù)據(jù)集構(gòu)建KNN算法的分類(lèi)模型。

為了驗(yàn)證模型的擬合效果,需要預(yù)先將數(shù)據(jù)集拆分為訓(xùn)練集和測(cè)試集,訓(xùn)練集用來(lái)構(gòu)造KNN模型,測(cè)試集用來(lái)評(píng)估模型的擬合效果:

# 導(dǎo)入第三方模塊from sklearn import model_selection

# 拆分訓(xùn)練集和測(cè)試集

X_train, X_test, y_train, y_test

=model_selection.train_test_split(Knowledge[predictors], Knowledge.UNS,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? test_size = 0.25, random_state = 1234)

當(dāng)數(shù)據(jù)一切就緒以后,按理應(yīng)該構(gòu)造KNN的分類(lèi)模型,但是前提得指定一個(gè)合理的近鄰個(gè)數(shù)k,因?yàn)槟P头浅H菀资艿皆撝档挠绊憽km然KNeighborsClassifier“類(lèi)”提供了默認(rèn)的近鄰個(gè)數(shù)5,但并不代表該值就是合理的,所以需要利用多重交叉驗(yàn)證的方法,獲取符合數(shù)據(jù)的理想k值:

# 導(dǎo)入第三方模塊import numpy as npfrom sklearn import neighborsimport matplotlib.pyplot as plt# 設(shè)置待測(cè)試的不同k值K = np.arange(1,np.ceil(np.log2(Knowledge.shape[0])))# 構(gòu)建空的列表,用于存儲(chǔ)平均準(zhǔn)確率accuracy = []for k in K: ? ?# 使用10重交叉驗(yàn)證的方法,比對(duì)每一個(gè)k值下KNN模型的預(yù)測(cè)準(zhǔn)確率

? ?cv_result =

? ?model_selection.cross_val_score(

? ?neighbors.KNeighborsClassifier(n_neighbors = k, weights = 'distance'),

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? X_train, y_train, cv = 10, scoring='accuracy')

? ?accuracy.append(cv_result.mean())# 從k個(gè)平均準(zhǔn)確率中挑選出最大值所對(duì)應(yīng)的下標(biāo) ? ?arg_max = np.array(accuracy).argmax()# 中文和負(fù)號(hào)的正常顯示plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']

plt.rcParams['axes.unicode_minus'] = False# 繪制不同K值與平均預(yù)測(cè)準(zhǔn)確率之間的折線圖plt.plot(K, accuracy)# 添加點(diǎn)圖plt.scatter(K, accuracy)# 添加文字說(shuō)明plt.text(K[arg_max], accuracy[arg_max], '最佳k值為%s' %int(K[arg_max]))# 顯示圖形plt.show()

如上圖所示,經(jīng)過(guò)10重交叉驗(yàn)證的運(yùn)算,確定最佳的近鄰個(gè)數(shù)為6個(gè)。接下來(lái),利用這個(gè)最佳的k值,對(duì)訓(xùn)練數(shù)據(jù)集進(jìn)行建模,并將建好的模型應(yīng)用在測(cè)試數(shù)據(jù)集上:

# 重新構(gòu)建模型,并將最佳的近鄰個(gè)數(shù)設(shè)置為6knn_class = neighbors.KNeighborsClassifier(n_neighbors = 6, weights = 'distance')# 模型擬合knn_class.fit(X_train, y_train)# 模型在測(cè)試數(shù)據(jù)集上的預(yù)測(cè)predict = knn_class.predict(X_test)# 構(gòu)建混淆矩陣cm = pd.crosstab(predict,y_test)

cm

如上表所示,返回了模型在測(cè)試集上的混淆矩陣 ,單從主對(duì)角線來(lái)看,絕大多數(shù)的樣本都被正確分類(lèi)。進(jìn)而基于混淆矩陣,計(jì)算出模型在測(cè)試數(shù)據(jù)集上的預(yù)測(cè)準(zhǔn)確率

# 導(dǎo)入第三方模塊from sklearn import metrics# 模型整體的預(yù)測(cè)準(zhǔn)確率metrics.scorer.accuracy_score(y_test, predict)

如上結(jié)果所示,模型的預(yù)測(cè)準(zhǔn)確率為91.09%。準(zhǔn)確率的計(jì)算公式為:混淆矩陣中主對(duì)角線數(shù)字之和與所有數(shù)字之和的商。遺憾的是,該指標(biāo)只能衡量模型的整體預(yù)測(cè)效果,卻無(wú)法對(duì)比每個(gè)類(lèi)別的預(yù)測(cè)精度、覆蓋率等信息。如需計(jì)算各類(lèi)別的預(yù)測(cè)效果,可以使用下方代碼:

# 分類(lèi)模型的評(píng)估報(bào)告print(metrics.classification_report(y_test, predict))

如上結(jié)果所示,前四行代表因變量y中的各個(gè)類(lèi)別值,最后一行為各指標(biāo)的綜合水平;第一列precision表示模型的預(yù)測(cè)精度,計(jì)算公式為:預(yù)測(cè)正確的類(lèi)別個(gè)數(shù)/該類(lèi)別預(yù)測(cè)的所有個(gè)數(shù);第二列recall表示模型的預(yù)測(cè)覆蓋率,計(jì)算公式為:預(yù)測(cè)正確的類(lèi)別個(gè)數(shù)/該類(lèi)別實(shí)際的所有個(gè)數(shù);第三列f1-score是對(duì)precision和recall的加權(quán)結(jié)果;第四列為類(lèi)別實(shí)際的樣本個(gè)數(shù)。

KNN模型的預(yù)測(cè)

對(duì)于預(yù)測(cè)問(wèn)題的實(shí)戰(zhàn),將使用CCPP數(shù)據(jù)集作為演示,該數(shù)據(jù)集涉及了高爐煤氣聯(lián)合循環(huán)發(fā)電的幾個(gè)重要指標(biāo),其同樣來(lái)自于UCI網(wǎng)站。首先通過(guò)如下代碼,獲知各變量的含義以及數(shù)據(jù)集的規(guī)模:

# 讀入數(shù)據(jù)ccpp = pd.read_excel(r'C:\Users\Administrator\Desktop\CCPP.xlsx')

ccpp.head()

ccpp.shape

如上表所示,前4個(gè)變量為自變量,AT表示高爐的溫度、V表示爐內(nèi)的壓力、AP表示高爐的相對(duì)濕度、RH表示高爐的排氣量;最后一列為連續(xù)型的因變量,表示高爐的發(fā)電量。該數(shù)據(jù)集一共包含9,568條觀測(cè),由于4個(gè)自變量的量綱不一致,所以在使用KNN模型進(jìn)行預(yù)測(cè)之前,需要對(duì)其作標(biāo)準(zhǔn)化處理:

# 導(dǎo)入第三方包from sklearn.preprocessing import minmax_scale# 對(duì)所有自變量數(shù)據(jù)作標(biāo)準(zhǔn)化處理predictors = ccpp.columns[:-1]

X = minmax_scale(ccpp[predictors])

同理,也需要將數(shù)據(jù)集拆分為兩部分,分別用戶模型的構(gòu)建和模型的測(cè)試。使用訓(xùn)練集構(gòu)建KNN模型之前,必須指定一個(gè)合理的近鄰個(gè)數(shù)k值。這里仍然使用10重交叉驗(yàn)證的方法,所不同的是,在驗(yàn)證過(guò)程中,模型好壞的衡量指標(biāo)不再是準(zhǔn)確率,而是MSE(均方誤差):

# 設(shè)置待測(cè)試的不同k值K = np.arange(1,np.ceil(np.log2(ccpp.shape[0])))# 構(gòu)建空的列表,用于存儲(chǔ)平均MSEmse = []for k in K: ? ?# 使用10重交叉驗(yàn)證的方法,比對(duì)每一個(gè)k值下KNN模型的計(jì)算MSE

? ?cv_result = model_selection.cross_val_score(

? ?neighbors.KNeighborsRegressor(n_neighbors = k, weights = 'distance'),

? ?X_train, y_train, cv = 10, scoring='neg_mean_squared_error')

? ?mse.append((-1*cv_result).mean())# 從k個(gè)平均MSE中挑選出最小值所對(duì)應(yīng)的下標(biāo) ? ? ?arg_min = np.array(mse).argmin()# 繪制不同K值與平均MSE之間的折線圖plt.plot(K, mse)# 添加點(diǎn)圖plt.scatter(K, mse)# 添加文字說(shuō)明plt.text(K[arg_min], mse[arg_min] + 0.5, '最佳k值為%s' %int(K[arg_min]))# 顯示圖形plt.show()

如上圖所示,經(jīng)過(guò)10重交叉驗(yàn)證,得到最佳的近鄰個(gè)數(shù)為7。接下來(lái),利用這個(gè)最佳的k值,對(duì)訓(xùn)練數(shù)據(jù)集進(jìn)行建模,并將建好的模型應(yīng)用在測(cè)試數(shù)據(jù)集上:

# 重新構(gòu)建模型,并將最佳的近鄰個(gè)數(shù)設(shè)置為7knn_reg = neighbors.KNeighborsRegressor(n_neighbors = 7, weights = 'distance')# 模型擬合knn_reg.fit(X_train, y_train)# 模型在測(cè)試集上的預(yù)測(cè)predict = knn_reg.predict(X_test)# 計(jì)算MSE值metrics.mean_squared_error(y_test, predict)

如上結(jié)果所示,對(duì)于連續(xù)因變量的預(yù)測(cè)問(wèn)題來(lái)說(shuō),通常使用MSE或RMSE(均方誤差根)評(píng)估模型好壞,如果該值越小,說(shuō)明預(yù)測(cè)值與真實(shí)值越接近。單看上面計(jì)算所得的12.81可能沒(méi)有什么感覺(jué),這里可以對(duì)比測(cè)試集中的真實(shí)數(shù)據(jù)和預(yù)測(cè)數(shù)據(jù),查看兩者之間的差異,不妨取出各自的前10行用于比較:

# 對(duì)比真實(shí)值和實(shí)際值pd.DataFrame({'Real':y_test,'Predict':predict}, columns=['Real','Predict']).head(10)

如上表所示,通過(guò)對(duì)比發(fā)現(xiàn),KNN模型在測(cè)試集上的預(yù)測(cè)值與實(shí)際值非常的接近,可以認(rèn)為模型的擬合效果非常理想。

常見(jiàn)的模型評(píng)價(jià)和在Python中的實(shí)現(xiàn)

模型 模型特點(diǎn) 所屬庫(kù)

邏輯回歸 線性分類(lèi)模型 sklearn.linear_model

SVM 用來(lái)回歸、預(yù)測(cè)、分類(lèi)等。模型可以是線性的/非線性的 sklearn.svm

決策樹(shù) 基于“分類(lèi)討論、逐步細(xì)化”思想的分類(lèi)模型,直觀易解釋 sklearn.tree

隨機(jī)森林 思想跟決策樹(shù)類(lèi)似,精度通常比決策樹(shù)高,缺點(diǎn)是由于其隨機(jī)性,喪失了決策樹(shù)的可解釋性 sklearn.ensemble

樸素貝葉斯 基于概率思想的簡(jiǎn)單有效的分類(lèi)模型 sklearn.naive_bayes

神經(jīng)網(wǎng)絡(luò) 具有強(qiáng)大的擬合能力,可以用于擬合、分類(lèi)等,是深度學(xué)習(xí)的模型基礎(chǔ) Keras

python數(shù)據(jù)挖掘建模中,

第一個(gè)步驟是建立一個(gè)對(duì)象,這個(gè)對(duì)象是空白的,需要進(jìn)一步訓(xùn)練的;

然后,設(shè)置模型的參數(shù);

接著,通過(guò)fit()方法對(duì)模型進(jìn)行訓(xùn)練;

最后,通過(guò)predict()方法預(yù)測(cè)結(jié)果。也可以通過(guò)其他方法對(duì)模型評(píng)估,如score()等。

————————————————

版權(quán)聲明:本文為CSDN博主「zjlamp」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/zjlamp/article/details/82111451

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 前言 通過(guò)本文,你將了解并深刻理解什么是 KNN算法。當(dāng)然,閱讀本文前,你最好會(huì)點(diǎn)python,這樣閱讀起來(lái)才會(huì)沒(méi)...
    code_solve閱讀 4,744評(píng)論 9 46
  • 假設(shè)你去隨機(jī)問(wèn)很多人一個(gè)很復(fù)雜的問(wèn)題,然后把它們的答案合并起來(lái)。通常情況下你會(huì)發(fā)現(xiàn)這個(gè)合并的答案比一個(gè)專(zhuān)家的答案要...
    城市中迷途小書(shū)童閱讀 2,567評(píng)論 0 1
  • 今天,我們將更深入地學(xué)習(xí)和實(shí)現(xiàn)8個(gè)頂級(jí)Python機(jī)器學(xué)習(xí)算法。 讓我們開(kāi)始Python編程中的機(jī)器學(xué)習(xí)算法之旅。...
    梔子花_ef39閱讀 8,462評(píng)論 0 62
  • 走進(jìn)斷垣殘壁,那些充滿異域風(fēng)情的佛塔,便奪人眼目,從歷史的質(zhì)感中,體會(huì)到昔日的輝煌與宏大、精美、威嚴(yán)。即便不明白那...
    云起半山閱讀 371評(píng)論 1 4
  • 近日中國(guó)NextEV(蔚來(lái)電動(dòng)汽車(chē))推出的新款車(chē)型號(hào)稱(chēng)是世界上速度最快的電動(dòng)汽車(chē)。純電動(dòng)汽車(chē)已經(jīng)存在了數(shù)十年時(shí)間,...
    老尹聊車(chē)閱讀 181評(píng)論 0 0