【scikit-learn基础】--『监督学习』之 K-近邻分类
KNN(K-近鄰),全稱K-Nearest Neighbors,是一種常用的分類算法。KNN算法的歷史可以追溯到1957年,當時Cover和Hart提出了“最近鄰分類”的概念。
但是,這個算法真正得到廣泛認知和應用是在1992年,由Altman發表的一篇名為“K-Nearest Neighbors”的文章。
近年來,隨著大數據和機器學習的快速發展,KNN算法因其簡單且表現優秀,被廣泛應用于各種數據分類問題中。
1. 算法概述
KNN算法的基本原理是:在特征空間中,如果一個樣本的最接近的k個鄰居中大多數屬于某一個類別,則該樣本也屬于這個類別。
換句話說,KNN算法假設類別是由其鄰居決定的。
那么,KNN算法判斷數據是否相似是關鍵,也就是數據之間的距離是如何計算的呢?
最常用的距離計算公式有:
- 曼哈頓距離:\(L_1(x_i,x_j)= \sum_{l=1}^{n} |x_i^{(l)}-x_j^{(l)}|\)
- 歐氏距離:\(L_2(x_i,x_j) = (\sum_{l=1}^{n} \; |x_i^{(l)}-x_j^{(l)}|^{2})^{\frac{1}{2}}\)
- 閔可夫斯基距離:\(L_p(x_i,x_j) = (\sum_{l=1}^{n} \; |x_i^{(l)}-x_j^{(l)}|^{2})^{\frac{1}{p}}\)
- 等等
使用不同的距離,就會得到不同的分類效果。
2. 創建樣本數據
這次用scikit-learn中的樣本生成器make_classification來生成分類用的樣本數據。
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
# 分類數據的樣本生成器
X, y = make_classification(n_samples=1000, n_classes=4, n_clusters_per_class=1)
plt.scatter(X[:, 0], X[:, 1], marker="o", c=y, s=25)
plt.show()
關于樣本生成器的詳細內容,請參考:TODO
3. 模型訓練
首先,分割訓練集和測試集。
from sklearn.model_selection import train_test_split
# 分割訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
這次按照8:2的比例來劃分訓練集和測試集。
然后用scikit-learn中的KNeighborsClassifier模型來訓練:
from sklearn.neighbors import KNeighborsClassifier
# 定義KNN模型(設置4個分類,因為樣本數據是4個分類)
reg = KNeighborsClassifier(n_neighbors=4)
# 訓練模型
reg.fit(X_train, y_train)
# 在測試集上進行預測
y_pred = reg.predict(X_test)
KNeighborsClassifier的主要參數包括:
-
n_neighbors:這是
kNN算法中的k值,即選擇最近的k個點。默認值為5。 -
weights:此參數默認為'
uniform',也可以設置為'distance',或者用戶自定義的函數。其中,'uniform'表示所有的鄰近點的權重都是相等的,'distance'表示距離近的點比距離遠的點的影響大。 -
algorithm:此參數默認為'
auto',也可以設置為'auto','ball_tree','kd_tree',或'brute'。這決定了在計算最近鄰時使用的算法。 - leaf_size:此參數默認為30,也可以設置為一個整數,用于指定傳遞給構建葉子節點時使用的最小樣本數。
-
p:此參數默認為2,也可以設置為一個值<=1。這決定了在計算
Minkowski距離度量時使用的p值。 -
metric:此參數默認為'
minkowski',也可以設置為'euclidean','manhattan'等。這決定了距離度量方法。 - metric_params:此參數默認為None,也可以是一個字典,包含了額外的關鍵字參數傳遞給距離度量函數。
- n_jobs:此參數默認為None,也可以是一個大于等于1的整數,表示可用于執行并行計算的CPU數量。
最后驗證模型的訓練效果:
# 比較測試集中有多少個分類預測正確
correct_pred = np.sum(y_pred == y_test)
print("預測正確率:{}%".format(correct_pred/len(y_pred)*100))
# 運行結果
預測正確率:68.5%
模型使用了默認的參數,可以看出,模型正確率不高。
感興趣的同學可以試試調整KNeighborsClassifier的參數,看看是否可以提高模型的預測正確率。
4. 總結
KNN算法被廣泛應用于各種不同的應用場景,如圖像識別、文本分類、垃圾郵件識別、客戶流失預測等。
這些場景的一個共同特點是,需要對一個未知的樣本進行快速的分類或預測。
KNN算法主要優勢在于:
-
簡單直觀:
KNN算法的概念簡單直觀,容易理解和實現。 -
適用于小樣本數據:
KNN算法在小樣本數據上的表現往往優于其他機器學習算法。 -
對數據預處理要求較低:
KNN算法不需要對數據進行復雜的預處理,例如標準化、歸一化等。
不過,KNN算法也有不足之處:
-
計算量大:對于大型數據集,
KNN算法可能需要大量的存儲空間和計算時間,因為需要計算每個樣本與所有已知樣本的距離。 - 選擇合適的K值困難:K值的選擇對結果影響很大,選擇不當可能會導致結果的不穩定。
-
對噪聲數據敏感:如果數據集中存在噪聲數據,
KNN算法可能會受到較大影響。
總結
以上是生活随笔為你收集整理的【scikit-learn基础】--『监督学习』之 K-近邻分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dotnet-dump工具使用
- 下一篇: 编写.NET的Dockerfile文件构