15wk-fin

Author

최규빈

Published

December 21, 2023

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import sklearn.metrics
  1. 의사결정나무의 수동구현은 위에서 제시된 모듈 (numpy, pandas, sklearn.metrics, matplotlib, seaborn) 만을 사용해야하며 이외의 모듈을 사용할 경우 0점 처리함.
  2. True/False를 판단하는 문제는 답만 써도 무방함. (이유를 써도 상관없음)
  3. Treu/False의 판단 문제는 모두 맞출 경우만 정답으로 인정함. 다만 틀린이유가 사소하다고 판단할경우 감점없이 만점처리함.

1. 의사결정나무의 수동구현 (70점)

df_train = pd.read_csv('https://raw.githubusercontent.com/guebin/MP2023/master/posts/height_train.csv')
df_train
weight sex height
0 NaN male 164.227738
1 NaN male 165.798660
2 75.219015 male 165.528672
3 NaN male 163.706442
4 81.476750 male 165.501403
... ... ... ...
275 49.308558 female 148.587771
276 NaN male 164.822474
277 NaN male 163.907671
278 NaN male 161.674476
279 53.714772 female 146.775975

280 rows × 3 columns

(1) df_train에서 “sex”,“weight”를 설명변수로 “height”을 반응변수로 설정하라. 결측치가 있을 경우 결측값에 일괄적으로 -99로 채워넣어라.

힌트: 결측치를 처리하기 위해 아래의 코드를 관찰하라.

df_toy = pd.DataFrame({'X':[1,2,np.nan,np.nan,5],'y':[3,4,5,1,2]})
df_toy
X y
0 1.0 3
1 2.0 4
2 NaN 5
3 NaN 1
4 5.0 2
df_toy.fillna(-99)
X y
0 1.0 3
1 2.0 4
2 -99.0 5
3 -99.0 1
4 5.0 2

(2) height열의 평균으로 height의 값을 추정하라. 추정값을 yhat에 저장하라. sklearn.metrics.r2_score()을 이용하여 r2_score를 계산하라.

hint: 0이 나와야 한다.

(3) 아래를 계산하라.

  • r = y - yhat

여기에서 yhat(2)의 결과로 얻어진 적합값을 의미한다. 이제 r에 Weight를 기준으로 의사결정나무를 적용하여 아래와 같은 분할을 만들어라.

  • X['weight'] < c
  • X['weight'] >= c

sklearn.metrics.r2_score()를 이용하여 최적의 \(c\)값을 구하여라.

참고

아래의 구간을 적당히 등분하여 구할 것. 너무 세밀하게 등분하지 않아도 무방함.

(X['weight'].min(), X['weight'].max())

(4) (3)의 결과로 얻어진 아래의 분할을 고려하자.

X['weight'] >= c

이 분할에서 depth=2 로 나무를 성장하고자 한다. 성장이가능한가? 성장이 가능하다면 이때 나무를 성장시키기 위한 변수로 weigth와 sex중 무엇이 적절한가? 왜 그렇다고 생각하는가?

(5) (3)의 결과로 얻어진 아래의 분할을 고려하자.

X['weight'] < c

이 분할에서 depth=2 로 나무를 성장하고자 한다. 성장이가능한가? 성장이 가능하다면 이때 나무를 성장시키기 위한 변수로 weigth와 sex중 무엇이 적절한가? 왜 그렇다고 생각하는가?

(6) (3)-(5)의 결과를 이용하여 depth=2인 의사결정나무에 의한 r의 적합값을 구하여라. 이를 이용하여 yhat을 update하라. 이때 학습률은 0.1로 설정하고 업데이트된 결과를 yhat2로 저장하라. 그리고sklearn.metrics.r2_score()을 이용하여 yyhat2r2_score를 계산하라.

힌트: 아래의 알고리즘이 동치임을 이용하라.

  • yhat2 \(\leftarrow\) yhat + 학습률 \(\times\) rhat
  • r2 \(\leftarrow\) r - 학습률 \(\times\) rhat, where r2 = y - yhat2

(7) (6)에서 학습률이 0.5일 경우 yyhat2r2_score를 계산하라.

2. 다음을 읽고 참거짓을 판단하라. (30점)

(1) 의사결정나무에서 max_depth의 설정값이 커질수록 오버피팅의 위험이 있다.

(2) 배깅의 설명변수중 일부를 drop 하며 나무를 성장시킨다.

(3) 랜덤포레스트는 나무가지를 랜덤으로 성장시키기도 하고 파괴시키기도 한다.

(4) 부스팅은 여러가지 의사결정나무의 적합값을 평균내는 방식으로 최종예측을 한다.

(5) Accuracy는 분류문제에서 언제나 가장 합리적인 평가지표이다.

(6) 모듈49의 아래그림은 “sex == ‘male’” 일 경우 “sex=‘female’” 일때보다 항상(=모든 관측치에 대하여) 키의 예측값을 +2.1 만큼 보정해야 한다는 것을 의미한다.

(7) 모듈54에서 제시된 아래의 그림은 사실 전혀 고려할 필요가 없다.

왜냐하면 Exercise는 범주형, Weight_Loss는 연속형이므로 correlation값은 의미가 없기 때문이다.

(8) 시계열분석에서 static_feature란 이미 알고있는 미래의 시계열자료를 의미한다.

(9) 모듈59에서 소개된 자전거대여자료와 같이 시간특징이 포함된 자료는 언제나 (과거를 기반으로 미래를 예측하는) 시계열분석을 하는 것이 올바르다.

(10) 모듈60에서 소개된 하이퍼파라메터 설정법을 이용하면 때때로 모형의 적합도를 높일 수 있다.