如何计算 R 中的 KNN 变量重要性
How to calculate KNN Variable Importance in R
我实施了一个作者身份归属项目,在该项目中,我能够使用两位作者使用 KNN 的文章来训练我的 KNN 模型。然后,我将一篇新文章的作者分类为作者 A 或作者 B。
我使用 knn() 函数生成模型。
该模型的输出是下面的 table。
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 不应该太有用,因为它没有被用来计算结果) .
我实施了一个作者身份归属项目,在该项目中,我能够使用两位作者使用 KNN 的文章来训练我的 KNN 模型。然后,我将一篇新文章的作者分类为作者 A 或作者 B。 我使用 knn() 函数生成模型。 该模型的输出是下面的 table。
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 不应该太有用,因为它没有被用来计算结果) .