아래 TDL은 학습한 내용의 중요한 개념들을 요약한 내용이자 To do List (다시 살펴보고 공부해야 할 리스트) 이기도하다. 작성한 개념들에 대해 이해를 하면 하나씩 지우고, 4번의 TDL이 끝나면 Review를 통해 한번 더 훑어 지우지 못했던 개념들을 한번씩 다시 봐보고 모두 익히는 것을 목표로 한다.
갑자기 생각난건데 내가 10대~20대 초반까지만 하더라도 절대 하기싫은 것, 잘못된 걸 알지만 평생 고칠 수 없던 것(고칠 생각 조차 없었다)이 몇 가지 있었다. 그리고 이것들을 내 인생에서 절대 할 일 없을 것이라고 생각했다. 내가 지금 코딩을 하면서 너무 웃기고 재밌는게 그런 것들을 지금 아무렇지 않게 하고 있다는 것이다.
먼저 나는 블로그 하는 것에 전혀 관심이 없었다. 27년동안 시도조차 해 본적 없고, 내 생각과 정보를 수고롭게 글로 작성하여 다른사람들과 공유한다는 것이 천성이 게으른 내게는 불가능 한 것 이었다. 일기도 삼일을 넘겨 본 적이 없다.(청소년기 글짓기 수업 악몽의 영향이 크다.) 처음 블로그를 시작했을 때(불과 40일 전)를 생각하보면 내가 꾸준히 잘 이어갈 수 있을까 걱정이 컸지만, 지금은 그런 생각 하나 들지 않는다. 벌써 블로그가 3개다.
항상 말하지만 사람은 적응의 동물... 하다보면 하게 된다. 이십대 중반을 넘겨 깨닫게 된 사실이다. 그 전 까지는 '하기 싫은 건 죽어도 안해' 라는 중2병같은 가치관을 가지고 20대 초 중반까지 살아왔다. 이것들은 모두 내 게으름과 관련된 것 이었다. "나는 아침형 인간이 아니라 아침이 너무 힘들고 밤이 좋아" 같은 생각이라던지 꾸준히 무엇을 하지 못한다라던지.(모두 시작은 장대했지만 끝은 흐물흐물 했다)
하고싶은 건 꼭 해야했고 하기싫은 건 절대 안했던 내가 바뀌게 된 가장 큰 터닝 포인트가 아마 작년 아일랜드 에서의 생활인 것 같다. 사실 이것 뿐만 아니라 내 인생과 가치관이 많이 변했다. 27년동안 아침형 인간인 적이 단 한 순간(유년기부터 게으름)도 없는데 지금 매일 아침 일찍 독서실로 출근한다. (아직 힘들지만 목표는 새벽출근이다ㅋㅋ)
아 그런데 ..하고싶은 건 꼭 해야하는 성격은 바뀌지 않았다...
어쨌든 내게 터닝포인트는 아일랜드였지만, 실제로 변화를 가능하게 해준 것은 DS가 되고싶은 목표라고 생각한다. 그렇게 절대 안할 거라고 했던 것들이, 절대 바뀌지 못할 것이라고 생각했던 것들이, 지금 너무 즐겁고 삶을 살아가는 원동력이 되었다. 인생 알다가도 모르겠다.
Note 2
결정트리모델의 단점
: 한 개의 트리만 사용하기 때문에 한 node에서 생긴 error가 하부 node에도 영향을 주고, 트리의 깊이에 따라 과적합이 생긴다. 이러한 문제는 앙상블 모델인 랜덤포레스트에서 해결 가능하다.
랜덤포레스트(Random Forest)
: 결정트리를 기준모델로 사용하는 앙상블 기법
앙상블 기법
: 한 종류 데이터로 여러 머신러닝 학습모델(기본모델)을 만들어 그 모델들의 예측결과를 다수결이나 평균을 내어 예측 하는 방법
Bootstrapped data(sample)
: 오리지널 데이터에서 추출한 몇개의 변수들을 복원추출한 데이터. 그리고 여러개 만들면 bootstrap data set가 된다. 이 데이터세트는 표본의 63.2% (3분의2)의 샘플을 갖게 된다.
배깅(bagging)
: bootstrapping the data + using the aggregate to decision
Aggregation (합치다)
bootstrap data set 으로 만들어진 기본모델들을 합치는 과정을 Aggregation 이라고 한다. 회귀문제는 기본모델을 평균으로 결과를 내고, 분류문제는 최빈도로 예측한다.
Out of bag data(sample)
: 오리지널 데이터 - bagging
= bagging에 포함되지 않은 original data항목 (36.8%, 3분의1정도)
pipe.named_steps['randomforestclassifier'].oob_score_
랜덤포레스트 특성
: 무작위 선택
기본모델 트리를 만드는 방법은 일반 결정트리 알고리즘과 한가지 다른 점이 있다. 결정트리에서 분할을 위한 특성을 선택할 때, 모든 특성(n개)을 고려해서 최적의 특성을 고르고 분할하였지만, 랜덤포레스트에서는 특성 n개 중 일부분 특성을 선택하고 그 일부분 특성에서 최적의 특성을 찾아내 분할한다. 이때 이 일부분(k개)는 일반적으로 log2n을 사용한다.
k개 뽑은 boot strap set : training sets
n-k 뽑지 않은 항목 : test sets (=obb sets)
순서형 인코딩 (ordinal encoding)
from category_encoders import OrdinalEncoder
enc = OrdinalEncoder()
enc.fit(X)
enc.trainsform(X)
enc.category_mapping
pipe_ord = make_pipeline(OrdinalEncoder(),SimpleImputer(),RandomForestClassifier(random_state=10, n_jobs=-1, oob_score=True))
pipe_ord.fit(X_train, y_train)
print('검증 정확도', pipe_ord.score(X_val, y_val))
트리구조에서 원핫인코딩을 사용하면 안되는 이유
ordinal encoding vs onehot encoding
순서형 인코딩 주의할 점
: 범주들을 순서가 있는 숫자형으로 바꾸면 원래 그 범주에 없던 순서정보가 생긴다. 그래서 범주들 간에 분명한 순위가 있을 때 그 연관성에 맞게 숫자를 정해주는 것이 좋다. 정확한 범주의 순위를 알고 있다면, mapping parameter를 사용해 지정가능 하다.
트리앙상블모델이 결정트리모델보다 과적합을 피할 수 있는 이유
랜덤 포레스트 의사코드(Pseudo code)