【问题标题】:Error: At least one of the class levels is not a valid R variable name错误:至少一个类级别不是有效的 R 变量名
【发布时间】:2019-02-20 03:03:07
【问题描述】:

我正在尝试使用 R 中的 caret 包在数据集上实现随机森林。查看此站点上的先前示例,我更改了列名和因子级别。似乎没有任何工作。一遍又一遍地遇到同样的错误。这是我的代码、数据集的结构和错误:

model_rf = train(Promoted ~ Department + Region+ Education+Gender+ RecruitmentChannel+TrainingNumber+Age+LengthOfService +EmployeePerformance+AvgTrainingPerformance, data=train, method='rf', tuneLength=5, trControl = fitControl)
model_rf
predicteds_rf <- predict(model_rf, newdata=test)

错误:至少有一个类级别无效 R 变量名;当类概率为 生成,因为变量名称将被转换为 不。升职,升职。请使用可用作的因子水平 有效的 R 变量名称(请参阅 ?make.names 以获得帮助)。

> str(trainData)
'data.frame':   54808 obs. of  12 variables:
 $ EmployeeID            : int  65438 65141 7513 2542 48945 58896 20379 16290 73202 28911 ...
 $ Department            : Factor w/ 9 levels "Analytics","Finance",..: 8 5 8 8 9 1 5 5 1 8 ...
 $ Region                : Factor w/ 34 levels "region_1","region_10",..: 32 15 11 16 19 12 13 28 13 1 ...
 $ Education             : Factor w/ 4 levels "","Bachelor's",..: 4 2 2 2 2 2 2 4 2 4 ...
 $ Gender                : Factor w/ 2 levels "f","m": 1 2 2 2 2 2 1 2 2 2 ...
 $ RecruitmentChannel    : Factor w/ 3 levels "other","referred",..: 3 1 3 1 1 3 1 3 1 3 ...
 $ TrainingNumber        : Factor w/ 5 levels "Average training",..: 5 5 5 3 5 3 5 5 5 5 ...
 $ Age                   : Factor w/ 3 levels "Middle Age","Old",..: 1 3 1 1 1 1 1 1 3 1 ...
 $ LengthOfService       : Factor w/ 6 levels "Junior","Mid Level",..: 6 2 6 6 1 6 2 2 2 2 ...
 $ EmployeePerformance   : Factor w/ 7 levels "Average Performer",..: 4 3 5 7 5 5 5 5 3 4 ...
 $ AvgTrainingPerformance: Factor w/ 6 levels "Average","Below Average",..: 5 1 2 2 4 6 2 1 6 2 ...
 $ Promoted              : Factor w/ 2 levels "Not Promoted",..: 1 1 1 1 1 1 1 1 1 1 ...

如果有人能给我一些建议,那将是一个很大的帮助。非常感谢。

【问题讨论】:

  • 某些关卡的名称包含空格(如“中世纪”)。这会导致错误。
  • 层级不应该有空格是吗?
  • 没有。如果您检查函数 make.names,例如名称“a 和 b”是无效的,该函数将其更正为“a.and.b”
  • 你能用dput(head(YourdataSet,5))添加一小部分数据吗
  • 您可以在问题中添加fitControl 吗?我怀疑您的某些因素的基数较低(唯一值)。

标签: r machine-learning random-forest r-caret


【解决方案1】:

因子水平的有效名称应该不

  1. 包含空格
  2. 以数字开头
  3. 为空字符串

如您所见,您的数据框包含所有三个。

存在这些要求是因为每当 caret::train() 运行基于树的模型(此处为随机森林)时,它会将因子级别转换为用于拆分树的变量。因此因子级别标签成为变量名称。

因此,对于每个变量,您可以使用以下代码将级别名称转换为有效标签。

trainData %>% 
  mutate(Education = factor(Education, 
          labels = make.names(levels(Education))))

您可以使用levels = 代替labels = - 后者更改数据,而前者更改显示(例如,通过 print(dataframe))。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多