我有用于训练二元分类模型的数据。
set.seed(1)
n <- 20
dat <- cbind.data.frame(target=as.factor(sample(0:1,n,T)),
price=round(rnorm(n)+1000,2),
var1=sample(1:n),
var2=round(rnorm(n),2),
var3=round(rnorm(n),2))
.
target price var1 var2 var3
1 1 1001.03 5 -0.95 1.16
2 0 1000.21 13 -0.02 -0.45
3 0 999.49 11 1.20 1.95
4 0 1000.95 7 0.71 0.86
5 1 1001.49 20 -0.44 1.07
6 0 999.45 10 0.78 -1.76
7 1 998.78 12 -1.64 -0.77
8 1 998.23 8 0.67 0.12
我想强制我的模型考虑我在做出的每个决定中指定的变量
price
。
我将用一个例子来解释我的意思。 假设我正在使用由规则组成的随机森林模型,在这种情况下,我希望每个规则都有一个
price
变量。
这些都是很好的规则,因为每个规则都有一个变量
price
price<=1001.49 & var1>0.105
var2<=0.12 & price>1001.03 & var3>-0.025
price<=998.23 & price>=997.23
这些都是不好的规则,我希望模型中没有这样的规则
var3<=0.57 & var3>0.105
var2<=0.12 & var2>-1.005 & var3>-0.025
var1<=6.5
我知道我无法影响模型本身,但也许我可以以某种方式更改数据集中的变量,最终迫使模型在每个决策中强制使用
price
变量。
作为测试,您可以使用此代码从经过训练的随机森林模型中提取规则。
library(inTrees)
library(randomForest)
rules <- randomForest(target~., dat, ntree=20) |>
RF2List() |>
extractRules(dat) |>
unique() |>
getRuleMetric(dat[,-1], dat$target) |>
pruneRule(dat[,-1], dat$target) |>
buildLearner(dat[,-1], dat$target)
.
presentRules(rules, colnames(dat[,-1]))
len freq err condition pred
[1,] "2" "0.35" "0" "var1<=15.5 & var2<=-0.05" "1"
[2,] "3" "0.2" "0" "var1<=13.5 & var2>-0.05 & var3<=-0.315" "0"
[3,] "1" "0.1" "0" "var2>1.255" "1"
[4,] "2" "0.1" "0" "var1>17 & var2>-1.55" "1"
[5,] "1" "0.1" "0" "var3<=-0.16" "0"
[6,] "2" "0.1" "0" "var2>-0.05 & var3>0.49" "0"
[7,] "1" "0.05" "0" "Else" "1"
正如您在此阶段所看到的,模型拒绝在其规则中使用变量
price
。但我的任务的具体情况意味着我不需要不使用 price
的规则。
总而言之,我的问题是这样的: 如何更改我的数据集以强制模型在每个规则中使用
price
?
这个技巧可能会起作用。
随机森林样本列,对吧?然后,我只需添加数十(或数百或数千)价格列的副本来扩展数据集。