ggscatter(
anxiety, x = “pretest”, y = “posttest”,
color = “group”, add = “reg.line”
)+
stat_regline_equation(
aes(label = paste(..eq.label.., ..rr.label.., sep = ”~~~~”), color = group)
)
- 需要调参
- 合适的距离矩阵 python中 metric 距离度量/ p距离的幂 dist_power(R中)
- 距离是否加权
● metric=(sklearn)
“minkowski”(默认)
● p=(sklearn)
Minkowski 距离的幂:p = 1 → Manhattan p = 2 → Euclidean
💡 当特征尺度差异大或含异常值时,Manhattan(p=1)往往更稳健。
● 权重:距离加权(weights / weight_func) ⭐⭐⭐
sklearn 的权重(简单)
“uniform”:所有邻居权重相同
“distance”:近的更重要
callable:自定义函数
tidymodels/kknn 的 weight_func=(更丰富)
“rectangular”(等权 = uniform)
填充
分类
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 1. 加载数据
iris = load_iris()
X = iris.data # 特征
y = iris.target # 标签
# 2. 划分训练/测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 3. 建立 KNN 分类器
knn = KNeighborsClassifier(n_neighbors=5)
# 4. 训练模型
knn.fit(X_train, y_train)
# 5. 预测
y_pred = knn.predict(X_test)
# 6. 评估
print("Accuracy:", accuracy_score(y_test, y_pred))
回归
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error
# 1. 加载数据
data = fetch_california_housing()
X = data.data
y = data.target
# 2. 划分训练/测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 3. 建立 KNN 回归模型
knn = KNeighborsRegressor(n_neighbors=5)
# 4. 训练
knn.fit(X_train, y_train)
# 5. 预测
y_pred = knn.predict(X_test)
# 6. 评估
mse = mean_squared_error(y_test, y_pred)
print("MSE:", mse)
R实现
library(tidymodels)
knn_spec <- nearest_neighbor(
mode = "classification",
neighbors = 5,
weight_func = "rectangular",
dist_power = 2
) %>%
set_engine("kknn")
knn_fit <-
knn_spec %>%
fit(Species ~ ., data = iris)
predict(knn_fit, iris)