sklearn.neighbors.KNeighborsRegressor
(K 近邻回归器)
KNeighborsRegressor
是 sklearn.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_neighbors
和weights
控制模型复杂度。