머신러닝 / 회귀트리
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)
'''