【问题标题】:How to calculate KNN Variable Importance in R如何计算 R 中的 KNN 变量重要性
【发布时间】:2015-07-04 03:15:33
【问题描述】:

我实施了一个作者归属项目,在该项目中,我能够使用两位作者使用 KNN 的文章来训练我的 KNN 模型。然后,我将一篇新文章的作者分类为作者 A 或作者 B。 我使用 knn() 函数来生成模型。 模型的输出如下表。

   Word1 Word2 Word3  Author
11    1     48    8      A
2     2     0     0      B
29    1     45    9      A
1     2     0     0      B
4     0     0     0      B
28    3     1     1      B

从模型中可以看出,Word2 和 Word3 是导致作者 A 和作者 B 分类的最显着变量。

我的问题是如何使用 R 来识别它。

【问题讨论】:

  • 为什么是 kNN,而不是例如决策树?如果您想了解变量的重要性,决策树(和随机森林)会更容易使用。

标签: r machine-learning statistics classification


【解决方案1】:

基本上,您的问题归结为有一些变量(示例中的 Word1、Word2 和 Word3)和二元结果(示例中的作者),并想知道不同变量在确定结果中的重要性。一种自然的方法是训练回归模型以使用变量预测结果并检查该模型中变量的重要性。我将在这里介绍两种方法(逻辑回归和随机森林),但也可以使用许多其他方法。

我们从一个稍微大一点的例子开始,其中的结果只取决于Word2和Word3,Word2的效果比Word3大很多:

set.seed(144)
dat <- data.frame(Word1=rnorm(10000), Word2=rnorm(10000), Word3=rnorm(10000))
dat$Author <- ifelse(runif(10000) < 1/(1+exp(-10*dat$Word2+dat$Word3)), "A", "B")

我们可以使用逻辑回归模型预测作者的总结来确定最重要的变量:

summary(glm(I(Author=="A")~., data=dat, family="binomial"))
# [snip]
# Coefficients:
#             Estimate Std. Error z value Pr(>|z|)    
# (Intercept)  0.05117    0.04935   1.037    0.300    
# Word1       -0.02123    0.04926  -0.431    0.666    
# Word2        9.52679    0.26895  35.422   <2e-16 ***
# Word3       -0.97022    0.05629 -17.236   <2e-16 ***

从 p 值可以看出,Word2 有很大的正面影响,而 Word3 有很大的负面影响。从系数中我们可以看出 Word2 对结果的影响程度更高(因为通过构造我们知道所有变量都在同一尺度上)。

我们可以使用随机森林中的变量重要性类似地预测作者结果:

library(randomForest)
rf <- randomForest(as.factor(Author)~., data=dat)
rf$importance
#       MeanDecreaseGini
# Word1         294.9039
# Word2        4353.2107
# Word3         351.3268

我们可以将 Word2 确定为迄今为止最重要的变量。这告诉我们一些有趣的事情——鉴于我们知道 Word2,Word3 在预测结果方面实际上并没有比 Word1 有用太多(而 Word1 不应该太有用,因为它不用于计算结果) .

【讨论】:

  • 请注意,randomForest 几乎与 knn 分类无关。
  • @Anony-Mousse 据我了解,标签A和B来自knn,作者现在想更好地理解自变量和标签之间的关系。因此没有必要进一步使用 knn 来评估变量的重要性。
  • @Anony-Mousse 感谢您的解释。您能否进一步详细说明 p 值?你说Word2有很大的正面影响,Word3有很大的负面影响。你是怎么从 Pr(>|z|) 看到的?
  • @alandalusi 一个小的 p 值表明系数与 0 不同的概率很高。是的,Pr(>|z|) 是 p 值。
  • 从z值的符号可以看出正反作用
猜你喜欢
  • 2021-01-07
  • 2018-05-14
  • 2017-10-20
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
相关资源
最近更新 更多