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

标签 r machine-learning statistics classification

我实现了一个作者归属项目,在该项目中,我能够使用 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 来识别这一点。

最佳答案

基本上,您的问题归结为拥有一些变量(示例中的 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 不应该太有用,因为它不用于计算结果) .

关于r - 如何在 R 中计算 KNN 变量重要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29865750/

相关文章:

machine-learning - 如何在Python中执行肘法?

unity-game-engine - 如何让强化学习代理学习无尽跑者?

android - 如何向 Google Play 请求下载统计信息

r - 循环数字序列

r 数据表 : aggregating the grouping column inconsistency

oop - 将 RInside 的 'R' 实例作为类/方法之间的参数传递

python - NLTK:conllstr2tree 无法正常工作(Python3)

perl - 如何在 Perl 中获取相关的 t 统计量和 p 值?

matlab - 两个向量之间的马氏距离

python - 使用 Python 和 Rpy2 进行统计测试(Kolmogorov 和 T 测试)