在运行randomForest
模型之前,我加载我的数据并将变量分类为分类和数字,以便模型可以处理它。
首次从.csv
文件加载的数据如下所示:
> str(DataFrame)
'data.frame': 1060 obs. of 6 variables:
$ VarX : int 1 1 1 1 0 0 0 0 1 0 ...
$ Var1 : num 127 135 137 138 138 ...
$ Var2 : Factor w/ 200 levels "#N/A","1690",..: 190 190 190 191 191 191 189 185 183 181 ...
$ Var3 : Factor w/ 138 levels "#N/A","100","101",..: 44 43 43 43 43 43 43 43 43 42 ...
$ Var4 : int 15 15 15 15 15 16 16 16 16 16 ...
$ Var5 : Factor w/ 189 levels "#N/A","10029",..: 87 87 87 87 87 85 85 85 85 85 ...
> head(DataFrame, 3)
VarX Var1 Var2 Var3 Var4 Var5
1 1 126.58 3660 152 15 7159.5
2 1 135.17 3660 150 15 7159.5
3 1 137.25 3660 150 15 7159.5
然后我尝试按以下方式对变量进行排序:
##Sort numerical and categorical values
options(digits = 5)
cols <- c("VarX")
for (i in cols) {
DataFrame[,i] = as.factor(DataFrame[,i])
}
cols2 <- c("Var1", "Var2", "Var3", "Var4", "Var5")
for (i in cols2) {
DataFrame[,i] = as.numeric(DataFrame[,i])
}
然而,这对数据做了一些奇怪和不受欢迎的事情:
> str(DataFrame)
'data.frame': 1060 obs. of 6 variables:
$ VarX : Factor w/ 2 levels "0","1": 2 2 2 2 1 1 1 1 2 1 ...
$ Var1 : num 127 135 137 138 138 ...
$ Var2 : num 190 190 190 191 191 191 189 185 183 181 ...
$ Var3 : num 44 43 43 43 43 43 43 43 43 42 ...
$ Var4 : num 15 15 15 15 15 16 16 16 16 16 ...
$ Var5 : num 87 87 87 87 87 85 85 85 85 85 ...
> head(DataFrame,3)
VarX Var1 Var2 Var3 Var4 Var5
1 1 126.58 190 44 15 87
2 1 135.17 190 43 15 87
3 1 137.25 190 43 15 87
此外,虽然在上面的摘录中没有显示,但它会将所有NA
值转换为1
,这取决于数据,可能会扭曲结果。
问:处理数据的正确方法是什么,以便不会损坏数据,同时确保randomForest
包可以使用它?
您应该已经as.numeric(as.character(variable_name))
将因子列转换为数字列,否则信息将丢失。
如果你看到 ?factor 的文档,它在警告部分说:
因子的解释取决于代码和“级别”属性。注意仅比较具有相同水平集(以相同顺序)的因子。特别是,将 as.numeric 应用于因子是没有意义的,并且可能通过隐式强制发生。要将因子 f 转换为近似其原始数值,建议使用 as.numeric(levels(f))[f] 并且比 as.numeric(as.character(f)) 稍微更有效。
除了 for 循环,您还可以使用 sapply 的强大功能将这些列转换为数字,如下所示:
dfnew <- sapply(df[,colms_to_be_converted],function(x)as.numeric(as.character(x)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句