코드스테이츠 부트캠프 #일차

S2-Week 2: Tree Based Model - Decision Trees

 

 

Decision Trees

 

키워드

  • category_encoders
  • graphviz
  • numpy
  • pandas
  • scikit-learn
  • 파이프라인(pipelines)
  • 결정트리(decision tree)
  • 특성 중요도(feature importances)

  • 사이킷런 파이프라인(pipelines) 을 이해하고 활용 할 수 있습니다.
  • 사이킷런 결정트리(decision tree) 를 사용할 수 있습니다.
  • 결정트리의 특성 중요도(feature importances) 를 활용할 수 있습니다.
  • 결정트리 모델의 장점을 이해하고 선형회귀모델과 비교할 수 있습니다.

 

카디널리티 

-컬럼 개수(=차수), 컬럼 안에 있는 데이터 개수

사이킷럿 파이프라인(Pipelines)

-모델을 만들 때 진행했던 결측치 처리, 스케일링, 모델학습 등 머신러닝 프로세스에서 중복 코드를 최소화하여 연결을 쉽게할 수 있다.

-똑같은 작업을 하면 코드가 간결해지고 가독성이 증가한다.

여러 ML 모델을 같은 전처리 프로세스에 연결시킬 수 있다.

그리드서치(grid search)를 통해 여러 하이퍼파라미터를 쉽게 연결할 수 있다.'

 

1
2
3
4
5
6
7
8
9
10
11
12
#파이프라인 z
pipe = make_pipeline(
    OneHotEncoder(), 
    SimpleImputer(), 
    StandardScaler(), 
    LogisticRegression(n_jobs=-1)
)
pipe.fit(X_train, y_train)
 
print('검증세트 정확도', pipe.score(X_val, y_val))
 
y_pred = pipe.predict(X_test)
cs

 

Decision Tree (결정트리)

-분류와 회귀문제에 모구 적용 가능

-데이터를 분할해 가는 알고리즘

-분류 과정은 새로운 데이터가 특정 말단 노드에 속한다는 정보를 확인한 뒤 말단노드의 빈도가 가장 높은 범주로  데이터를 분류한다.

-분류과정을 직관적으로 확인이 가능하다.

entropy

얼마만큼의 정보를 담고 있는가'를 엔트로피(entropy)라고 한다.

엔트로피가 클 수록 데이터 정보가 잘 분포되어 있기 때문에 좋은 지표라고 예상할 수 있다.

 

 

#결정트리 코드

1
2
3
4
5
6
7
8
9
10
11
from sklearn.tree import DecisionTreeClassifier
 
pipe = make_pipeline(
    OneHotEncoder(use_cat_names=True), 
    SimpleImputer(), 
    DecisionTreeClassifier(random_state=2, criterion='entropy')
)
 
pipe.fit(X_train, y_train)
print('훈련 정확도: ', pipe.score(X_train, y_train))
print('검증 정확도: ', pipe.score(X_val, y_val))

훈련 정확도: 0.9908667674880646
검증 정확도: 0.7562566718064286

y_val.value_counts(normalize=True)
0 0.761001
1 0.238999


확실한 과적합임을 확인할 수 있습니다

cs

 

트리의 복잡를 줄여주는 하이어파라미터

  • min_samples_split
  • min_samples_leaf
  • max_depth

*결정트리의 비용함수를 최소화 하도록 분할하는 것이 트리모델 학습이다.

비용함수 중에서 지니불순도와 엔트로피가 있다

 

-지니불순도(Gini impurity) : 샘플이 한 쪽이 더 많은 비율을 차지할 수록 불순도가 낮은 것이다.

ex) 45%, 55%인 샘플은 불순도가 높은 것이다.

-분할된 데이터 세트들의 불순도가 작을수록 정보 획득량은 증가한다.

-생성된 데이터 세트의 크기에 따라 가중치가 적용된 정보 획득량(Weighted Information Gain)을 계산해볼 수 있을 거다.

 

 

 

EDA 및 모델 만드는데 편리하게 쓸 코드 복붙

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#데이터 셋 확인
train.head().T
 
#데이터 타입 확인
train.dtypes
 
#훈련데이터를 훈련/검증 세트로 나누겠습니다
train, val = train_test_split(train, train_size=0.80, test_size=0.20
                              stratify=train[target], random_state=2)
 
#데이터 확인하기
from pandas_profiling import ProfileReport
profile = ProfileReport(train, minimal=True).to_notebook_iframe()
 
#실수형 타입 확인
from pandas_profiling import ProfileReport
profile = ProfileReport(train, minimal=True).to_notebook_iframe()
 
#중복이 있는지 확인
train.T.duplicated()
 
*결측치, 중복된 특성 확인한다. 데이터 클리닝이 필요하면 작업을 한다.
 
#너무 많은 범주를 가지는 카테고리 특성들이 있는지 카디널리티(cardinality)를 확인
train.describe(exclude='number')
 
train.describe(exclude='number').T.sort_values(by='unique')
 
#특성을 엔지니어링 해보겠습니다. 이부분에서 여러분의 아이디어를 여러가지 실험해 볼 수 있습니다.
def engineer(df):
     return df
train = engineer(train)
val = engineer(val)
test = engineer(test)
 
 
#데이터를 타겟과 특성을 분리
features = train.drop(columns=[target]).columns
 
# 훈련/검증/테스트 데이터를 특성과 타겟으로 분리합니다
X_train = train[features]
y_train = train[target]
X_val = val[features]
y_val = val[target]
X_test = test[features]
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
* 프로파일링 
 
#데이터에 대해서 잘 모르는 상황이니 Profiling을 사용하여 데이터리포트를 만들어 본다.
 
#라이브러리 먼저 설치해줘야함
!pip install -U pandas-profiling
 
#설치하고 난 후에 아래 코드를 실행
 
from pandas_profiling import ProfileReport
profile = ProfileReport(train, minimal=True).to_notebook_iframe()
cs

'개발 관련자료 > ML, DL' 카테고리의 다른 글

Confision Matrix  (0) 2021.05.05
Random Forests  (0) 2021.04.25
Ridge Regression  (0) 2021.04.24
Multiple Regression  (0) 2021.04.22
Simple Regression  (0) 2021.04.22

+ Recent posts