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

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

   Word1 Word2 Word3  Author11    1     48    8      A2     2     0     0      B29    1     45    9      A1     2     0     0      B4     0     0     0      B28    3     1     1      B

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

我的问题是如何在R中识别这些变量的重要性。


回答:

基本上,你的问题可以归结为有几个变量(例如你的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不应该太有用,因为它没有用于计算结果)。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注