K-近鄰算法胁赢,(kNN务唐,k-NearestNeighbor)分類算法是數(shù)據(jù)挖掘分類技術(shù)中最簡單的方法之一。
所謂K最近鄰又兵,就是k個最近的鄰居的意思任柜,說的是每個樣本都可以用它最接近的k個鄰居來代表。
scikit-learn內(nèi)置了一些數(shù)據(jù)集沛厨,其中有個比較經(jīng)典的鳶尾花數(shù)據(jù)集(iris)宙地,我們可以用它來體驗一下KNN分類。
這個數(shù)據(jù)集有150條鳶尾花數(shù)據(jù)逆皮,鳶尾花一共有三種分類宅粥,我們的任務(wù)是根據(jù)鳶尾花數(shù)據(jù)的特征,判別出它是哪種類型的鳶尾花电谣。
加載iris數(shù)據(jù)集
from sklearn.datasets import load_iris
iris = load_iris()
print(iris.data[:5])
輸出前5條數(shù)據(jù):
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]]
預(yù)處理:標準化
KNN會對所有特征計算做加和秽梅,而不同特征的值空間差異可能很大抹蚀,如果直接相加,其結(jié)果將會被大值特征主導(dǎo)企垦,而小值特征卻影響甚小况鸣,無法體現(xiàn)特征的平等。因此KNN一般都需要進行標準化竹观。
from sklearn.preprocessing import StandardScaler
# 對數(shù)據(jù)集進行標準化
std = StandardScaler()
data = std.fit_transform(iris.data)
separator.line("標準化后的數(shù)據(jù)")
print(data[:5])
輸出標準化后的數(shù)據(jù):
[[-0.90068117 1.03205722 -1.3412724 -1.31297673]
[-1.14301691 -0.1249576 -1.3412724 -1.31297673]
[-1.38535265 0.33784833 -1.39813811 -1.31297673]
[-1.50652052 0.10644536 -1.2844067 -1.31297673]
[-1.02184904 1.26346019 -1.3412724 -1.31297673]]
劃分訓(xùn)練集與數(shù)據(jù)集
KNN其實是不需要訓(xùn)練的,但是為了統(tǒng)一術(shù)語潜索,依然這么稱呼劃分的兩個集臭增。
把data和target拆成兩個集,75%作為訓(xùn)練集竹习,25%作為測試集:
from sklearn.model_selection import train_test_split
data_train, data_test, target_train, target_test \
= train_test_split(data, iris.target, test_size=0.25)
KNN分類
scikit-learn實現(xiàn)了KNN算法誊抛,默認K值為5,我們這里就使用默認值整陌,意即取最鄰近的5個樣本的target作為分類結(jié)果拗窃。
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(data_train, target_train)
評估準確率
KNN分類器也提供了準確率評估API,輸入測試集數(shù)據(jù)與測試集目標泌辫,可以評估當前訓(xùn)練后(調(diào)用fit方法后)的knn:
score = knn.score(data_test, target_test)
print(score)
輸出準確率随夸。其結(jié)果每次運行都可能不一樣,因為劃分訓(xùn)練集與測試集每次都不一樣:
0.9473684210526315
預(yù)測
調(diào)用predict方法震放,輸出測試集數(shù)據(jù)宾毒,得出預(yù)測結(jié)果:
target_predict = knn.predict(data_test)
print(target_test)
print(target_predict)
輸出:
****************************** 真實值 ******************************
[2 2 2 0 2 1 0 2 0 1 0 0 1 1 0 2 1 2 2 0 2 2 2 2 1 1 1 2 0 0 2 1 0 1 2 0 1 1]
****************************** 預(yù)測值 ******************************
[2 2 2 0 2 1 0 1 0 1 0 0 1 1 0 2 1 2 2 0 2 2 2 2 1 1 1 2 0 0 2 1 0 1 2 0 1 2]
這里,預(yù)測值與真實值大致相同殿遂。
源碼
Github: KNN