按 ID 在 R 中分类
Classification in R by ID
为了性能起见,我一直在尝试使用 RandomForestSRC
包在 R 中进行一些分类。
在这种特殊情况下,我有以下示例data.frame,其中 Y 是分类因子 c("X","Y","Z"),ID 表示这些项目被分组在同一个包中,我还有其他变量可以告诉我结果应该是 X、Y 还是 Z:
y ID x1 x2 x3 ...
X 01 AA BB CC ...
X 01 AA BB DD ...
X 01 AA FF EE ...
Y 02 AA BB CC ...
Y 02 AA BB EE ...
Z 03 AA FF CC ...
Z 03 AA FF EE ...
... ... ... ... ... ...
训练算法后,它成功地为我提供了以下结果,每个项目的准确度都很高,但没有按包裹 ID 对项目进行分组:
y ID x1 x2 x3 ...
Y 01 AA BB CC ...
X 01 AA BB DD ...
Z 01 AA FF EE ...
Y 02 AA BB CC ...
Y 02 AA BB EE ...
Z 03 AA FF CC ...
Z 03 AA FF EE ...
... ... ... ... ... ...
包裹分类的规则应该是这样的:
如果至少一件物品被分类为X,则整个包裹应该是X;
如果同一个包裹里只有Y和Z,包裹应该归类为Y;
如果包裹中只有Z件物品,则整个包裹应归类为Z。
因此,为了分类目的,包裹上的重量应该是X > Y > Z。
我试过摆弄给算法的公式,使用类似的东西:
rf <- rfsrc(y ~ ., data = model, method = "class")
rf <- rfsrc(y ~ ID %in% (x1+x2+x3+...), data = model, method = "class")
rf <- rfsrc(y ~ (x1+x2+x3+...) / ID, data = model, method = "class")
然而,似乎没有什么能很好地工作,有时会降低个别项目的准确性。我考虑过分层预测,使用第一个结果作为算法第二次迭代的模型,但我真的不知道如何实现。
我是否应该放弃使用随机森林进行分类,而完全尝试其他算法? nnet
或 h2o
对我有用吗?我对数据挖掘和预测算法比较陌生,所以请多多包涵。
经过大量研究,我想我找到了我需要的东西。
我已经使用 reshape
包为我的 data.frame 建模并将一些变量转换为行。如果其他人需要它,这些是我遵循的材料:
http://had.co.nz/reshape/introduction.pdf
https://www.r-statistics.com/2012/01/aggregation-and-restructuring-data-from-r-in-action/
在研究了这些材料并进行了一些谷歌搜索之后,我得出了以下代码:
library(reshape)
aux <- melt(myData, id=c('y','ID','x1'))
myData <- as.data.frame(cast(aux, ... ~ variable+value, function(x) { length(x) != 0}))
结果如下重塑data.frame:
y ID x1 x2_BB x2_FF x3_CC x3_DD x3_EE ...
X 01 AA TRUE TRUE TRUE TRUE TRUE ...
Y 02 AA TRUE FALSE TRUE FALSE TRUE ...
Z 03 AA FALSE TRUE TRUE FALSE TRUE ...
... ... ... ... ... ... ... ... ...
为了性能起见,我一直在尝试使用 RandomForestSRC
包在 R 中进行一些分类。
在这种特殊情况下,我有以下示例data.frame,其中 Y 是分类因子 c("X","Y","Z"),ID 表示这些项目被分组在同一个包中,我还有其他变量可以告诉我结果应该是 X、Y 还是 Z:
y ID x1 x2 x3 ...
X 01 AA BB CC ...
X 01 AA BB DD ...
X 01 AA FF EE ...
Y 02 AA BB CC ...
Y 02 AA BB EE ...
Z 03 AA FF CC ...
Z 03 AA FF EE ...
... ... ... ... ... ...
训练算法后,它成功地为我提供了以下结果,每个项目的准确度都很高,但没有按包裹 ID 对项目进行分组:
y ID x1 x2 x3 ...
Y 01 AA BB CC ...
X 01 AA BB DD ...
Z 01 AA FF EE ...
Y 02 AA BB CC ...
Y 02 AA BB EE ...
Z 03 AA FF CC ...
Z 03 AA FF EE ...
... ... ... ... ... ...
包裹分类的规则应该是这样的:
如果至少一件物品被分类为X,则整个包裹应该是X;
如果同一个包裹里只有Y和Z,包裹应该归类为Y;
如果包裹中只有Z件物品,则整个包裹应归类为Z。
因此,为了分类目的,包裹上的重量应该是X > Y > Z。
我试过摆弄给算法的公式,使用类似的东西:
rf <- rfsrc(y ~ ., data = model, method = "class")
rf <- rfsrc(y ~ ID %in% (x1+x2+x3+...), data = model, method = "class")
rf <- rfsrc(y ~ (x1+x2+x3+...) / ID, data = model, method = "class")
然而,似乎没有什么能很好地工作,有时会降低个别项目的准确性。我考虑过分层预测,使用第一个结果作为算法第二次迭代的模型,但我真的不知道如何实现。
我是否应该放弃使用随机森林进行分类,而完全尝试其他算法? nnet
或 h2o
对我有用吗?我对数据挖掘和预测算法比较陌生,所以请多多包涵。
经过大量研究,我想我找到了我需要的东西。
我已经使用 reshape
包为我的 data.frame 建模并将一些变量转换为行。如果其他人需要它,这些是我遵循的材料:
http://had.co.nz/reshape/introduction.pdf
https://www.r-statistics.com/2012/01/aggregation-and-restructuring-data-from-r-in-action/
在研究了这些材料并进行了一些谷歌搜索之后,我得出了以下代码:
library(reshape)
aux <- melt(myData, id=c('y','ID','x1'))
myData <- as.data.frame(cast(aux, ... ~ variable+value, function(x) { length(x) != 0}))
结果如下重塑data.frame:
y ID x1 x2_BB x2_FF x3_CC x3_DD x3_EE ...
X 01 AA TRUE TRUE TRUE TRUE TRUE ...
Y 02 AA TRUE FALSE TRUE FALSE TRUE ...
Z 03 AA FALSE TRUE TRUE FALSE TRUE ...
... ... ... ... ... ... ... ... ...