【scikit-learn】sklearn.neighbors.KNeighborsRegressor 类:K 近邻回归器

sklearn.neighbors.KNeighborsRegressor(K 近邻回归器)

KNeighborsRegressorsklearn.neighbors 提供的 K 近邻(KNN)回归模型,它基于 K 个最近邻的目标值的平均值或加权平均值 进行回归,适用于 非线性数据的回归任务,尤其是小规模数据集


1. KNeighborsRegressor 作用

  • 用于回归任务(如 房价预测、天气预测)。
  • 基于邻居的目标值进行回归,不进行显式的参数估计。
  • 适用于小数据集,高维数据计算成本较高

2. KNeighborsRegressor 代码示例

(1) 训练 KNN 回归器

from sklearn.neighbors import KNeighborsRegressor
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

# 生成回归数据
X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练 KNN 回归模型
model = KNeighborsRegressor(n_neighbors=5, weights="uniform", metric="minkowski", p=2)
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 计算 R²
r2 = model.score(X_test, y_test)
print("KNN 回归器 R²:", r2)

解释

  • n_neighbors=5:使用 5 个最近邻进行回归。
  • weights="uniform":所有邻居的权重相同(简单平均)。
  • metric="minkowski", p=2:使用 欧几里得距离p=2)。

3. KNeighborsRegressor 主要参数

KNeighborsRegressor(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

neighbors = [1, 3, 5, 7, 9]
for k in neighbors:
    model = KNeighborsRegressor(n_neighbors=k)
    model.fit(X_train, y_train)
    print(f"K={k}, 测试集 R²={model.score(X_test, y_test)}")

解释

  • 较小的 n_neighbors(如 1)容易过拟合
  • 较大的 n_neighbors(如 9)决策边界更平滑,可能欠拟合

5. 计算回归性能

from sklearn.metrics import mean_squared_error, r2_score

mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("均方误差 MSE:", mse)
print("决定系数 R²:", r2)

解释

  • MSE(均方误差):值越小,拟合效果越好。
  • R²(决定系数)1 表示完美拟合,0 表示无解释能力。

6. weights="distance" 对回归效果的影响

model_distance = KNeighborsRegressor(n_neighbors=5, weights="distance")
model_distance.fit(X_train, y_train)

r2_distance = model_distance.score(X_test, y_test)
print("KNN(距离加权)回归器 R²:", r2_distance)

解释

  • weights="distance":距离较近的邻居影响更大,适用于不均匀分布的数据。

7. 计算不同距离度量

dist_metrics = ["euclidean", "manhattan", "chebyshev"]
for metric in dist_metrics:
    model = KNeighborsRegressor(n_neighbors=5, metric=metric)
    model.fit(X_train, y_train)
    print(f"metric={metric}, 测试集 R²={model.score(X_test, y_test)}")

解释

  • euclidean(欧几里得距离):标准度量(p=2)。
  • manhattan(曼哈顿距离):适用于格子状数据(p=1)。
  • chebyshev(切比雪夫距离):适用于最大坐标差影响较大的数据。

8. KNeighborsRegressor vs. LinearRegression vs. RandomForestRegressor

模型适用情况主要区别
KNeighborsRegressor小数据集,非线性回归计算成本高,无显式参数学习
LinearRegression线性回归问题适用于线性关系,计算更快
RandomForestRegressor非线性回归,大数据集训练时间较长,但泛化能力强

示例

from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor

lin_reg = LinearRegression()
rf_reg = RandomForestRegressor(n_estimators=100, random_state=42)

lin_reg.fit(X_train, y_train)
rf_reg.fit(X_train, y_train)

print("KNN 回归器 R²:", model.score(X_test, y_test))
print("线性回归器 R²:", lin_reg.score(X_test, y_test))
print("随机森林回归器 R²:", rf_reg.score(X_test, y_test))

解释

  • KNN 适用于小规模非线性数据,计算开销较大。
  • 线性回归适用于线性数据
  • 随机森林适用于复杂非线性数据

9. 适用场景

  • 回归任务(如 房价预测、天气预测)。
  • 小规模数据集(因为计算量较大)
  • 数据分布较规则,KNN 在低维空间表现较好

10. 结论

  • KNeighborsRegressor 适用于回归任务,基于邻居目标值的平均值进行预测,适用于小规模数据,计算成本较高,可以 调整 n_neighborsweights 控制模型复杂度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

彬彬侠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值