Study/class note

머신러닝 / 회귀트리

chanzae 2022. 2. 15. 16:56

60 회귀트리 이론

수치를 예측하는 트리(Tree)

여기서 트리(tree)란 의사결정트리에서의 트리를 말하는 것

그런데 5장에서 의사결정트리 배울대는 의사결정트리로 분류를 했었고, 수치예측을 하지는 않음.

 

회귀트리 <----- 회귀분석 + 의사결정트리의 장점

                                      ㄴ독립변수들이 많거나 독립변수간의 매우 복잡하고 비선형적인 관계를 가질때 유용

 

목표가 수치예측이고 컬럼갯수(독립변수)가 몇 개 안되면?  -> 회귀분석

목표가 수치예측이고 컬럼갯수(독립변수)가 많으면 ? -> 회귀트리 또는 모델트리

 

                         [의사결정트리 그림]                                                        [회귀트리 그림]

 

회귀트리에서 사용하는 수학식 => SDR(표준편차축소)

 

예제1. 책 292페이지의 중간에 나오는 그림인 원본 데이터를 A속성으로 나누는게 나은지 B속성으로 나누는게 더 나은지 SDR을 구해서 알아내시오.( 어떤게 더 균일하게 나눈 것인지 확인하라는 것)

#1. 원본데이터 생성

#2. 원본데이터 A속성으로 나누었을 때의 데이터

#3. 원본데이터 B속성으로 나누었을 때의 데이터

#4. A속성으로 나누었을 때의 SDR(표준편차축소)값

#5. B속성으로 나누었을 때의 SDR값

#6. 둘 중에 SDR이 높은 것으로 분류

#7. B속성으로 분류한 원본 데이터 두 영역의 평균값을 각각 구해서 등급 예측

#1. 원본데이터 생성
tee <- c(1,1,1,2,2,3,4,5,5,6,6,7,7,7,7)
tee

#2. 원본데이터 A속성으로 나누었을 때의 데이터
at1 <- c(1,1,1,2,2,3,4,5,5)
at2 <- c(6,6,7,7,7,7)

#3. 원본데이터 B속성으로 나누었을 때의 데이터
bt1 <- c(1,1,1,2,2,3,4)
bt2 <- c(5,5,6,6,7,7,7,7)

#4. A속성으로 나누었을 때의 SDR(표준편차축소)값
sdr_a <-  sd(tee) - ( length(at1) / length(tee) * sd(at1) + length(at2) / length(tee) * sd(at2) )


#5. B속성으로 나누었을 때의 SDR값
sdr_b <-  sd(tee) - ( length(bt1) / length(tee) * sd(bt1) + length(bt2) / length(tee) * sd(bt2) )

#6. 둘 중에 SDR이 높은 것으로 분류
sdr_a  # 1.202815
sdr_b  # 1.392751

#7. B속성으로 분류한 원본 데이터 두 영역의 평균값을 각각 구해서 등급 예측
mean(bt1)  #2
mean(bt2)  #6.25

x값(독립변수들, 속성)을 고려하지 않고 y값(종속변수, 수치)만 가지고 데이터를 분할 하는데 표준편차 축소값이 가장 높은 값을 기준으로 y값을 분할하고 

 

A B y
a d 2
a d 5
b d 2
b c 1
b c 3
b c 4
a c 2
b d 1
b d 7

A 속성 :

a <- c(2,5,2)

b <- c(2,1,3,4,1,7)

B속성:

c<- c(2,5,2,1,7)

d<- c(1,3,4,2)

 

 

문제321. (오늘의 마지막 문제) 자동화 코드에 문제320번의 우주 왕복선 다중회귀분석 전체코드를 추가하시오.

multiple = '''
#1. 데이터 로드
import pandas as pd
 
cha = pd.read_csv("c:\\\data\\\challenger.csv")
cha.head()
cha.shape  #(23, 4)
 
#2. 결측치 확인
cha.isnull().sum()  # 결측치 없음
 
#3. 상관관계 확인
cha.corr() 
 
# 이미지로 상관관계 확인하고 싶은 경우
# import pandas as pd
# import seaborn as sns
# import matplotlib.pyplot as plt
 
# sns.heatmap(cha.corr(), annot = True, cmap = 'GnBu', linewidths = 0.2)  
# fig = plt.gcf() # fig를 지정하고 나서
# fig.set_size_inches(10,8) # 그래프의 사이즈 조절
# plt.show()
 
#4. 다중회귀모델을 생성
import statsmodels.formula.api as smf
 
model = smf.ols('distress_ct ~ temperature + field_check_pressure + flight_num', data = cha)
 
#5. 모델 훈련
result = model.fit()
 
#6. 다중공선성 문제 확인
from statsmodels.stats.outliers_influence import variance_inflation_factor
 
model.exog_names # 컬럼명 확인
 
for i in range(1,len(model.exog_names)):
    print(model.exog_names[i], variance_inflation_factor(model.exog, i))
    
#7. 다중회귀모델 결과 분석
result.summary()
 
# 회귀계수
print(result.params)
'''

 

반응형