mushrooms.csv
1.17MB

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 규칙기반 알고리즘을 이용하여 식용버섯과 독버섯 분류하기 (oneR)
mushroom <- read.csv('c:/data/mushrooms.csv',header=T,stringsAsFactors = T)
train_cnt <- round( 0.75 * dim(mushroom)[1]) # 6093
 
# shuffle
set.seed(11)
train_index <- sample(1:dim(mushroom)[1], train_cnt, replace=F)
 
# train (75%) / test (25%)
mushroom_train <- mushroom[train_index,  ]
mushroom_test  <- mushroom[-train_index, ]
 
# oneR로 모델 생성
install.packages("OneR")
library(OneR)
 
model1 <- OneR(type~. ,  data=mushroom_train)
model1
summary(model1)
 
# 예측
result1 <- predict( model1, mushroom_test[   , -1] )
 
# 정확도
library(gmodels)
= CrossTable( mushroom_test[ , 1],  result1)
x$prop.tbl[1]+x$prop.tbl[4# 0.9862137
 
 
##########################################################
# 규칙기반 알고리즘을 이용하여 식용버섯과 독버섯 분류하기 (JRip)
# JRip로 모델 생성
install.packages("RWeka")
library(RWeka)
 
model2 <- JRip(type~ ., data=mushroom_train)
model2
 
summary(model2) # 작은 이원교차표가 하나 보임
 
# 예측
result2 <- predict( model2, mushroom_test[   , -1] )
 
# 정확도
library(gmodels)
<- CrossTable( mushroom_test[ , 1],  result2)  
x$prop.tbl[1]+x$prop.tbl[4# 1
 
cs

 

 

credit.csv
0.09MB

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 의사결정트리 알고리즘을 이용하여 은행 대출 채무 이행/불이행 여부 예측
credit = read.csv('c:/data/credit.csv',header=T,stringsAsFactors = T)
 
# 데이터 형태 확인
str(credit) # 수치형, 명목형 섞여있음
 
# 데이터 분류 (caret 사용)
# install.packages('caret')
library(caret)
set.seed(5)
intrain = createDataPartition(credit$default,p=0.9,list=F)
 
# train(90%) / test(10%)
credit_train = credit[intrain,]
credit_test = credit[-intrain,]
 
nrow(credit_train) # 900
nrow(credit_test) # 100
 
# 의사결정트리 모델 생성
library(C50)
credit_model = C5.0(default~.,data=credit_train,trials=24# 24 : 0.87
credit_result = predict(credit_model,credit_test[,-17])
 
# 이원 교차표로 결과 확인
library(gmodels)
= CrossTable(credit_test[,17],credit_result)
 
# install.packages('rpart')
# install.packages('rpart.plot')
library(rpart)
library(rpart.plot)
 
# 의사결정트리 시각화
rpartmod = rpart(default~., data=credit_train, method='class')
rpart.plot(rpartmod)
 
x$prop.tbl[1]+x$prop.tbl[4# 0.87
 
# 어떤 trial 값이 가장 정답률이 높은가?
temp = c()
num = c()
for (i in 1:100) {
  num = append(num,i)
  credit_model = C5.0(default~.,data=credit_train,trials=i)
  credit_result = predict(credit_model,credit_test[,-17])
  x = CrossTable(credit_test[,17],credit_result)
  g3 = x$prop.tbl[1]+x$prop.tbl[4]
  temp = append(temp,g3)
}
 
result = data.frame("trials"=num,"정확도"=temp)
 
library(plotly)
plot_ly(x=~result[,"trials"],y=~result[,"정확도"],type='scatter',mode='lines') %>%
  layout(xaxis=list(title="trials"),yaxis=list(title="정확도"))
cs

 

 

 

의사결정트리가 실제로 분류되는 모습

 

 

 

 

+) 호기심에 미친 나! 어떤 seed값과 trial값이 가장 좋은 결과를 만들어낼까? 2중 for 문 돌려보자!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 의사결정트리 알고리즘을 이용하여 은행 대출 채무 이행/불이행 여부 예측
credit = read.csv('c:/data/credit.csv',header=T,stringsAsFactors = T)
 
# 데이터 형태 확인
str(credit) # 수치형, 명목형 섞여있음
  
library(caret)
library(C50)
library(gmodels)
 
# 어떤 trial값과 seed값이 가장 정답률이 높은가?
temp = c()
num = c()
seed_num = c()
for (j in 5:6) {
  for (i in 1:100) {
    set.seed(j)
    intrain = createDataPartition(credit$default,p=0.9,list=F)
    
    # train(90%) / test(10%)
    credit_train = credit[intrain,]
    credit_test = credit[-intrain,]
  
    num = append(num,i)
    credit_model = C5.0(default~.,data=credit_train,trials=i)
    credit_result = predict(credit_model,credit_test[,-17])
    x = CrossTable(credit_test[,17],credit_result)
    g3 = x$prop.tbl[1]+x$prop.tbl[4]
    temp = append(temp,g3)
    seed_num = append(seed_num,j)
  }
}
 
# seed값과 trials에 따른 정확도를 보여주는 result라는 테이블을 만들어다.
result = data.frame("trials"=num,"seed"=seed_num,"정확도"=temp)
result
 
# 제일 좋은 조건 한번에 보기
result[result$정확도==max(result['정확도']),]
 
# 근데 lines 그래프로는 seed값을 어떻게 보여줘야 될 지 모르겠네 ^^
# 아는 분은 댓글로 좀 알려주세요 ^0^
library(plotly)
plot_ly(x=~result[,"trials"],y=~result[,"정확도"],type='scatter',mode='lines') %>%
  layout(xaxis=list(title="trials"),yaxis=list(title="정확도"))
cs

 

 

 

개판... set.seed(5) / trials = 24 인게 87%로 가장 낫다!

 

 

 

 

 

 

skin.csv
0.00MB

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 의사결정트리 알고리즘을 이용하여 화장품 구매 고객 예측하기
# skin 데이터 갖고 오기 (C50 쓰려면 컬럼명,데이터 모두 영어여야함)
skin <- read.csv("c:/data/skin.csv", header=T ,stringsAsFactors = TRUE)
str(skin)
 
nrow(skin) # 30
 
# TEST용 하나 제외
skin_real_test_cust <- skin[30, ]
skin_real_test_cust
 
# TEST용을 제외하고 새롭게 skin2 생성
skin2 <-  skin[ 1:29, ] 
nrow(skin2) # 29
 
skin2 <- skin2[ , -1# 고객번호 제외
 
# shuffle
set.seed(0)
skin2_shuffle <- skin2[sample(nrow(skin2)),]
 
train_num <-  round(0.7 * nrow(skin2_shuffle), 0# 20
 
# train(70%) / test(30%)
skin2_train <- skin2_shuffle[1:train_num,]  
skin2_test  <- skin2_shuffle[(train_num+1) : nrow(skin2_shuffle),] 
 
nrow(skin2_train)  # 20
nrow(skin2_test)   #  9 
 
# 의사결정트리 패키지 설치
# install.packages("C50")
library(C50)
 
# 의사결정트리는 trials와 seed로 정확도 조절
skin_model <- C5.0(cupon_react~.,data=skin2_train,trials=10,replace=T)
skin_model # skin 데이터는 데이터양이 너무 적어서 trials=1번밖에 못 도는 것 확인 가능
 
# 정답 / 예측값 확인
skin2_result <- predict(skin_model , skin2_test[  , -6])
<- data.frame(skin2_result,skin2_test[6])
table(x)
 
skin3_result <- predict(skin_model,skin_real_test_cust)
data.frame(skin3_result,skin_real_test_cust[7])
 
library(gmodels)
CrossTable( skin2_test[  , 6],  skin2_result )
 
per <- CrossTable( skin2_test[  , 6],  skin2_result )
per$prop.tbl[1]+per$prop.tbl[4# 0.777778
cs

 

 

 

 

 

 

flu.csv
0.00MB

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
flu_func <- function(){
  library(e1071)
  
  flu_insert <- read.csv("c:/data/flu.csv", header=T, stringsAsFactors=TRUE)
  
  # 대문자 변경
  flu_insert$headache = toupper(flu_insert$headache)
  
  # 환자 번호 제거
  flu <- flu_insert[-1]
  
  nrow(flu) # 8
  
  train <- flu[1:8,]
  
  model <- naiveBayes(flue~., data=train , laplace=0)
  model
  
  # 증상 입력받기 (대문자로 써야함)
  a <- readline(prompt = '오한이 있습니까?'# Y
  b <- readline(prompt = '콧물이 있습니까?'# N
  c <- readline(prompt = '두통이 있습니까?'# MILD
  d <- readline(prompt = '열이 있습니까?'# N
  
  # data frame으로 만들기
  test = data.frame(chills=a,runny_nose=b,headache=c,fever=d,stringsAsFactors = T)
  test
  result <- predict( model, test,type="raw"# type="raw" 로 하면 라벨 비율이 나옴
  # result[1]은 N일 확률, result[2]는 Y일 확률을 의미
  # type을 명시하지 않으면 확률이 50% 초과인 라벨을 출력
  
  return(paste('독감일 확률이',round(result[2]*100,digits=1),'% 입니다.'))
  # "독감일 확률이 24.5 % 입니다."
}
 
flu_func()
cs

 

 

 

 

 

 

 

 

movie.csv
0.00MB
movie_test.csv
0.00MB

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#1. 워킹 디렉토리 지정
setwd("c:\\data")
 
# 2. 라이브러리 선언
library(e1071)
 
# 3. 데이터 로드
movie <- read.csv("movie.csv", header=T, stringsAsFactors=TRUE)
str(movie) # factor로 변환되었는지 확인
nrow(movie) # 39
 
# 4. 컬럼명을 영어로 변경
View(movie)
colnames(movie) <- c("age","gender","job","marry","friend","m_type")
 
View(movie)
 
# 5. train(38) / test(1)
train <- movie[1:38,]
test <- movie[39,]
 
train
test
 
# 6. 나이브 베이즈로 학습
#                     훈련데이터       라벨
model <- naiveBayes(train[ ,1:5], train$m_type , laplace=0)
# +) 나이브 베이즈를 이렇게도 학습 시킬 수 있음
# model <- naiveBayes(m_type~.,data=train,laplace=0) # m_type~. : 예측하고자 하는 라벨
 
#7. 예측 결과
result <- predict(model, test[,1:5])
# 그냥 test 데이터만 줘도 m_type은 predict를 위한 학습 데이터에서 사용되지 않기 때문에 상관은 x
result
 
test2 <- data.frame(age='20대', gender='여', job='IT', marry='NO',friend='NO')
result <- predict(model, test2)
result # 로맨틱
 
test3 <- data.frame(age='20대', gender='남', job='학생', marry='NO',friend='NO')
result <- predict(model, test3)
result # 코미디
 
# 입력 받은 파일 예측하기
fname <- file.choose()
test4 <- read.csv(fname,header=T,stringsAsFactors=T)
# 컬럼명을 똑같이 해줘야 제대로 결과를 낼 수 있음 (따라서 순서 상관 x)
names(test4) <- c("age","gender","job",'marry','frined')
 
result <- predict(model,test4)
result # 스릴러
cs

 

 

 

 

+ Recent posts