# [ cancer 데이터를 사용하여 암 종양의 악성 여부 분류 ]
1. DT, RF 모형에 대한 정확도 확인
2. 변수 중요도를 기반으로 상위 2개, 하위 2개를 선택하여 교차산점도 출력 (종속변수 색으로 구분)
3. 위 결과 생성
4. RF 모형의 매개변수 튜닝 결과 해석
cancer <- read.csv('cancer.csv')
# Python에서는 관계없으나 R에서 랜덤포레스트를 진행할 시 y축이 factor로 선언되어야 한다.
cancer$diagnosis <- factor(cancer$diagnosis)
head(cancer)
summary(cancer[,-1])
> summary(cancer[,-1])
diagnosis radius_mean texture_mean perimeter_mean area_mean smoothness_mean compactness_mean concavity_mean
Length:569 Min. : 6.981 Min. : 9.71 Min. : 43.79 Min. : 143.5 Min. :0.05263 Min. :0.01938 Min. :0.00000
Class :character 1st Qu.:11.700 1st Qu.:16.17 1st Qu.: 75.17 1st Qu.: 420.3 1st Qu.:0.08637 1st Qu.:0.06492 1st Qu.:0.02956
Mode :character Median :13.370 Median :18.84 Median : 86.24 Median : 551.1 Median :0.09587 Median :0.09263 Median :0.06154
Mean :14.127 Mean :19.29 Mean : 91.97 Mean : 654.9 Mean :0.09636 Mean :0.10434 Mean :0.08880
3rd Qu.:15.780 3rd Qu.:21.80 3rd Qu.:104.10 3rd Qu.: 782.7 3rd Qu.:0.10530 3rd Qu.:0.13040 3rd Qu.:0.13070
Max. :28.110 Max. :39.28 Max. :188.50 Max. :2501.0 Max. :0.16340 Max. :0.34540 Max. :0.42680
concave_points_mean symmetry_mean fractal_dimension_mean radius_se texture_se perimeter_se area_se smoothness_se
Min. :0.00000 Min. :0.1060 Min. :0.04996 Min. :0.1115 Min. :0.3602 Min. : 0.757 Min. : 6.802 Min. :0.001713
1st Qu.:0.02031 1st Qu.:0.1619 1st Qu.:0.05770 1st Qu.:0.2324 1st Qu.:0.8339 1st Qu.: 1.606 1st Qu.: 17.850 1st Qu.:0.005169
Median :0.03350 Median :0.1792 Median :0.06154 Median :0.3242 Median :1.1080 Median : 2.287 Median : 24.530 Median :0.006380
Mean :0.04892 Mean :0.1812 Mean :0.06280 Mean :0.4052 Mean :1.2169 Mean : 2.866 Mean : 40.337 Mean :0.007041
3rd Qu.:0.07400 3rd Qu.:0.1957 3rd Qu.:0.06612 3rd Qu.:0.4789 3rd Qu.:1.4740 3rd Qu.: 3.357 3rd Qu.: 45.190 3rd Qu.:0.008146
Max. :0.20120 Max. :0.3040 Max. :0.09744 Max. :2.8730 Max. :4.8850 Max. :21.980 Max. :542.200 Max. :0.031130
compactness_se concavity_se concave_points_se symmetry_se fractal_dimension_se radius_worst texture_worst perimeter_worst
Min. :0.002252 Min. :0.00000 Min. :0.000000 Min. :0.007882 Min. :0.0008948 Min. : 7.93 Min. :12.02 Min. : 50.41
1st Qu.:0.013080 1st Qu.:0.01509 1st Qu.:0.007638 1st Qu.:0.015160 1st Qu.:0.0022480 1st Qu.:13.01 1st Qu.:21.08 1st Qu.: 84.11
Median :0.020450 Median :0.02589 Median :0.010930 Median :0.018730 Median :0.0031870 Median :14.97 Median :25.41 Median : 97.66
Mean :0.025478 Mean :0.03189 Mean :0.011796 Mean :0.020542 Mean :0.0037949 Mean :16.27 Mean :25.68 Mean :107.26
3rd Qu.:0.032450 3rd Qu.:0.04205 3rd Qu.:0.014710 3rd Qu.:0.023480 3rd Qu.:0.0045580 3rd Qu.:18.79 3rd Qu.:29.72 3rd Qu.:125.40
Max. :0.135400 Max. :0.39600 Max. :0.052790 Max. :0.078950 Max. :0.0298400 Max. :36.04 Max. :49.54 Max. :251.20
area_worst smoothness_worst compactness_worst concavity_worst concave_points_worst symmetry_worst fractal_dimension_worst
Min. : 185.2 Min. :0.07117 Min. :0.02729 Min. :0.0000 Min. :0.00000 Min. :0.1565 Min. :0.05504
1st Qu.: 515.3 1st Qu.:0.11660 1st Qu.:0.14720 1st Qu.:0.1145 1st Qu.:0.06493 1st Qu.:0.2504 1st Qu.:0.07146
Median : 686.5 Median :0.13130 Median :0.21190 Median :0.2267 Median :0.09993 Median :0.2822 Median :0.08004
Mean : 880.6 Mean :0.13237 Mean :0.25427 Mean :0.2722 Mean :0.11461 Mean :0.2901 Mean :0.08395
3rd Qu.:1084.0 3rd Qu.:0.14600 3rd Qu.:0.33910 3rd Qu.:0.3829 3rd Qu.:0.16140 3rd Qu.:0.3179 3rd Qu.:0.09208
Max. :4254.0 Max. :0.22260 Max. :1.05800 Max. :1.2520 Max. :0.29100 Max. :0.6638 Max. :0.20750
[ 내 답변 ]
# DT 모델
df1 <- cancer[,-1]
cancer_sample <- sample(1:nrow(df1), round(nrow(df1)*0.7))
cancer_train <- cancer[cancer_sample,]
cancer_test <- cancer[-cancer_sample,]
mdt <- rpart(diagnosis~., cancer_train)
mdt
> mdt
n= 398
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 398 142 Benign (0.643216080 0.356783920)
2) perimeter_worst< 106.1 245 10 Benign (0.959183673 0.040816327)
4) concave_points_worst< 0.1456 236 3 Benign (0.987288136 0.012711864) *
5) concave_points_worst>=0.1456 9 2 Malignant (0.222222222 0.777777778) *
3) perimeter_worst>=106.1 153 21 Malignant (0.137254902 0.862745098)
6) perimeter_worst< 117.45 40 20 Benign (0.500000000 0.500000000)
12) texture_worst< 26.925 22 4 Benign (0.818181818 0.181818182) *
13) texture_worst>=26.925 18 2 Malignant (0.111111111 0.888888889) *
7) perimeter_worst>=117.45 113 1 Malignant (0.008849558 0.991150442) *
prp(mdt, type = 4, extra = 3)

# DT 모델 -> 예측
pre_dt_tr <- predict(mdt, newdata = cancer_train, type = 'class')
sum(pre_dt_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
> sum(pre_dt_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
[1] 96.98492
pre_dt_te <- predict(mdt, newdata = cancer_test, type = 'class')
sum(pre_dt_te == cancer_test$diagnosis) / nrow(cancer_test) * 100
> sum(pre_dt_te == cancer_test$diagnosis) / nrow(cancer_test) * 100
[1] 91.81287
# 변수 중요도 확인
mdt$variable.importance
> mdt$variable.importance
perimeter_worst radius_worst area_worst
141.507392 126.656276 125.468223
perimeter_mean area_mean radius_mean
118.577151 113.824940 113.824940
symmetry_worst concave_points_worst texture_worst
11.137680 10.148834 9.898990
concavity_mean texture_mean texture_se
8.937904 7.699214 7.149270
compactness_worst concavity_worst smoothness_se
5.638241 5.638241 3.299663
concavity_se
2.255296
# 상위 2개 변수 (perimeter_worst, radius_worst)
# 하위 2개 변수 (concavity_se, smoothness_se)
# 시각화
plot_dt <- cancer[,c('perimeter_worst','radius_worst','concavity_se', 'smoothness_se')]
pairs(plot_dt, col = as.numeric(cancer$diagnosis))

# RF 모형
df1 <- cancer[,-1]
cancer_sample <- sample(1:nrow(df1), round(nrow(df1)*0.7))
cancer_train <- cancer[cancer_sample,]
cancer_test <- cancer[-cancer_sample,]
mrf <- randomForest(diagnosis ~., data = cancer_train)
mrf
> mrf
Call:
randomForest(formula = diagnosis ~ ., data = cancer_train)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 5
OOB estimate of error rate: 4.77%
Confusion matrix:
Benign Malignant class.error
Benign 250 7 0.02723735
Malignant 12 129 0.08510638
# 변수 중요도 확인
pre_rf_tr <- predict(mrf, newdata = cancer_train, type = 'class')
sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
> sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
[1] 100
pre_rf_te <- predict(mrf, newdata = cancer_test, type = 'class')
sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100
> sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100
[1] 97.66082
# RF 모형의 매개변수 튜닝 결과 해석
vscore_tr <- c() ; vscore_te <- c()
for (i in 1:500) {
mrf <- randomForest(diagnosis ~., data = cancer_train, ntree = i)
pre_rf_tr <- predict(mrf, newdata = cancer_train, type = 'class')
pre_rf_te <- predict(mrf, newdata = cancer_test, type = 'class')
vscore_tr <- c(vscore_tr, sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100)
vscore_te <- c(vscore_te, sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100)
}
plot(1:500, vscore_tr, type = 'o', col = 'red', ylim = c(91, 100),
xlab = 'ntree', ylab = 'accuracy')
lines(1:500, vscore_te, type = 'o', col = 'blue')
legend('bottomright', c('train_score', 'test_score'), lty = 1, col = c('red', 'blue'),
inset = c(0.01, 0.03))

▲ 150-200에서 test_score 변동폭이 줄어들기 시작함. 따라서 ntree는 200 정도로 지정하는 것이 좋음
vscore_tr <- c() ; vscore_te <- c()
for (i in 1:ncol(cancer[,-1])) {
mrf <- randomForest(diagnosis ~., data = cancer_train, mtry = i)
pre_rf_tr <- predict(mrf, newdata = cancer_train, type = 'class')
pre_rf_te <- predict(mrf, newdata = cancer_test, type = 'class')
vscore_tr <- c(vscore_tr, sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100)
vscore_te <- c(vscore_te, sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100)
}
plot(1:ncol(cancer[,-1]), vscore_tr, type = 'o', col = 'red', ylim = c(91, 100),
xlab = 'ntree', ylab = 'accuracy')
lines(1:ncol(cancer[,-1]), vscore_te, type = 'o', col = 'blue')
legend('bottomright', c('train_score', 'test_score'), lty = 1, col = c('red', 'blue'),
inset = c(0.01, 0.03))

▲ 3-4에서 accuracy 가 최대이므로 mtry는 4 정도 지정하는 것이 좋음
# ####
mrf
> mrf
Call:
randomForest(formula = diagnosis ~ ., data = cancer_train)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 5
OOB estimate of error rate: 4.77%
Confusion matrix:
Benign Malignant class.error
Benign 250 7 0.02723735
Malignant 12 129 0.08510638
randomForest(diagnosis ~ ., data = cancer_train, ntree = 200, mtry = 4)
> randomForest(diagnosis ~ ., data = cancer_train, ntree = 200, mtry = 4)
Call:
randomForest(formula = diagnosis ~ ., data = cancer_train, ntree = 200, mtry = 4)
Type of random forest: classification
Number of trees: 200
No. of variables tried at each split: 4
OOB estimate of error rate: 4.27%
Confusion matrix:
Benign Malignant class.error
Benign 253 4 0.01556420
Malignant 13 128 0.09219858
[ 문제풀이 ]
# 데이터 로딩
cancer <- read.csv('cancer.csv')
cancer$diagnosis <- factor(cancer$diagnosis)
# 불필요한 변수 제거거
cancer$id <- NULL
# 데이터 탐색
# 1) 기술통계량
summary(cancer)
> summary(cancer)
diagnosis radius_mean texture_mean perimeter_mean area_mean smoothness_mean compactness_mean concavity_mean concave_points_mean symmetry_mean fractal_dimension_mean
Benign :357 Min. : 6.981 Min. : 9.71 Min. : 43.79 Min. : 143.5 Min. :0.05263 Min. :0.01938 Min. :0.00000 Min. :0.00000 Min. :0.1060 Min. :0.04996
Malignant:212 1st Qu.:11.700 1st Qu.:16.17 1st Qu.: 75.17 1st Qu.: 420.3 1st Qu.:0.08637 1st Qu.:0.06492 1st Qu.:0.02956 1st Qu.:0.02031 1st Qu.:0.1619 1st Qu.:0.05770
Median :13.370 Median :18.84 Median : 86.24 Median : 551.1 Median :0.09587 Median :0.09263 Median :0.06154 Median :0.03350 Median :0.1792 Median :0.06154
Mean :14.127 Mean :19.29 Mean : 91.97 Mean : 654.9 Mean :0.09636 Mean :0.10434 Mean :0.08880 Mean :0.04892 Mean :0.1812 Mean :0.06280
3rd Qu.:15.780 3rd Qu.:21.80 3rd Qu.:104.10 3rd Qu.: 782.7 3rd Qu.:0.10530 3rd Qu.:0.13040 3rd Qu.:0.13070 3rd Qu.:0.07400 3rd Qu.:0.1957 3rd Qu.:0.06612
Max. :28.110 Max. :39.28 Max. :188.50 Max. :2501.0 Max. :0.16340 Max. :0.34540 Max. :0.42680 Max. :0.20120 Max. :0.3040 Max. :0.09744
radius_se texture_se perimeter_se area_se smoothness_se compactness_se concavity_se concave_points_se symmetry_se fractal_dimension_se radius_worst
Min. :0.1115 Min. :0.3602 Min. : 0.757 Min. : 6.802 Min. :0.001713 Min. :0.002252 Min. :0.00000 Min. :0.000000 Min. :0.007882 Min. :0.0008948 Min. : 7.93
1st Qu.:0.2324 1st Qu.:0.8339 1st Qu.: 1.606 1st Qu.: 17.850 1st Qu.:0.005169 1st Qu.:0.013080 1st Qu.:0.01509 1st Qu.:0.007638 1st Qu.:0.015160 1st Qu.:0.0022480 1st Qu.:13.01
Median :0.3242 Median :1.1080 Median : 2.287 Median : 24.530 Median :0.006380 Median :0.020450 Median :0.02589 Median :0.010930 Median :0.018730 Median :0.0031870 Median :14.97
Mean :0.4052 Mean :1.2169 Mean : 2.866 Mean : 40.337 Mean :0.007041 Mean :0.025478 Mean :0.03189 Mean :0.011796 Mean :0.020542 Mean :0.0037949 Mean :16.27
3rd Qu.:0.4789 3rd Qu.:1.4740 3rd Qu.: 3.357 3rd Qu.: 45.190 3rd Qu.:0.008146 3rd Qu.:0.032450 3rd Qu.:0.04205 3rd Qu.:0.014710 3rd Qu.:0.023480 3rd Qu.:0.0045580 3rd Qu.:18.79
Max. :2.8730 Max. :4.8850 Max. :21.980 Max. :542.200 Max. :0.031130 Max. :0.135400 Max. :0.39600 Max. :0.052790 Max. :0.078950 Max. :0.0298400 Max. :36.04
texture_worst perimeter_worst area_worst smoothness_worst compactness_worst concavity_worst concave_points_worst symmetry_worst fractal_dimension_worst
Min. :12.02 Min. : 50.41 Min. : 185.2 Min. :0.07117 Min. :0.02729 Min. :0.0000 Min. :0.00000 Min. :0.1565 Min. :0.05504
1st Qu.:21.08 1st Qu.: 84.11 1st Qu.: 515.3 1st Qu.:0.11660 1st Qu.:0.14720 1st Qu.:0.1145 1st Qu.:0.06493 1st Qu.:0.2504 1st Qu.:0.07146
Median :25.41 Median : 97.66 Median : 686.5 Median :0.13130 Median :0.21190 Median :0.2267 Median :0.09993 Median :0.2822 Median :0.08004
Mean :25.68 Mean :107.26 Mean : 880.6 Mean :0.13237 Mean :0.25427 Mean :0.2722 Mean :0.11461 Mean :0.2901 Mean :0.08395
3rd Qu.:29.72 3rd Qu.:125.40 3rd Qu.:1084.0 3rd Qu.:0.14600 3rd Qu.:0.33910 3rd Qu.:0.3829 3rd Qu.:0.16140 3rd Qu.:0.3179 3rd Qu.:0.09208
Max. :49.54 Max. :251.20 Max. :4254.0 Max. :0.22260 Max. :1.05800 Max. :1.2520 Max. :0.29100 Max. :0.6638 Max. :0.20750
# 2) 교차산점도(Y분류의 좋은 설명변수 확인)
plot(cancer[,2:6], col = cancer$diagnosis) # 종속변수를 color로 표현하려면
plot(cancer[,7:11], col = cancer$diagnosis) # R에서는 반드시 factor로 선언해야함

# 3) 이상치
boxplot(cancer[,2:3])
# 분류분석의 경우에는 이상치가 존재하여도 이상치에 민감하지 않은 모델을 이용하면 되나, 회귀분석의 경우에는 이상치의 영향을 심하게 받기 때문에 이상치 확인/제거가 필요하다.

# 4) 각 변수의 유의성
Y(범주형, 클래스 2개) <-> X(수치형)의 관계는
양성과 악성 집단의 모평균이 유의하게 다른지를 통해 판단 가능 -> t.test 진행
H0 : 두 집단의 평균이 같다.
H1 : 두 집단의 평균이 다르다.
t.test(cancer$radius_mean ~ cancer$diagnosis)$p.value
> t.test(cancer$radius_mean ~ cancer$diagnosis)$p.value
[1] 1.684459e-64
f1 <- function(x) {
t.test(x ~ cancer$diagnosis)$p.value
}
apply(cancer[,-1],2,f1)
> apply(cancer[,-1],2,f1)
radius_mean texture_mean perimeter_mean area_mean
1.684459e-64 3.019055e-25 1.023141e-66 3.284366e-52
smoothness_mean compactness_mean concavity_mean concave_points_mean
5.573331e-19 9.607863e-42 3.742121e-58 3.127316e-71
symmetry_mean fractal_dimension_mean radius_se texture_se
5.957651e-15 7.667216e-01 1.491133e-30 8.354171e-01
perimeter_se area_se smoothness_se compactness_se
6.868553e-29 2.983568e-26 1.052970e-01 6.341807e-12
concavity_se concave_points_se symmetry_se fractal_dimension_se
1.266514e-11 4.042197e-24 8.871223e-01 4.220238e-02
radius_worst texture_worst perimeter_worst area_worst
3.556557e-71 5.198708e-30 1.032730e-72 4.937924e-54
smoothness_worst compactness_worst concavity_worst concave_points_worst
3.474376e-24 1.749835e-38 9.852484e-59 1.061454e-96
symmetry_worst fractal_dimension_worst
6.562499e-19 2.041904e-12
모든 변수에 있어 p-value가 매우 낮은 것을 확인하였다.
# H0 : μ₁ = μ₂
# H1 : μ₁ != μ₂
이므로 양성, 음성에 있어 모든 변수에 차이가 있음을 확인할 수 있다.
따라서 두 집단에 유의미한 값의 차이가 발생하기 때문에 초기 단계에서 특정 변수의 제거를 고려할 필요는 없다.
=> 모든 변수들의 t.test 결과에 있어 유의확률이 0.05보다 작게 나왔으므로 영가설을 기각하면서 각 변수들이 임의 양성/악성 분류에 영향을 줄 것으로 예상된다.
# step4) 모델링
# 1) 데이터 분리
set.seed(0)
rn <- sample(1:nrow(cancer), nrow(cancer) * 0.7)
> rn
[1] 398 129 509 471 299 270 187 307 277 494 330 37 105
[14] 485 382 326 559 422 111 404 532 506 343 121 40 537
[27] 375 248 198 378 39 435 390 280 526 45 402 22 193
cancer_train <- cancer[rn, ]
cancer_test <- cancer[-rn, ]
# 2) 모델링
# Python은 가능하나, R은 모델 내부에서의 seed 고정이 되지 않는다.
# 또한 R은 seed가 외부에서 고정이 되나 풀리는 문제가 있어 seed 고정 이후에 학습을 진행하는 것이 좋다.
library(rpart)
library(rpart.plot)
library(randomForest)
set.seed(32)
m_dt <- rpart(diagnosis ~., data = cancer_train)
> m_dt
n= 398
node), split, n, loss, yval, (yprob)
* denotes terminal node
1) root 398 141 Benign (0.64572864 0.35427136)
2) area_worst< 871.8 275 24 Benign (0.91272727 0.08727273)
4) concave_points_worst< 0.13185 238 4 Benign (0.98319328 0.01680672) *
5) concave_points_worst>=0.13185 37 17 Malignant (0.45945946 0.54054054)
10) texture_mean< 20.675 23 6 Benign (0.73913043 0.26086957)
20) smoothness_mean< 0.10835 16 1 Benign (0.93750000 0.06250000) *
21) smoothness_mean>=0.10835 7 2 Malignant (0.28571429 0.71428571) *
11) texture_mean>=20.675 14 0 Malignant (0.00000000 1.00000000) *
3) area_worst>=871.8 123 6 Malignant (0.04878049 0.95121951)
6) concavity_worst< 0.2237 7 2 Benign (0.71428571 0.28571429) *
7) concavity_worst>=0.2237 116 1 Malignant (0.00862069 0.99137931) *
set.seed(32)
m_rt <- randomForest(diagnosis~., data = cancer_train)
> m_rt
Call:
randomForest(formula = diagnosis ~ ., data = cancer_train)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 5
OOB estimate of error rate: 5.03%
Confusion matrix:
Benign Malignant class.error
Benign 250 7 0.02723735
Malignant 13 128 0.09219858
# step5) 평가
pre_dt_tr <- predict(m_dt, newdata = cancer_train, type = 'class')
pre_dt_te <- predict(m_dt, newdata = cancer_test, type = 'class')
pre_rf_tr <- predict(m_rt, newdata = cancer_train, type = 'class')
pre_rf_te <- predict(m_rt, newdata = cancer_test, type = 'class')
sum(pre_dt_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
sum(pre_dt_te == cancer_test$diagnosis) / nrow(cancer_test) * 100
> sum(pre_dt_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
[1] 97.48744
> sum(pre_dt_te == cancer_test$diagnosis) / nrow(cancer_test) * 100
[1] 93.56725
sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100
> sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
[1] 100
> sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100
[1] 96.49123
# step6) 결과 해석
sort(m_dt$variable.importance, decreasing = T)
> sort(m_dt$variable.importance, decreasing = T)
area_worst radius_worst perimeter_worst area_mean radius_mean
126.8699341 123.7755455 120.7464595 110.3665281 109.3350652
perimeter_mean concave_points_worst concavity_worst compactness_worst texture_mean
108.3036023 21.8097209 15.1208332 11.9667767 9.5088132
concave_points_mean concavity_mean texture_worst compactness_mean smoothness_mean
9.0112085 8.0609980 6.7920094 5.6892789 4.1374224
texture_se compactness_se radius_se symmetry_mean fractal_dimension_se
3.3960047 2.0376028 1.7731810 1.7731810 0.9392475
cols <- c('area_worst', 'radius_worst', 'symmetry_mean', 'fractal_dimension_se')
plot(cancer[,cols], col = cancer$diagnosis)

# step7 ) 튜닝
vscore_tr <- c() ; vscore_te <- c()
for (i in 1:ncol(cancer[,-1])) {
m_rf <- randomForest(diagnosis ~., data = cancer_train, mtry = i)
pre_rf_tr <- predict(m_rf, newdata = cancer_train, type = 'class')
pre_rf_te <- predict(m_rf, newdata = cancer_test, type = 'class')
vscore_tr <- c(vscore_tr, sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100)
vscore_te <- c(vscore_te, sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100)
}
plot(1:30, vscore_tr, type = 'o', col = 'red')
lines(1:30, vscore_te, type = 'o' ,col = 'blue')

'아이티윌_데이터 분석 55기 > 문제풀이_통계 및 분석' 카테고리의 다른 글
| #15-2. 15일차 퀴즈에 대한 문제풀이 (0) | 2026.05.06 |
|---|---|
| #13-2. 13일차 퀴즈에 대한 문제풀이 (0) | 2026.04.29 |
| #7-2. 7일차 퀴즈에 대한 문제풀이 (0) | 2026.04.21 |
| #5-2. 5일차 퀴즈에 대한 문제풀이 (0) | 2026.04.17 |
| #4-2. 4일차 퀴즈에 대한 문제풀이 (0) | 2026.04.16 |