sklearn.neighbors.KNeighborsClassifier
(K 近邻分类器)
KNeighborsClassifier
是 sklearn.neighbors
提供的 K 近邻(KNN)分类模型,它基于 计算新样本与训练数据中 K 个最近邻样本的类别 进行分类,适用于 小规模数据集,特别是 低维或中等维度数据。
1. KNeighborsClassifier
作用
- 用于分类任务(如 图像分类、文本分类、医疗诊断)。
- 基于邻居投票进行分类,无需训练过程。
- 适用于小数据集,计算成本较高(尤其是高维数据)。
2. KNeighborsClassifier
代码示例
(1) 训练 KNN 分类器
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)
# 训练 KNN 分类器
model = KNeighborsClassifier(n_neighbors=5, metric="minkowski", p=2, weights="uniform")
model.fit(X_train, y_train)
# 计算准确率
accuracy = model.score(X_test, y_test)
print("KNN 分类器准确率:", accuracy)
解释
n_neighbors=5
:使用 5 个最近邻进行投票。metric="minkowski", p=2
:使用 欧几里得距离(p=2
)。weights="uniform"
:所有邻居的权重相同。
3. KNeighborsClassifier
主要参数
KNeighborsClassifier(n_neighbors=5, weights="uniform", metric="minkowski", algorithm="auto")
参数 | 说明 |
---|---|
n_neighbors | 最近邻数量(默认 5 ,值大时决策边界更平滑) |
weights | 投票权重("uniform" = 均匀投票,"distance" = 距离加权) |
metric | 距离度量(默认 "minkowski" ,可选 "euclidean" 、"manhattan" ) |
algorithm | 最近邻搜索算法(默认 "auto" ,可选 "ball_tree" 、"kd_tree" ) |
4. 选择合适的 n_neighbors
import numpy as np
neighbors = [1, 3, 5, 7, 9]
for k in neighbors:
model = KNeighborsClassifier(n_neighbors=k)
model.fit(X_train, y_train)
print(f"K={k}, 测试集准确率={model.score(X_test, y_test)}")
解释
- 较小的
n_neighbors
(如1
)容易过拟合。 - 较大的
n_neighbors
(如9
)决策边界更平滑,可能欠拟合。
5. 计算分类性能
from sklearn.metrics import classification_report
y_pred = model.predict(X_test)
print("分类报告:\n", classification_report(y_test, y_pred))
解释
- 计算精确率、召回率和 F1 分数,评估模型表现。
6. weights="distance"
对分类效果的影响
model_distance = KNeighborsClassifier(n_neighbors=5, weights="distance")
model_distance.fit(X_train, y_train)
accuracy_distance = model_distance.score(X_test, y_test)
print("KNN(距离加权)分类器准确率:", accuracy_distance)
解释
weights="distance"
:较近的邻居影响更大,适用于不均匀分布的数据。
7. 计算不同距离度量
dist_metrics = ["euclidean", "manhattan", "chebyshev"]
for metric in dist_metrics:
model = KNeighborsClassifier(n_neighbors=5, metric=metric)
model.fit(X_train, y_train)
print(f"metric={metric}, 测试集准确率={model.score(X_test, y_test)}")
解释
euclidean
(欧几里得距离):标准度量(p=2
)。manhattan
(曼哈顿距离):适用于格子状数据(p=1
)。chebyshev
(切比雪夫距离):适用于最大坐标差影响较大的数据。
8. KNeighborsClassifier
vs. LogisticRegression
vs. RandomForestClassifier
模型 | 适用情况 | 主要区别 |
---|---|---|
KNeighborsClassifier | 小数据集,低维数据 | 无需训练,但计算成本高 |
LogisticRegression | 线性分类问题 | 适用于大规模数据,计算更快 |
RandomForestClassifier | 非线性分类,高维数据 | 训练时间较长,但泛化能力强 |
示例
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
log_reg = LogisticRegression()
rf = RandomForestClassifier(n_estimators=100, random_state=42)
log_reg.fit(X_train, y_train)
rf.fit(X_train, y_train)
print("KNN 分类器准确率:", model.score(X_test, y_test))
print("逻辑回归分类器准确率:", log_reg.score(X_test, y_test))
print("随机森林分类器准确率:", rf.score(X_test, y_test))
解释
- KNN 适用于小规模数据,计算开销较大。
- 逻辑回归适用于线性分类任务。
- 随机森林适用于复杂非线性数据。
9. 适用场景
- 分类任务(如 手写数字识别、医疗诊断)。
- 小规模数据集(因为计算量较大)。
- 数据分布较规则,KNN 在低维空间表现较好。
10. 结论
KNeighborsClassifier
适用于分类任务,基于邻居投票进行分类,适用于小规模数据,计算成本较高,可以 调整n_neighbors
和weights
控制模型复杂度。