处理分类中罕见因素水平的一般策略?
General strategy for dealing with rare factor levels in classification?
假设我有这样的数据集:
breakfast lunch dinner mood
----------- ---------- --------- ------
waffles sandwich chili good
sausages sandwich pasta good
yogurt salad stew bad
gruel salad pizza bad
gruel pizza pizza good
sausages pizza pasta good
waffles salad chili good
gruel soup pizza bad
waffles soup chili good
sausages salad pasta good
waffles pizza chili good
yogurt sandwich stew good
yogurt pizza stew good
sausages soup pasta good
gruel sandwich pizza good
yogurt soup waffles good
我想根据一个人那天吃的东西来预测他的心情。所以我将进行 70/30 train/test 拆分并使用随机森林、SVM 或类似的东西来构建分类器。
至少在我过去使用过它们时,如果预测器在测试集中有一个未出现在训练集中的水平,我使用过的分类器会抱怨。最后一行可能会发生这种情况,其中 dinner
== "waffles".
为避免这种情况,在进行拆分之前,我通常会删除任何列中频率低于 10% 的行。
我怀疑可能有更好的方法。我主要用 R 编写代码,但如果你想 post 在 Python 中回答,我可能能够理解它。
谢谢!
现在我知道行话了,我发现这个 post 有一个 R 用例:stratified splitting the data
应用于我的示例,对晚餐和由此产生的情绪进行分层:
library(splitstackshape)
library(readr)
meals_mood_text <- "breakfast lunch dinner mood
waffles sandwich chili good
sausages sandwich pasta good
yogurt soup waffles good
yogurt salad stew bad
gruel salad pizza bad
gruel pizza pizza good
sausages pizza pasta good
waffles salad chili good
gruel soup pizza bad
waffles soup chili good
sausages salad pasta good
waffles pizza chili good
yogurt sandwich stew good
yogurt pizza stew good
sausages soup pasta good
gruel sandwich pizza good"
meals_mood_frame <-
read.table(textConnection(meals_mood_text), header = TRUE)
closeAllConnections()
strat.res <- stratified(meals_mood_frame, c('dinner','mood'), 0.7, bothSets = TRUE)
print(strat.res[[1]])
print(strat.res[[2]])
假设我有这样的数据集:
breakfast lunch dinner mood
----------- ---------- --------- ------
waffles sandwich chili good
sausages sandwich pasta good
yogurt salad stew bad
gruel salad pizza bad
gruel pizza pizza good
sausages pizza pasta good
waffles salad chili good
gruel soup pizza bad
waffles soup chili good
sausages salad pasta good
waffles pizza chili good
yogurt sandwich stew good
yogurt pizza stew good
sausages soup pasta good
gruel sandwich pizza good
yogurt soup waffles good
我想根据一个人那天吃的东西来预测他的心情。所以我将进行 70/30 train/test 拆分并使用随机森林、SVM 或类似的东西来构建分类器。
至少在我过去使用过它们时,如果预测器在测试集中有一个未出现在训练集中的水平,我使用过的分类器会抱怨。最后一行可能会发生这种情况,其中 dinner
== "waffles".
为避免这种情况,在进行拆分之前,我通常会删除任何列中频率低于 10% 的行。
我怀疑可能有更好的方法。我主要用 R 编写代码,但如果你想 post 在 Python 中回答,我可能能够理解它。
谢谢!
现在我知道行话了,我发现这个 post 有一个 R 用例:stratified splitting the data
应用于我的示例,对晚餐和由此产生的情绪进行分层:
library(splitstackshape)
library(readr)
meals_mood_text <- "breakfast lunch dinner mood
waffles sandwich chili good
sausages sandwich pasta good
yogurt soup waffles good
yogurt salad stew bad
gruel salad pizza bad
gruel pizza pizza good
sausages pizza pasta good
waffles salad chili good
gruel soup pizza bad
waffles soup chili good
sausages salad pasta good
waffles pizza chili good
yogurt sandwich stew good
yogurt pizza stew good
sausages soup pasta good
gruel sandwich pizza good"
meals_mood_frame <-
read.table(textConnection(meals_mood_text), header = TRUE)
closeAllConnections()
strat.res <- stratified(meals_mood_frame, c('dinner','mood'), 0.7, bothSets = TRUE)
print(strat.res[[1]])
print(strat.res[[2]])