Итак, мне есть с чем сравнить мой случайный лес rpart, я собираюсь построить простое дерево решений с помощью пакета rpart. В конце концов, если я не могу победить ни одно дерево rpart, то вся моя работа была бессмысленной!
set.seed(20) # predictable randomness # split the data into training and test data (arbitrarily!) training_data <- data[1:52000,] test_data <- data[52001:nrow(data),] # set the target variable targ <- "is.premium" # set the predictors preds <- c("carat", "depth", "table", "price", "x", "y", "z", "clarity", "color") # build a simple rpart decision tree using the default settings dtree <- rpart(formula = data[,targ] ~ ., data = data[,preds])
Используя функцию rpart.plot() пакета rpart.plot, мы можем визуализировать дерево
Похоже, дерево использует только два наших предиктора — таблицу и глубину.
Чтобы дать вам представление о том, насколько настраиваемый rpart, следующий код регулирует один управляющий параметр — параметр сложности (cp). По умолчанию rpart устанавливает его на 0,01, поэтому я установил его на 0,005. Я всегда понимал, что cp говорит алгоритму дерева остановиться, когда вновь выбранное разбиение не может уменьшить относительную ошибку, по крайней мере, на значение cp. Таким образом, чем ниже cp, тем больше дерево. Недостатком установки крошечного cp является стоимость вычислений для построения большего дерева. В некотором смысле, возможно, cp можно рассматривать как предварительную обрезку.
dtree.cp <- rpart(formula = data[,targ] ~ ., data = data[,preds], control = rpart.control(cp = 0.005)) rpart.plot(dtree.cp)
Первые четыре сплита одинаковы — они являются «лучшими» на основе критериев, которые использует rpart. После этого дерево повторно использует таблицу и еще два предиктора, x и y.
Вы можете посмотреть на многие вещи, чтобы оценить производительность модели, но самое главное — иметь что-то для измерения производительности, иначе довольно сложно понять, построили ли вы полезную модель. Это может быть существующая модель, некоторая метрика, установленная клиентом, или отраслевые стандарты.
Чтобы оценить производительность dtree, я собираюсь запустить модель на тестовых данных и сделать две довольно распространенные вещи:
- Постройте процент оцененной нагрузки по отношению к проценту классифицированных премий
- Создайте матрицу путаницы
Сначала запустите модель с тестовыми данными:
dtree_preds <- predict(dtree, test_data)
Для первого графика я использую некоторые взломанные вместе dplyr и ggplot (для обучения), чтобы отсортировать данные по баллам, а затем кумулятивно вычислить проценты, которые мне нужны для построения графика. Есть несколько пакетов, которые делают это за вас, например. riskchart() в Rattle.
# stick the actual values to the predictions outcomes <- as.data.frame(cbind(test_data$is.premium, ifelse(dtree_preds >= 0.5, 1, 0), dtree_preds)) # rename the columns names(outcomes) <- c('actual', 'predicted_r', 'predicted') # order the dataframe by predicted outcomes <- outcomes %>% arrange(., desc(predicted)) %>% # a hacked together number of rows so far/number of rows overall to get percentage of caseload mutate(., percent_caseload = cumsum(ifelse(predicted_r >= 0, 1, 1)/nrow(.))) %>% # what percentage of the targets have we captured so far mutate(., percent_targets = cumsum(actual)/sum(actual)) # take a peek at the dataframe head(outcomes) # plot the line we have created ggplot(data = outcomes, aes(percent_caseload, percent_targets)) + geom_line(colour = 'darkgreen')
В рамках примера, с которым я играю, это на самом деле не имеет большого значения, и есть только три уникальных показателя (0,6.., 0,05… и 0,00), поэтому произвольный порядок в этих группах влияет на то, как отображается диаграмма. При этом это не ужасная модель. Кривая относительно крутая в начале и сходит на нет по мере того, как вы смотрите на большее количество дел.
В реальном мире, если бы у вас было X аналитиков, которые могли бы оценить Y% всех случаев, вы могли бы использовать это, чтобы показать, какая модель набора моделей лучше всего работает в Y. В этом случае, если бы мы могли просмотреть только 25% всех транзакций, мы получит около 60% риска.
Для создания матрицы путаницы я использую функцию confusionMatrix() из пакета Caret. Чтобы сгенерировать матрицу путаницы, мы должны преобразовать dtree_preds в 0/1, чтобы она соответствовала фактическим результатам.
confusionMatrix(data = ifelse(dtree_preds >= 0.5, 1, 0), reference = test_data$is.premium)
Похоже, что dtree неплохо справляется с поиском бриллиантов премиум-класса (истинные срабатывания), но ошибочно классифицирует ряд бриллиантов не премиум-класса как бриллианты премиум-класса (ложные срабатывания).
И это конец второй части. Часть третья будет включать в себя использование цикла for для многократного вызова rpart() для построения списка деревьев/леса.