用KNN算法判斷知識(shí)掌握程度高低

KNN算法既可以解決分類問(wèn)題喜颁,也可以解決預(yù)測(cè)問(wèn)題。
基礎(chǔ)思想:通過(guò)計(jì)算每個(gè)訓(xùn)練樣例到待分類樣品的距離曹阔,取和待分類樣品距離最近的K個(gè)訓(xùn)練樣例半开,K個(gè)樣品中哪個(gè)類別的訓(xùn)練樣例占多數(shù),則待分類樣品就屬于哪個(gè)類別赃份。

對(duì)于離散型因變量寂拆,從k個(gè)最近的已知類別樣本中挑選出頻率最高的類別用于未知樣本的判斷;對(duì)于連續(xù)型因變量抓韩,將k個(gè)最近的已知樣本均值用作未知樣本的預(yù)測(cè)纠永。

k值過(guò)小,模型過(guò)擬合谒拴,例如k=1尝江,未知樣本的類別將由最近的1個(gè)已知樣本點(diǎn)來(lái)決定,對(duì)于訓(xùn)練數(shù)據(jù)來(lái)說(shuō)英上,訓(xùn)練誤差幾乎為0炭序,對(duì)于測(cè)試數(shù)據(jù)來(lái)說(shuō),訓(xùn)練誤差可能會(huì)很大苍日,因?yàn)榫嚯x最近的1個(gè)已知樣本點(diǎn)可以是異常觀測(cè)值惭聂,也可以是正常觀測(cè)值。

k值過(guò)大相恃,模型欠擬合辜纲,例如k=N,未知樣本的類別將由所有已知樣本中頻數(shù)最高的類別決定,不管是訓(xùn)練集還是測(cè)試集被判為一種類別侨歉,易欠擬合屋摇。

一般利用多重交叉驗(yàn)證得到平均誤差最小的k值揩魂。還有一種方法是設(shè)置k近鄰樣本的投票權(quán)重幽邓,對(duì)已知樣本距離較遠(yuǎn)的設(shè)置權(quán)重低一些,較近的設(shè)置權(quán)重高一些火脉,通常將權(quán)重設(shè)置為距離的倒數(shù)牵舵。

點(diǎn)與點(diǎn)之間的距離即相似性,一般用歐氏距離倦挂,即L2范數(shù)
或者曼哈頓距離畸颅,即L1范數(shù)
或者余弦相似度cosα
或者杰卡德相似系數(shù),即J=|A∩B|/|A∪B|

在使用距離方法來(lái)度量相似性時(shí)方援,要使所有變量數(shù)值化(通過(guò)啞變量或者重編碼為0,1,2)没炒,而且采用標(biāo)準(zhǔn)化方法進(jìn)行歸一化,防止數(shù)值變量的量綱影響

近鄰搜尋方法包括:暴力搜尋法(全表掃描)犯戏,kd樹(shù)(k為訓(xùn)練集中包含的變量個(gè)數(shù)送火,而非KNN中的k個(gè)鄰近樣本,先用所有已知類別的樣本點(diǎn)構(gòu)造一棵樹(shù)先匪,再將未知類別應(yīng)用在樹(shù)上)种吸,球樹(shù)搜尋(將kd樹(shù)中的超矩形體換成了超球體)。

優(yōu)點(diǎn):
精度高呀非,對(duì)異常值不敏感坚俗,無(wú)數(shù)據(jù)輸入假定;
KNN 是一種在線技術(shù)岸裙,新數(shù)據(jù)可以直接加入數(shù)據(jù)集而不必進(jìn)行重新訓(xùn)練猖败;
KNN 理論簡(jiǎn)單,容易實(shí)現(xiàn)降允。

缺點(diǎn):
對(duì)于樣本容量大的數(shù)據(jù)集計(jì)算量比較大恩闻,即計(jì)算復(fù)雜度高;
必須保存全部數(shù)據(jù)集拟糕,即空間復(fù)雜度高判呕;
KNN 每一次分類都會(huì)重新進(jìn)行一次全局運(yùn)算;
樣本不平衡時(shí)送滞,預(yù)測(cè)偏差比較大侠草。如:某一類的樣本比較少,而其它類樣本比較多犁嗅;
K 值大小的選擇边涕;
KNN 無(wú)法給出基礎(chǔ)結(jié)構(gòu)信息,無(wú)法知曉平均實(shí)例樣本與典型實(shí)例樣本具有什么特征,即無(wú)法給出數(shù)據(jù)的內(nèi)在含義功蜓。

應(yīng)用領(lǐng)域:
文本分類园爷;模式識(shí)別;聚類分析式撼;多分類領(lǐng)域童社。

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

行表示每一個(gè)被觀測(cè)的學(xué)生,
STG:在目標(biāo)學(xué)科上的學(xué)習(xí)時(shí)長(zhǎng)著隆,
SCG:重復(fù)次數(shù)
STR:相關(guān)科目的學(xué)習(xí)時(shí)長(zhǎng)
LPR:相關(guān)科目的考試成績(jī)
PEG:目標(biāo)科目的考試成績(jī)
(以上指標(biāo)均已標(biāo)準(zhǔn)化)
UNG:對(duì)知識(shí)的掌握程度高低

# 構(gòu)造訓(xùn)練集和測(cè)試集
# 導(dǎo)入第三方模塊
from sklearn import model_selection
# 將數(shù)據(jù)集拆分為訓(xùn)練集和測(cè)試集
predictors = Knowledge.columns[:-1]
X_train, X_test, y_train, y_test = model_selection.train_test_split(Knowledge[predictors], Knowledge.UNS, 
                                                                    test_size = 0.25, random_state = 1234)

利用多重交叉驗(yàn)證獲取符合數(shù)據(jù)的理想k值

Knowledge.shape[0]
import numpy as np
np.log2(Knowledge.shape[0])
np.ceil(np.log2(Knowledge.shape[0]))
# 導(dǎo)入第三方模塊
from sklearn import neighbors
import matplotlib.pyplot as plt

# 設(shè)置待測(cè)試的不同k值
K = np.arange(1,np.ceil(np.log2(Knowledge.shape[0])))
K
# 構(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 = int(k), weights = 'distance'), 
                                                X_train, y_train, cv = 10, scoring='accuracy')
    accuracy.append(cv_result.mean())
accuracy
# 從k個(gè)平均準(zhǔn)確率中挑選出最大值所對(duì)應(yīng)的下標(biāo)    
arg_max = np.array(accuracy).argmax()
arg_max
# 中文和負(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)證美浦,最佳的近鄰個(gè)數(shù)為6

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

# 重新構(gòu)建模型弦赖,并將最佳的近鄰個(gè)數(shù)設(shè)置為6
knn_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

weights=uniform,表示投票權(quán)重一樣
=distance浦辨,表示投票權(quán)重與距離成反比



從主對(duì)角線看蹬竖,絕大多數(shù)樣本被正確分類

通過(guò)熱力圖可視化混淆矩陣

# 導(dǎo)入第三方模塊
import seaborn as sns

# 將混淆矩陣構(gòu)造成數(shù)據(jù)框,并加上字段名和行名稱流酬,用于行或列的含義說(shuō)明
cm = pd.DataFrame(cm)
# 繪制熱力圖
sns.heatmap(cm, annot = True,cmap = 'GnBu')
# 添加x軸和y軸的標(biāo)簽
plt.xlabel(' Real Lable')
plt.ylabel(' Predict Lable')
# 圖形顯示
plt.show()

行代表真實(shí)地币厕,列代表預(yù)測(cè)的,主對(duì)角線上的顏色比較深康吵,說(shuō)明絕大多數(shù)樣本是被正確分類的劈榨。

下面得到模型在測(cè)試集上的預(yù)測(cè)準(zhǔn)確率:

# 模型整體的預(yù)測(cè)準(zhǔn)確率
metrics.scorer.accuracy_score(y_test, predict)

整體預(yù)測(cè)準(zhǔn)確率為91.09%,要得到每個(gè)類別的準(zhǔn)確率:

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

第一列為預(yù)測(cè)精度晦嵌,即”預(yù)測(cè)正確的類別個(gè)數(shù)/該類別預(yù)測(cè)的所有個(gè)數(shù)"
第二列為預(yù)測(cè)覆蓋率同辣,即”預(yù)測(cè)正確的類別個(gè)數(shù)/該類別實(shí)際的所有個(gè)數(shù)"
第三列為前兩列的加權(quán)結(jié)果
第四列為類別實(shí)際的樣本個(gè)數(shù)

對(duì)于預(yù)測(cè)問(wèn)題的解決同決策樹(shù)中一樣,用MSE衡量

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末惭载,一起剝皮案震驚了整個(gè)濱河市旱函,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌描滔,老刑警劉巖棒妨,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異含长,居然都是意外死亡券腔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門拘泞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)纷纫,“玉大人,你說(shuō)我怎么就攤上這事陪腌∪杩” “怎么了烟瞧?”我有些...
    開(kāi)封第一講書人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)染簇。 經(jīng)常有香客問(wèn)我参滴,道長(zhǎng),這世上最難降的妖魔是什么锻弓? 我笑而不...
    開(kāi)封第一講書人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任砾赔,我火速辦了婚禮,結(jié)果婚禮上弥咪,老公的妹妹穿的比我還像新娘过蹂。我一直安慰自己,他們只是感情好聚至,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著本橙,像睡著了一般扳躬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上甚亭,一...
    開(kāi)封第一講書人閱讀 52,196評(píng)論 1 308
  • 那天贷币,我揣著相機(jī)與錄音,去河邊找鬼亏狰。 笑死役纹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的暇唾。 我是一名探鬼主播促脉,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼策州!你這毒婦竟也來(lái)了瘸味?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤够挂,失蹤者是張志新(化名)和其女友劉穎旁仿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體孽糖,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枯冈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了办悟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尘奏。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖誉尖,靈堂內(nèi)的尸體忽然破棺而出罪既,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布琢感,位于F島的核電站丢间,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏驹针。R本人自食惡果不足惜烘挫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柬甥。 院中可真熱鬧饮六,春花似錦、人聲如沸苛蒲。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)臂外。三九已至窟扑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漏健,已是汗流浹背嚎货。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔫浆,地道東北人殖属。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瓦盛,于是被迫代替她去往敵國(guó)和親洗显。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

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

  • 以西瓜書為主線谭溉,以其他書籍作為參考進(jìn)行補(bǔ)充墙懂,例如《統(tǒng)計(jì)學(xué)習(xí)方法》,《PRML》等 第一章 緒論 1.2 基本術(shù)語(yǔ) ...
    danielAck閱讀 4,534評(píng)論 0 6
  • 首頁(yè) 資訊 文章 資源 小組 相親 登錄 注冊(cè) 首頁(yè) 最新文章 IT 職場(chǎng) 前端 后端 移動(dòng)端 數(shù)據(jù)庫(kù) 運(yùn)維 其他...
    Helen_Cat閱讀 3,887評(píng)論 1 10
  • 看見(jiàn)這樣我是風(fēng)吹就倒的樣子太柔弱扮念! ...
    天涯明月百華閱讀 445評(píng)論 2 8
  • 愛(ài)潤(rùn)妍商城零元加盟開(kāi)店损搬,29.8元直郵給了你產(chǎn)品[憨笑]】。你便有了自己可以營(yíng)業(yè)的店零投入柜与!產(chǎn)品質(zhì)量絕對(duì)棒巧勤,愛(ài)潤(rùn)妍...
    大Love愛(ài)潤(rùn)研閱讀 150評(píng)論 0 0