資料分析實戰 KNN手寫數字識別

2021-10-08 16:50:00 字數 4049 閱讀 5691

1.演算法背景

2.sklearn介面api

3.手寫數字識別實戰

演算法背景

knn(k-nearest neighbor):演算法核心為:「近朱者赤,近墨者黑」。

工作原理:

1.計算待分類樣本與訓練樣本的距離

2.對距離公升序排序,選取距離待分類樣本最近的k個鄰居

3.(分類)統計k個鄰居所屬的類別,並將待分類樣本歸類到最多的類別組中

(回歸)計算k個鄰居的屬性加權平均值,並將結果賦給待估計樣本電

演算法運用關鍵:

1.k值的選取

k值過小,待分類樣本嚴重依賴於最近的訓練樣本,若訓練樣本中有雜訊,則易過擬合;k值過大,考慮的「最近」樣本數過多,可能無法準確分類,導致欠擬合。因此,k的選擇可以通過設定不同的k值,看對應情況下模型效能評估的效果,擇優選取k。由於一般測試樣本無法得知其真實的類別數,可以利用交叉驗證的方法,將訓練集進一步劃分為訓練資料和驗證資料,在訓練資料上訓練模型並在驗證集上進行驗證和模型調優。使用交叉驗證的另乙個好處是可以充分利用已知資料,例如使用5折交叉驗證,就可以把訓練資料劃分為5塊,隨機選擇用其中一塊做驗證集,其餘四塊做訓練集(最後可以得到5個驗證集上的得分再取平均)。

2.距離的計算

用距離來衡量樣本與樣本之間的相似度或差異,距離越大,兩個樣本的相似度越低。關於距離的計算方式,最常用的是歐氏距離(例如兩點間的距離公式)、其他的還有曼哈頓距離(絕對值距離)、切比雪夫距離、余弦相似度等(舉例的前三者都是閔可夫斯基距離一種的特例)。余弦相似度常用在文字分析或推薦上,計算的是兩個向量的夾角,即方向上的偏差

3.凡涉及到距離的計算,都要注意對資料標準化,歸一化等操作,使資料量綱統一。

演算法可能存在的問題:

1.knn需要計算測試點和樣本點之間的距離,當資料量大的時候,計算量是非常龐大的,需要大量的儲存空間和計算時間。

2.如果訓練集中樣本分類不均衡,比如銀行貸款交易欺詐資料集,那麼出現次數非常少的類別的分類準確率會比較低。

思考的一些解決方案

1.knn中使用kd樹減少計算距離的次數,提公升搜尋效率。kd樹是對資料點在k維空間中劃分的一種資料結構,是一種二叉樹。

2.樣本不均衡:過取樣、下取樣、在演算法中設定不同類別樣本的權重值,使該類在計算分類錯誤率時有更大的「話語權」

sklearn中提供的api:

from sklearn.neighbors import kneighborsclassifier

from sklearn.neighbors import kneighborsregressor

#構建knn分類模型

kneighborsclassifier(n_neighbors=

5,weights=

'uniform'

,algorithm=

'auto'

,leaf_size=30)

#引數解釋:

#n_neighbors:k值,預設為5

#weights:鄰居的權重計算,可選: uniform,distance,自定義函式

#algorithm:計算和尋找鄰居的方法,可選:auto,kd_tree,ball_tree,brute

#leaf_size:構造kd樹或球樹時的葉子樹,預設是30

手寫數字識別實戰1.匯入工具包

from sklearn import datasets

import matplotlib.pyplot as plt

from sklearn.model_selection import train_test_split

from sklearn.neighbors import kneighborsclassifier

from sklearn.preprocessing import standardscaler

from sklearn.model_selection import gridsearchcv

from sklearn import metrics

2.載入資料

data = datasets.load_digits(

)data.keys(

)#檢視該資料集有哪些字段(鍵值)

3.資料視覺化

4.資料劃分和預處理

xdata = data[

"data"

]ydata = data[

"target"

]xdata = standardscaler(

).fit_transform(xdata)

x_train,x_test,y_train,y_test = train_test_split(xdata,ydata,test_size=

0.33

)

5.模型訓練和評估

knn_model = kneighborsclassifier(

)parameters =

best_model = gridsearchcv(knn_model,param_grid=parameters,cv=5)

.fit(x_train,y_train)

print

("最優引數配置:"

,best_model.best_params_)

print

("knn測試集上的效能評估為:"

,metrics.accuracy_score(best_model.predict(x_test)

,y_test)

)

結果:

最優引數配置:

knn測試集上的效能評估為: 0.9781144781144782

補充測試一下svm的效果

#測試一下svm的效果

from sklearn.svm import svc

svc_model = svc(

)parameters_svc =

svc_best_model = gridsearchcv(svc_model,param_grid=parameters_svc,cv=5)

.fit(x_train,y_train)

print

("最優引數配置:"

,svc_best_model.best_params_)

print

("svc測試集上的效能評估為:"

,metrics.accuracy_score(svc_best_model.predict(x_test)

,y_test)

)

結果展示:

最優引數配置:

svc測試集上的效能評估為: 0.9797979797979798

小結:本實驗完成了《資料分析實戰45講》knn部分的理論與實戰部分,knn實質上並沒有所謂的訓練過程(擬合引數),當待測樣本資料輸入時就直接計算該樣本到各個訓練樣本的距離然後對距離排序,選擇前k個距離範圍內的所有樣本(小心,不一定只有k個鄰居)然後統計近鄰的類別(做分類)或者計算目標值的加權平均數(做回歸)。knn演算法十分簡潔,主要就是距離公式的選擇和設計,以及k的選擇,一些可能的演算法問題與處理思路也在演算法背景中有所介紹。

資料分析之KNN數字識別手寫

import numpy as np bmp 字尾 import matplotlib.pyplot as plt matplotlib inline from sklearn.neighbors import kneighborsclassifier 提煉樣本資料 img arr plt.imre...

手寫數字識別 實戰 KNN演算法識別手寫數字

鄰近演算法,或者說k最近鄰 knn,k nearestneighbor 分類演算法是資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。下面是我學習knn演算法的思維導圖 其中距離的定義,各個距離的公式為 歐氏距離 n維空間的距...

KNN手寫數字識別

以歐幾里得距離度量樣本間的相似程度。對於乙個測試樣本首先計算該樣本與每個訓練樣本間的距離,然後按距離值對訓練樣本進行公升序排序,排序後前k個樣本進行投票,即哪個標籤出現的次數多,就將測試樣例劃為該類。程式使用資料 預先將資料處理為,標籤資訊轉化為txt文件。from numpy import imp...