如何在R中计算KNN变量重要性

4

我实现了一个作者归属项目,使用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,而不是决策树?如果您想了解变量重要性,决策树(和随机森林)要容易得多。 - Has QUIT--Anony-Mousse
1个回答

5
基本上,你的问题归结为有一些变量(例如你示例中的Word1、Word2和Word3)和一个二进制结果(例如你示例中的Author),想知道不同变量在确定该结果方面的重要性。一种自然的方法是训练回归模型来使用这些变量预测结果,并检查模型中变量的重要性。我将在这里包括两种方法(逻辑回归和随机森林),但也可以使用其他许多方法。
让我们从一个稍微大一点的示例开始,其中结果仅取决于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未被用于计算结果)。


5
请注意,随机森林分类算法与knn分类算法基本上无关。 - Has QUIT--Anony-Mousse
据我理解,标签A和B来自knn,现在作者希望更好地了解自变量和标签之间的关系。因此,没有必要再使用knn来评估变量重要性。 - josliber
谢谢您的解释,@Anony-Mousse。您能进一步阐述一下p值吗?您说Word2有很大的正向效应,而Word3有很大的负向效应。您是如何从Pr(> | z |)中看到这一点的? - alandalusi
1
@alandalusi 一个小的p值表示系数与0的差异很可能很大。是的,Pr(>|z|)就是p值。 - josliber
正负效应可以从z值的符号中看出。 - Epimetheus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接