【scikit-learn】sklearn.neighbors.KNeighborsClassifier 类:K 近邻分类器

sklearn.neighbors.KNeighborsClassifier(K 近邻分类器)

KNeighborsClassifiersklearn.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_neighborsweights 控制模型复杂度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值