# 라이브러리 패키지 다운
install.packages("C50")
library(C50)
library(caret)
library(rpart)
library(rpart.plot)
# 데이터셋 다운
iris <- read.csv("c:\\data\\iris2.csv", stringsAsFactors = TRUE)
# 데이터셋 구조 확인
str(iris)
# 정답 칼럼 팩터로 변경
iris$Species <- as.factor(iris$Species)
# 학습 데이터와 훈련 데이터 분리 (train:test = 8:2)
set.seed(1)
k <- createDataPartition(iris$Species, p = 0.8, list = FALSE)
train_data <- iris[k, ]
test_data <- iris[-k, ]
# C5.0 모델 사용
# 모든 피쳐(columns 1 to 4) 타겟 변수(Species) 예측하기 위한 요소로 사용
model <- C5.0(train_data[, 1:4], train_data$Species)
# 테스트 데이터 생성
test_result <- predict(model, test_data[, 1:4])
# 모델 예측
test_result
# 정확도 확인
accuracy <- sum(test_result == test_data$Species) / length(test_data$Species) * 100
accuracy
model
summary(model)
plot(model)
# (a) (b) (c)
#(a) | 40 | 0 | 0 | (Iris-setosa)
#(b) | 2 | 38 | 0 | (Iris-versicolor)
#(c) | 0 | 1 | 39 | (Iris-virginica)
# 모델 튜닝 - 최종 결합 모델 사용
model_tuned <- C5.0(train_data[, 1:4], train_data$Species, trials = 10, winnow = TRUE)
# 훈련 데이터 확인
summary(model_tuned)
# 시각화
plot(model_tuned)
IRIS 꽃 품종은 Petal.Width(꽃잎의 넓이) 0.5 이하일 경우 Iris-setosa 100% 품종,
Petal.Width(꽃잎의 넓이) 0.5 이상일 경우 1.7 이하이면서 Petal.Length(꽃잎의 길이) 4.9이하일 경우 Iris-versicolor 품종 - 39개 중 1개 Iris-virginica,
Petal.Width(꽃잎의 넓이) 0.5 이상일 경우 1.7 이하이면서 Petal.Length(꽃잎의 길이) 4.9 초과일 경우 Iris-virginica 품종 - 6개 중 2개 Iris-versicolor,
Petal.Width(꽃잎의 넓이) 1.7 이상인 경우 Iris-virginica 100% 품종으로 분류할 수 있습니다.
# 테스트 데이터 예측
test_result_tuned <- predict(model_tuned, test_data[, 1:4])
# 정확도 확인
accuracy_tuned <- sum(test_result_tuned == test_data$Species) / length(test_data$Species) * 100
accuracy_tuned
> accuracy_tuned
[1] 93.33333
# 학습 & 훈련 데이터 시각화
model_rpart_train <- rpart(Species ~ ., data = train_data)
rpart.plot(model_rpart_train)
library(rpart)model_rpart_test <- rpart(Species ~ ., data = test_data)
rpart.plot(model_rpart_test)
# 과적합 확인
[1] "Training accuracy: 97.5 %"
[1] "Test accuracy: 93.3333333333333 %"
[1] "Cross-validation accuracy: 0.946666666666667"
model <- C5.0(train_data[, 1:4], train_data$Species)
train_pred <- predict(model, train_data[, 1:4])
train_accuracy <- sum(train_pred == train_data$Species) / length(train_data$$
print(paste("Training accuracy: ", train_accuracy, "%"))
test_pred <- predict(model, test_data[, 1:4])
test_accuracy <- sum(test_pred == test_data$Species) / length(test_data$Spec$
print(paste("Test accuracy: ", test_accuracy, "%"))
train_control <- trainControl(method = "cv", number = 5)
model_cv <- train(Species ~ ., data = iris, method = "C5.0", trControl = train_control)
print(paste("Cross-validation accuracy: ", mean(model_cv$results$Accuracy)))
🍔 따라서 오버피팅 되지 않은 모델으로 볼 수 있습니다.