You are on page 1of 12

Homework #3

1. 다음의 그림을 보고 질문에 답하시오.


1) 부모 노드와 자식 노드의 entropy 와 impurity, 그리고 gain ratio 를
구하시오. Impurity 는 entropy 를 이용하여 구하시오.

Parent Node: Entropy = -(14/20)× log 2(14/20)-(6/20)× log 2(6/20)=0.881


Node1: -(10/11)× log 2(10/11) -(1/11)× log 2(1/11)= 0.4395

Node2: -(4/9)× log 2(4/9) -(5/9)× log 2(5/9)=0.9911


Information Gain: 0.881 – {(11/20)×0.4395+(9/20)×0.9911}=0.1933
11 11 9 9
SplitINFO: -( )× log2 ( ) -( ) × log2 ( ) =0.9928
20 20 20 20
Information Gain 0.1933
Gain Ratio= = =0.1947
SplitINFO 0.9928

2) 범주형 자료 (categorical data)의 entropy 와 decision tree 에서 노드 분할


후의 impurity 를 구하는 R 코드를 작성하시오. 이 때 entropy 를 사용하고,
입력 값은 전체 레코드의 수 (n)와 서로 다른 클래스에 분포하는 레코드의
개수를 이용하고 entropy 값을 출력하는 함수를 작성하시오. Impurity 를
구하는 함수의 입력은 list 를 이용하여 분할된 각 노드의 레코드 수와 각
클래스에 속하는 레코드의 개수를 입력하도록 하고 impurity 를 출력하는
코드를 작성하시오 (이 문제에서는 두 개의 클래스-binary classification-
만을 가지는 상황을 고려함). 위 그림의 예제를 이용하여 함수가 올바로
작동하는지 검증하고 그 결과를 복사하여 제시하시오.
impu<-function(p,q){

node<-list("N1"=p, "N2"=q)
Impurity_1<-c("Node1_impurity"=

{-(node$N1[1])/sum(node$N1)}*log((node$N1[1])/
sum(node$N1),base=2)+
{-(node$N1[2])/sum(node$N1)}*log((node$N1[2])/sum(node$N1),base=2
))

Impurity_2<- c("Node2_impurity"=
{-(node$N2[1])/sum(node$N2)}*log((node$N2[1])/
sum(node$N2),base=2)+
{-(node$N2[2])/sum(node$N2)}*log((node$N2[2])/sum(node$N2),base=2
))
print(Impurity_1); print(Impurity_2)

a<-c(10,1);b<-c(4,5)
impu(a,b)

Node1_impurity
0.439497

Node2_impurity
0.9910761

3) Entropy 를 이용하여 Gain Ratio 를 계산하는 함수(범주형 자료만을


취급하는)를 작성하시오. 입력은 위의 그림의 수치를 이용하시오. (범주형
자료의 원소는 table, unique 함수를 이용하여 추출 가능)

gainratio<-function(p,q){
node_a<-list("N1"=p, "N2"=q)

Parent_node<-(-sum(node_a$N1[1]+node_a$N2[1])/
sum(node_a$N1+node_a$N2))*log(sum(node_a$N1[1]+node_a$N2[1])/
sum(node_a$N1+node_a$N2),base=2)+(-
sum(node_a$N1[2]+node_a$N2[2])/
sum(node_a$N1+node_a$N2))*log(sum(node_a$N1[2]+node_a$N2[2])/
sum(node_a$N1+node_a$N2),base=2)
Impurity_n1<-c({-(node_a$N1[1])/
sum(node_a$N1)}*log((node_a$N1[1])/sum(node_a$N1),base=2)+{-
(node_a$N1[2])/sum(node_a$N1)}*log((node_a$N1[2])/sum(node_a
$N1),base=2))
Impurity_n2<-c({-(node_a$N2[1])/
sum(node_a$N2)}*log((node_a$N2[1])/sum(node_a$N2),base=2)+{-
(node_a$N2[2])/sum(node_a$N2)}*log((node_a$N2[2])/
sum(node_a$N2),base=2))
Information_Gain<-Parent_node-(sum(node_a$N1)/
sum(node_a$N1+node_a$N2))*Impurity_n1-(sum(node_a$N2)/
sum(node_a$N1+node_a $N2))*Impurity_n2

SplitINFO<-(-sum(node_a$N1)/
sum(node_a$N1+node_a$N2))*log(sum(node_a$N1)/
sum(node_a$N1+node_a$N2),base=2)+(-sum(node_a$N2)/
sum(node_a$N1+node_a$N2))*log(sum(node_a$N2)/sum(node_a$N1+
node_a$N2),base=2)
Gain_ratio<- c("Gain_ratio"=Information_Gain/SplitINFO)

print(Gain_ratio)
}

a<-c(10,1);b<-c(4,5)
gainratio(a,b)

Gain_ratio 0.1949923

2. 다음의 표를 이용하여 문제에 답하시오.

play outlook temperature humidity windy


no sunny hot high false
no sunny hot high true
yes overcast hot high false
yes rainy mild high false
yes rainy cool normal false
no rainy cool normal true
yes overcast cool normal true
no sunny mild high false
yes sunny cool normal false
yes rainy mild normal false
yes sunny mild normal true
yes overcast mild high true
yes overcast hot normal false
no rainy mild high true
*
이 표는 4 가지 변수에 의해서 테니스 경기(=play)를 할 수 있는지를 예측하는 문제에 관한 자료를
나타내고 있다.

1) play 변수에서 발생가능한 값에 대한 사전확률은?


P(play=yes)=9/14, P(play=no)=5/14

2) 위의 표를 바탕으로 다음의 사후 확률을 구하시오. (풀이과정을 쓰시오)

P(play=no | outlook=sunny, temperature=mild, humidity=normal, windy


=true)

P(play=yes | outlook=sunny, temperature=mild, humidity=normal,


windy =true)

P(outlook=sunny, temperature=mild, humidity=normal, windy =true |


play=no)= (3/5)*(2/5)*(1/5)*(3/5)

P(play=no)* P(outlook=sunny, temperature=mild, humidity=normal,


windy =true | play=no)=(5/14)*(3/5)*(2/5)*(1/5)*(3/5)=0.01029

P(play=yes)=9/14

P(outlook=sunny, temperature=mild, humidity=normal, windy =true |


play=yes)=(2/9)*(4/9)*(6/9)*(3/9)

P(play=yes)* P(outlook=sunny, temperature=mild, humidity=normal,


windy =true | play=yes)=(9/14)*(2/9)*(4/9)*(6/9)*(3/9)=0.01411

P(play=no | outlook=sunny, temperature=mild, humidity=normal, windy


=true)
P(play=yes | outlook=sunny, temperature=mild, humidity=normal,
windy =true)

P(outlook=sunny, temperature=mild, humidity=normal, windy =true)=


P(play=yes)* P(outlook=sunny, temperature=mild, humidity=normal,
windy =true | play=yes) + P(play=no)* P(outlook=sunny,
temperature=mild, humidity=normal, windy =true | play=no)

P(play=no | outlook=sunny, temperature=mild, humidity=normal, windy


=true) = (0.01029)/(0.01029+0.01411) = 0.4217 = 42.17%
P(play=yes | outlook=sunny, temperature=mild, humidity=normal,
windy =true) = (0.01411)/(0.01029+0.01411)=0.5783 = 57.83%.

3) 위의 표를 복사하여 txt 파일로 저장하고 그 파일을 data frame 으로 읽은


후 그 변수에서 발생할 수 있는 값을 입력하면 그 값이 나올 수 있는
확률을 돌려주는 R 함수를 작성하고 실제 값을 대입하여 결과가 나오는
출력 화면을 제출하시오. (즉 어느 변수의 레코드와 class vector 를
입력으로 하면 class-specific probability 를 출력하는 함수를 작성)
tennisr<-function(p,q) {

if(p=="yes"){
if(q=="sunny"){

print(nrow(tennis[tennis$outlook=="sunny"&tennis$play=="yes",])/
nrow(tennis[tennis$play=="yes",]))

}
if(q=="overcast"){

print(nrow(tennis[tennis$outlook=="overcast"&tennis$play=="yes",])/
nrow(tennis[tennis$play=="yes",]))

}
if(q=="rainy"){

print(nrow(tennis[tennis$outlook=="rainy"&tennis$play=="yes",])/
nrow(tennis[tennis$play=="yes",]))

}
if(q=="hot"){
print(nrow(tennis[tennis$temperature=="hot"&tennis$play=="yes",])/
nrow(tennis[tennis$play=="yes",]))
}

if(q=="mild"){
print(nrow(tennis[tennis$temperature=="mild"&tennis$play=="yes",])/
nrow(tennis[tennis$play=="yes",]))
}

if(q=="cold"){
print(nrow(tennis[tennis$temperature=="cold"&tennis$play=="yes",])/
nrow(tennis[tennis$play=="yes",]))
}

if(q=="high"){
print(nrow(tennis[tennis$humidity=="high"&tennis$play=="yes",])/
nrow(tennis[tennis$play=="yes",]))
}

if(q=="normal"){
print(nrow(tennis[tennis$humidity=="normal"&tennis$play=="yes",])/
nrow(tennis[tennis$play=="yes",]))
}
if(q=="true"){
print(nrow(tennis[tennis$windy=="true"&tennis$play=="yes",])/
nrow(tennis[tennis$play=="yes",]))
}

if(q=="false"){
print(nrow(tennis[tennis$windy=="false"&tennis$play=="yes",])/
nrow(tennis[tennis$play=="yes",]))
}

}
if(p=="no"){

if(q=="sunny"){
print(nrow(tennis[tennis$outlook=="sunny"&tennis$play=="no",])/
nrow(tennis[tennis$play=="no",]))

}
if(q=="overcast"){

print(nrow(tennis[tennis$outlook=="overcast"&tennis$play=="no",])/
nrow(tennis[tennis$play=="no",]))

}
if(q=="rainy"){

print(nrow(tennis[tennis$outlook=="rainy"&tennis$play=="no",])/
nrow(tennis[tennis$play=="no",]))

}
if(q=="hot"){

print(nrow(tennis[tennis$temperature=="hot"&tennis$play=="no",])/
nrow(tennis[tennis$play=="no",]))

}
if(q=="mild"){

print(nrow(tennis[tennis$temperature=="mild"&tennis$play=="no",])/
nrow(tennis[tennis$play=="no",]))

}
if(q=="cold"){
print(nrow(tennis[tennis$temperature=="cold"&tennis$play=="no",])/
nrow(tennis[tennis$play=="no",]))

}
if(q=="high"){

print(nrow(tennis[tennis$humidity=="high"&tennis$play=="no",])/
nrow(tennis[tennis$play=="no",]))

}
if(q=="normal"){

print(nrow(tennis[tennis$humidity=="normal"&tennis$play=="no",])/
nrow(tennis[tennis$play=="no",]))

}
if(q=="true"){
print(nrow(tennis[tennis$windy=="true"&tennis$play=="no",])/
nrow(tennis[tennis$play=="no",]))
}

if(q=="false"){
print(nrow(tennis[tennis$windy=="false"&tennis$play=="no",])/
nrow(tennis[tennis$play=="no",]))
}

}
}

tennisr("yes","true")
[1] 0.3333333

4) 위의 자료와 같은 형태의 벡터를 입력하였을 때 (위의 4 가지 변수에 대한


값을 가지는 벡터) 사후 확률을 돌려주는 함수를 작성하시오.
postP <- function(x) {

priorP_Y <- nrow(dat[dat$play == 'yes', ])/nrow(dat)

priorP_N <- nrow(dat[dat$play == 'no', ])/nrow(dat)

postP_Y <- priorP_Y

postP_N <- priorP_N

for (i in 1:4) {

postP_Y <- postP_Y*likelihood(x[i], "yes")

postP_N <- postP_N*likelihood(x[i], "no")

print("P(Y)=")

print(postP_Y)

print("P(N)=")

print(postP_N)

}
3. 수업시간에 사용한 diabetes 자료를 이용하여 다음의 문제를 해결하시오.

1) e1071 package 를 이용하여 diabetes 의 naïve Bayes classifier 를


구축하고 (default parameter 사용) 이 때 전체 자료의 70%를 training
data 로 사용하고 30%를 test data 로 사용하는 R 코드를 작성하시오.
Training data 를 이용하여 classifier 를 구축하고 test data 를 적용하여 그
결과를 confusion matrix 로 표현하시오.
2) 10-fold cross validation 을 구현하는 R 코드를 작성하시오. (10-fold cross
validation 은 전체 자료를 10 개로 나누고 1 개는 test data, 나머지는
training data 로 사용하는 방식으로, 모든 자료가 test data 로 사용되어야
함. 결과는 10 개의 test data 에서 나온 예측정확도(prediction accuracy)의
평균으로 제시할 것)

4. 다음의 분할표를 이용하여 두 가지 서로 다른 분할에 대한 gain ratio 를


구하고 비교 하시오 (어느 분할표의 gain ratio 가 더 큰가? Entropy 를
이용하시오). 이 분할표는 동일한 연속형 변수자료를 두 개의 노드와 세 개의
노드로 나눈 것을 의미한다. (C1 과 C2 는 class label)

Entropy(N1) = −( 139 ) log ( 139 )−( 134 ) log ( 134 )=0.890


2 2

Entropy(N2) = −( ) log ( )−( ) log ( )=0.59 2


1 1 6 6
2 2
7 7 7 7

Information Gain =

Entropy ( P ) −
{( )
13
20 ( )
× Entropy ( N 1 )+
7
20} {( )
× Entropy ( N 2 ) =1−
13
20 ( )
× 0.890+
7
20 }
× 0.592 =0.214

SplitINFO = −( ) log ( )−( ) log ( )=0.934


13 13 7 7
2 2
20 20 20 20
GainRatio = Information Gain/SplitINFO = 0.214/0.934 = 0.229

Entropy(N1) = −( 25 ) log ( 25 )−( 35 ) log ( 35 )=0.971


2 2

Entropy(N2) = −( ) log ( )−( ) log ( )=0.722


8 8 2 2
2 2
10 10 10 10

Entropy(N3) = −( ) log ( )−( ) log ( )=0


0 0 5 5
2 2
5 5 5 5

Information Gain =

Entropy ( P ) −
{( )
5
20 ( )
× Entropy ( N 1 )+
10
20 ( )
× Entropy ( N 2 ) +
5
20 } {( )
× Entropy ( N 3 ) =1−
5
20
×0.971+ (
SplitINFO = −( ) log ( )−( ) log ( )−( ) log ( )=1.5
5 5 10 10 5 5
2 2 2
20 20 20 20 20 20

GainRatio = Information Gain/SplitINFO = 0.396/1.5 = 0.264

B 의 Gain Raio 가 더 크다

5. 수업시간에 사용한 distance matrix 를 이용하여 hierarchical clustering 을


수행하는 R 코드를 작성하시오. (파워 포인트에 있는 distance matrix 를
복사하여 엑셀에 옮기고 그것을 txt 파일로 저장하여 R 에서 읽은 후 분석을
하는 코드를 작성. as.dist 함수를 참고하시오). 그리고 dendrogram 의 linkage
method 를 complete linkage 와 single linkage 그리고 average linkage 를
이용하여 그리도록 하고 그림을 결과로 제출하시오.
distance

p1 p2 p3 p4 p5 p6
p1 0.0000 0.2357 0.2219 0.3688 0.3421 0.2348

p2 0.2357 0.0000 0.1483 0.2042 0.1389 0.2540


p3 0.2219 0.1483 0.0000 0.1513 0.2843 0.1099

p4 0.3688 0.2042 0.1513 0.0000 0.2932 0.2216


p5 0.3421 0.1389 0.2843 0.2932 0.0000 0.3921

p6 0.2348 0.2540 0.1099 0.2216 0.3921 0.0000


distance1<-as.dist(distance)

distance1
p1 p2 p3 p4 p5

p2 0.2357
p3 0.2219 0.1483

p4 0.3688 0.2042 0.1513


p5 0.3421 0.1389 0.2843 0.2932

p6 0.2348 0.2540 0.1099 0.2216 0.3921

cresult<-hclust(distance1,method="complete")
plot(cresult, hang=-1)

sresult<-hclust(distance1,method="single")

plot(sresult, hang=-1)
aresult<-hclust(distance1,method="average")

plot(aresult, hang=-1)

You might also like