一段时间以来,我一直在使用 R 和该caret软件包。该caret包提供了一种减少变量数量的功能 -nearZeroVar()其中返回方差接近于零的变量,并且可以将它们从dataframe
Caret还提供了另一个dummyVars将因子转换为虚拟变量的函数。
现在我的问题是 - 使用两者的顺序应该是什么?应该将方差接近于零的特征丢弃然后转换为虚拟变量,还是应该反过来?我觉得顺序很重要,因为在某些情况下,虚拟变量可能有很多零,但仍然很重要。
一段时间以来,我一直在使用 R 和该caret软件包。该caret包提供了一种减少变量数量的功能 -nearZeroVar()其中返回方差接近于零的变量,并且可以将它们从dataframe
Caret还提供了另一个dummyVars将因子转换为虚拟变量的函数。
现在我的问题是 - 使用两者的顺序应该是什么?应该将方差接近于零的特征丢弃然后转换为虚拟变量,还是应该反过来?我觉得顺序很重要,因为在某些情况下,虚拟变量可能有很多零,但仍然很重要。
我认为首先您需要删除方差接近于零的列(假设它们不是名义变量),前提是您有更多变量,因为可以减少计算时间。
让我们考虑一个场景,其中有 2 列 col1、col2 并且您检查了方差,然后 col1 有 0.003 方差,而 col2 有 0.5 var。应用该函数nearZeroVar()后,它会删除 col1,您只需对 1 个变量进行热编码。
这样您可以节省时间,并且您的计算机性能不会受到影响。
我会绘制您的数据,看看您尝试预测的标签比例在您的相关功能的标签之间是相似还是不同。如果类似,您可能可以使用该nearZeroVar()函数安全地删除该列。如果不同 - 那么该特征是可预测的!保留它,并将列转换为虚拟变量。
例如,假设我试图使用钻石的颜色(分类变量)来确定它是否昂贵(我在下面发明的分类变量......)
require(dplyr)
require(ggplot2)
data('diamonds')
diamonds %>%
mutate(expensive = price > 5000) %>%
group_by(color,expensive) %>%
summarise(n = n()) %>%
mutate(freq = n/sum(n)) %>%
filter(expensive) %>%
ggplot() +
geom_bar(aes(color,freq),stat='identity') +
labs(x='color',y='proportion expensive')
你得到这样的情节 -
如果您的特征标签之间的目标标签比例存在很大差异(即使一个非常罕见),我会将其保留为预测变量。相反,如果比例非常相似 - 你不妨放弃它。
你的感觉是对的,在某些情况下顺序可能很重要。
在 dummyVars 之后应用 nzv 意味着您将非常稀有的名义预测变量水平集中在一起。正如汤姆建议的那样,您必须根据特定数据集的属性做出此决定。
一些例子:
您有一个分类任务并且想要识别欺诈性卖家(非常不平衡的数据集!)。如果您在 dummyVars 之后将 nzv 应用于预测变量“接受的付款类型”,您会将“仅接受西联汇款”级别(这可能是此类卖家不值得信赖的一个很好的指标)与其他一些罕见级别混为一谈。这将显着降低分类器的性能。
在回归任务的情况下,尤其是当您的目标函数平滑且良好时,如果您将非常罕见的级别集中在一起,通常就不那么重要了。
您可能还想尝试不同的 nzv 参数,例如截止频率。