1. 程式人生 > >機器學習6-分類學習-K近鄰

機器學習6-分類學習-K近鄰

模型介紹

假設我們有一些攜帶分類標記的訓練樣本,分佈於特徵空間中。找到待分類的樣本在特徵空間中距離最近的K個已標記樣本作為參考,找到的K個已標記樣本屬於哪一類的比例高,那我們就認為待分類樣本就屬於這一類。

資料描述

利用K近鄰演算法對生物物種進行分類,並且使用最為著名的“鳶尾”(Iris)資料集。

程式碼

#讀取Iris資料集細節資料
#從sklearn.datasets匯入iris資料載入器。
from sklearn.datasets import load_iris
#使用載入器讀取資料並且存入變數iris
iris = load_iris()
#查驗資料規模。
print(iris.data.shape)
#檢視資料說明。對於一名機器學習的實踐者來講,這是一個好習慣
print(iris.DESCR) #可以觀察到Iris資料集共有150朵鳶尾資料樣本,並且均勻分佈在3個不同的亞種;每個樣本有4個屬性sepal length,sepal width, petal width, petal length #由於沒有指定的測試集,我們需要對資料進行隨機分割,25%的樣本用於測試,其餘75%的樣本用於模型的訓練。 #對Iris資料集進行分割 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0
.25, random_state=33) #使用K近鄰分類器對鳶尾花(Iris)資料進行類別預測 from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier #對訓練和測試的特徵資料進行標準化。 ss = StandardScaler() X_train = ss.fit_transform(X_train) X_test = ss.transform(X_test) #使用K近鄰分類器對測試資料進行類別預測,預測結果儲存在變數y_predict中。
knc = KNeighborsClassifier() knc.fit(X_train, y_train) y_predict = knc.predict(X_test) #使用模型自帶的評估函式進行準確性測評 print("The accuracy of K-Nearest Neighbor Classifier is", knc.score(X_test, y_test)) #使用sklearn.metrics 裡面的classification_report模組對預測結果做更加詳細的分析 from sklearn.metrics import classification_report print(classification_report(y_test, y_predict, target_names=iris.target_names))

特點分析

K近鄰(分類)是非常直觀的機器學習模型,該模型沒有引數訓練過程,也就是我們並沒有通過任何學習演算法分析訓練資料,而只是根據測試樣本在訓練資料的分佈直接做出分類決策。因此,K近鄰屬於無引數模型(Nonparametric model)中非常簡單一種。然而,正是這樣的決策演算法,導致了其非常高的計算複雜度和記憶體消耗。因為該模型每處理一個測試樣本,都需要對所有預先載入在記憶體的訓練樣本進行遍歷、逐一計算相似度、排列1並且選取K個最近鄰訓練樣本的標記,進而做出分類決策。這是平方級別的演算法複雜度,一旦資料規模稍大,使用者便需要權衡更多計算時間的代價。