2015-07-22 1 views
5

Я использую пакет rpart так:Использование rpart: Как добиться большей изменчивости прогнозов?

model <- rpart(totalUSD ~ ., data = df.train) 

Я заметил, что более 80k строк, rpart является обобщающим это предсказание в только три отдельных группы, как показано на рисунке ниже:

enter image description here

Я вижу несколько configuration options for the rpart method; однако я не совсем понимаю их.

Есть ли способ настроить rpart так, чтобы он создавал больше прогнозов (вместо трех); не такие суровые группы, но больше уровней между ними?

Причина, по которой я спрашиваю, заключается в том, что моя оценка стоимости выглядит довольно упрощенной, поскольку она возвращает только одно из трех чисел!

Вот пример моих данных:

structure(list(totalUSD = c(9726.6, 730.14, 750, 200, 60.49, 
310.81, 151.23, 145.5, 3588.13, 400), durationDays = c(730, 724, 
730, 189, 364, 364, 364, 176, 730, 1095), familySize = c(4, 1, 
2, 1, 3, 2, 1, 1, 4, 4), serviceName = c("Service5", 
"Service6", "Service9", "Service4", 
"Service1", "Service2", "Service1", "Service3", 
"Service7", "Service8"), homeLocationGeoLat = c(37.09024, 
10.691803, 37.09024, 35.86166, 55.378051, 35.86166, 51.165691, 
-30.559482, -30.559482, 41.87194), homeLocationGeoLng = c(-95.712891, 
-61.222503, -95.712891, 104.195397, -3.435973, 104.195397, 10.451526, 
22.937506, 22.937506, 12.56738), hostLocationGeoLat = c(55.378051, 
37.09024, 55.378051, 55.378051, 37.09024, 1.352083, 55.378051, 
37.09024, 23.424076, 1.352083), hostLocationGeoLng = c(-3.435973, 
-95.712891, -3.435973, -3.435973, -95.712891, 103.819836, -3.435973, 
-95.712891, 53.847818, 103.819836), geoDistance = c(6838055.10555534, 
4532586.82063172, 6838055.10555534, 7788275.0443749, 6838055.10555534, 
3841784.48282769, 1034141.95021832, 14414898.8246973, 6856033.00945242, 
10022083.1525388)), .Names = c("totalUSD", "durationDays", "familySize", 
"serviceName", "homeLocationGeoLat", "homeLocationGeoLng", "hostLocationGeoLat", 
"hostLocationGeoLng", "geoDistance"), row.names = c(25601L, 6083L, 
24220L, 20235L, 8372L, 456L, 8733L, 27257L, 15928L, 24099L), class = "data.frame") 
+0

Можете ли вы дать нам образец данных или какой-нибудь воспроизводимый пример? – roman

+0

Да, я добавил его к моему вопросу. Спасибо. – user1477388

+1

Хорошо, я немного поиграл с вашими данными. Трудно воссоздать вашу проблему, поскольку дерево, которое вы строите, использует гораздо больше данных. Я предполагаю, что параметры установлены таким образом, что у вас есть два разбиения в вашем дереве (две важные переменные важности), что приводит к 3 терминальным узлам. Дерево предсказывает среднее значение в регионах на каждом терминальном узле. Если вы хотите более мелкие предсказания, попробуйте что-то вроде случайных лесов или увеличивайте, а не подгоняйте одно дерево. Затем вы можете использовать кросс-валидацию для настройки количества усредненных деревьев (случайные леса) или параметра усадки (повышение). – roman

ответ

3

Если вы действительно хотите сложную древовидную структуру, попробуйте следующее:

library(rpart) 
fit = rpart(totalUSD ~ ., data = df.train, control = rpart.control(cp = 0)) 

В принципе каждый раскол пытался когда cp = 0, независимо от улучшений в расщепляется. Вы получаете действительно сложную модель с этим, но у вас есть наблюдения 80k, поэтому установите minsplit или minbucket в удобное для вас число.

Я использовал эту стратегию в случайной реализации леса, в которой я работаю. Осторожно, время вычисления может сильно возрасти.