Построение дерева решений на основе строк с алгоритмом J48 для прогнозирования
Я пытаюсь построить дерево решений J48 на основе атрибутов строковых значений и предсказать целевую переменную (категориальную), я видел много примеров построения дерева решений на основе числовых значений, но я не сталкивался на основе строк.
Вот пример набора данных, дерево решений J48 работает нормально.
library(RWeka)
library(party)
MyData2 <- read.csv(file="iris.csv", header=TRUE, sep=",")
m3 <- J48(species~ ., data = MyData2)`enter code here`
if(require("party", quietly = TRUE)) plot(m3)
sepal_length sepal_width petal_length petal_width species
5.1 3.5 1.4 0.2 setosa
4.9 3 1.4 0.2 setosa
7 3.2 4.7 1.4 versicolor
6.4 3.2 4.5 1.5 versicolor
6.3 3.3 6 2.5 virginica
5.8 2.7 5.1 1.9 virginica
Если я переименую заголовок sepal_length, sepal_width и в sepal_color и получу значения "белый", "черный" с различными комбинациями цветов для setosa, versicolor и virginca, как мне построить дерево решений и предсказать значение целевого вида.
Предположим, если у меня есть набор данных, как показано ниже,
sepal_color sepal_color petal_color petal_color species
white black white black setosa
white yellow white yellow versicolor
green brown green brown virginica
2 ответа
Если строковые переменные представляют уровни категориальной переменной, то их следует превратить в factor()
в R. Тогда J48()
может справиться с этим соответствующим образом (как и другие функции регрессии).
Однако, если строки содержат свободный текст, они не поддерживаются напрямую. Предварительная обработка некоторой числовой или факторной переменной будет необходима перед вызовом J48()
,
В качестве примера для классификации на основе категориальных переменных давайте обратимся к переменным в iris
данные в факторы с тремя уровнями low
, medium
, high
(разрезание каждой переменной на три группы одинакового размера в соответствующих квантилях):
## load data and convert to factors via cut()
data("iris", package = "datasets")
for(i in 1:4) iris[[i]] <- cut(iris[[i]],
quantile(iris[[i]], 0:3/3),
labels = c("low", "medium", "high")
)
head(iris, 3)
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 low high low low setosa
## 2 low medium low low setosa
## 3 low medium low low setosa
## fit and plot J4.8 tree
j48 <- J48(Species ~ ., data = iris)
plot(j48)
Разрешает ли алгоритм строковые регрессоры? Я попробовал это, и это бросило ошибку. Со строками вы можете попробовать однократное кодирование, например "White"=1; "Черный"=2 и т. Д. Например
MyData2 <- iris
MyData2$Colour <- 2
MyData2[MyData2$Species == "setosa", ]$Colour <- 1
m3 <- J48(Species~ ., data = MyData2)
plot(m3)