You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R语言的k-NN模型中为预测特征添加权重?

给k-NN模型的特征添加权重(针对皮马印第安人糖尿病数据集)

因为class包的knn()函数本身不支持直接设置特征权重,下面提供两种可行方案:

方案一:手动给特征加权(保留class包)

既然你的数据已经完成标准化,直接给目标特征乘以权重系数即可——权重越大,该特征在距离计算中的占比越高。比如假设你想让Glucose和BMI这两个特征对预测结果影响更大,分别设置权重2和1.5,其余特征权重设为1:

# 定义特征权重
feature_weights <- c(
  Pregnancies = 1,
  Glucose = 2,
  BMI = 1.5,
  BloodPressure = 1,
  SkinThickness = 1,
  Insulin = 1,
  DiabetesPedigreeFunction = 1,
  Age = 1
)

# 对训练集和测试集的特征应用权重
train_weighted <- train_knn_scaled %>%
  dplyr::select(-Outcome) %>%
  mutate(across(everything(), ~ .x * feature_weights[cur_column()]))

test_weighted <- test_knn_scaled %>%
  dplyr::select(-Outcome) %>%
  mutate(across(everything(), ~ .x * feature_weights[cur_column()]))

# 用加权后的特征运行k-NN
knn_predictions = test_knn_scaled %>% 
  mutate(Predict=knn(train=train_weighted,
                     test=test_weighted,
                     cl=factor(train_knn_scaled$Outcome,levels=c(0,1)),
                     k=which.max(accuracy_k)))

方案二:换用支持原生加权的kknn包

kknn包专门支持加权k-NN,能直接指定特征权重,不需要手动修改数据:

# 安装并加载包
install.packages("kknn")
library(kknn)
library(dplyr)

# 构建加权k-NN模型并生成预测
# weights参数传入特征权重向量,顺序对应数据集里的特征列
knn_model <- kknn(
  formula = Outcome ~ .,
  train = train_knn_scaled,
  test = test_knn_scaled %>% dplyr::select(-Outcome),
  k = which.max(accuracy_k),
  weights = c(1,2,1,1,1,1,1.5,1)  # 顺序:Pregnancies,Glucose,BloodPressure,SkinThickness,Insulin,DiabetesPedigreeFunction,BMI,Age
)

# 提取预测结果合并到测试集
knn_predictions <- test_knn_scaled %>%
  mutate(Predict = as.factor(fitted(knn_model)))

注意:权重的具体数值需要根据业务需求或特征重要性分析(比如通过随机森林、线性回归系数等)调整,建议多尝试不同组合,对比模型准确率找到最优值。

内容的提问来源于stack exchange,提问作者Antonio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:55:27