ML

DAY 3 ( Decision Tree, Label/hyper parameter Encoding, Cross validation, GridSearchCV, 버섯 독/식용 예측 모델 실습 )

도키마 2024. 7. 3. 12:49

 

 

 

 

 

 

 

 

오늘의 노래 추천 🎻

 

 
Bang!
아티스트
AJR
앨범
OK ORCHESTRA
발매일
1970.01.01

 

오늘은 AJR 느낌 뭐... 아무튼 좋아요 할 말 없긴한데

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 


DAY 3 

 

 

 



 

 

 

 

 

 

 

 

 

 

 

 

 

 

[  Decision Tree  ]

sklearn.tree import

 

 

 

 

 

예/아니오 질문을 반복하여 학습

특정 기준에 따라 데이터를 구분

* 분류와 회귀에 모두 사용 가능

 

 

Decision Tree 의 의사 결정 방향 ㅡ> 불순도가 낮아지는 방향

 

 

 

 

 

[ 용어 정리 ]

 

Root Node, Decision Node, Leaf Node, depth, Sub TreeS

 

 

Root Node

 

 

 

 

 

 

ㅡ 불순도 측정 계수 ㅡ

 

Gini ( 지니 불순도 )

Entropy ( 엔트로피 )

 

 

 

 

 

ㅡ 주요 매개변수 (hyperparameter) ㅡ

 

주요 매개변수

 

 

criterion : 불순도 측정 방법 (gini, entropy)

max_depth : 트리의 최대 깊이

min_samples_split : 노드를 분할하기 위한 최소 샘플 수

min_samples_leaf : 리프 노드가 가져야할 최소 샘플 수

max_leaf_nodes : 리프 노드의 최대 개수

 

 

 

 

 

ㅡ 과대 적합 제어 ㅡ

 

 

과대 적합 제어

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[ Decision Tree 버섯 독/식용 판별 실습 ]

 

버섯의 특징을 활용해 독/식용 버섯 구분

Decision Tree 시각화 & 과대적합 속성 제어 ( hyper parameter tuning )

특징 선택

 

 



 

ㅡ data 불러오기 ㅡ

pd.read_csv

 

pd.read_csv

 

 

구글 드라이브에 마운팅 후 pd.read_csv 를 이용해 csv 데이터 불러오기

 



 

 

ㅡ 결측치 확인 ㅡ

info ()

 

info ()

 

info () 를 이용해 결측치 확인

 

 

 

 

ㅡ x, y로 데이터 분류 ㅡ

iloc

 

iloc

 

iloc

 

 

 

 

 

ㅡ 데이터 전처리 ( 원핫인코딩 ) ㅡ

One-hot Encoding

 

 

분류하고자 하는 범주만큼의 자릿수(컬럼)를 만들고

단 한개의 1과 나머지는 0으로 채우는 숫자화 방식

 

 

One-hot Encoding

 

pd.get_dummies(X)

 



 

ㅡ One-hot Encoding ㅡ

pd.get_dummies ()

 

pd.get_dummies ()

 

* One-hot Encoding 후 변경된 컬럼의 개수는 실행할 때마다 답에 따라 변경됨 (고정값이 아님)

 



 

데이터 전처리 ( 라벨 인코딩 )

Label Encoding

 

Label Encoding

 

x [ '컬럼명' ].map ( { 딕셔너리 형태의 맵핑 } )

레이블을 숫자로 mapping 함

 

map ()

 

x [ 'cap-shape' ] 의 라벨을 unique 로 알아보고

.map () 함수를 이용해 문자를 숫자로 치환한 mapping 값을 넣어줌

 

 

 

 

 

ㅡ 데이터 분할 ㅡ

train_test_split

 

train_test_split

 

 

 

 

 

ㅡ  Decision Tree 모델 생성 ㅡ

DecisionTreeClassifier

 

DecisionTreeClassifier

 

sklearn.tree 에서 DecisionTreeClassifier 를 import 후 모델 객체 생성

 

 

 

 

 

ㅡ 교차 검증 방식 ㅡ

Cross validation

 

 

train 과정에서 모델이 데이터 자체를 암기해버릴 경우 과대적합 발생

1. train data

2. validation data ( hyper parameter tuning ) ( 모델의 성능 향상 )

3. test data

 

Validation data

 

그러나 과대적합을 피할 수 없음

 

Cross Validation

 

ㅡ> 검증 data 를 하나로 고정하지 않고 test 데이터의 모든 부분을 사용

각각의 accuracy 의 평균을 구함

 

 

 

[ k-fold cross validation ]

random state

 

test 데이터를 k개의 그룹으로 분류

k-1 개의 그룹을 모두 학습에 사용

나머지 1개의 그룹으로 평가 수행

k 번 반복 후 accuracy 결과의 평균 구하기

 

 

 

 

 

ㅡ 교차 검증 ㅡ

Cross validation

 

cross_val_score

 

cross_val_score ( 모델명, x_train, y_train, cv =? )

sklearn.model_selection 의 cross_val_score 함수를 불러와 사용

 

np.mean

 



 

 

ㅡ 모델 성능 평가 ㅡ

fit, predict, accuracy_score

 

fit, predict, accuracy_score

 



 

 

ㅡ graphviz 라이브러리 설치 ㅡ

!pip stall graphviz

 

graphviz
import

 



 

ㅡ 모델 출력파일 생성 ㅡ

export_graphviz

 

export_graphviz

 

export_graphviz 를 이용해 학습된 모델명을 적고

( out_file ) 파일 경로 마지막에  / tree.dot 을 추가 ㅡ> 출력파일 이름 설정

답지, 라벨명을 설정하고 불순도, 색상 등의 정보 출력 여부를 설정해줌

 




 

ㅡ 모델 출력 ㅡ

open

 

open

 

with open ( '파일 경로', 인코딩 ) as f :

dot_graph = f.read ()

그래프 출력 변수를 지정해주고 display ( graphviz.Source ( ) ) 를 이용해 출력

 

Decision Tree graph

 

depth 가 높아질수록 gini 계수(불순물)가 낮아짐

 

 

 

 

 

[ max-depth 를 이용한 튜닝 ]

max_depth

 


ㅡ 모델 생성ㅡ

동일하게 모델 생성

tree 모델 생성

 


ㅡ 모델 출력 파일 생성ㅡ

max_depth 값을 설정

max_depth

 


ㅡ 모델 출력 ㅡ

open

open
max_depth=3 그래프

 

 

 

 

 

 

[ 특성 선택 ]

 

정답(레이블)과 연관 관계가 높은 특성을 선택하는 작업 ( 중요도 파악 )


importance = 모델명.feature_importances_

df = pd.DataFrame(importance, index=x_one_hot.columns, columns=[ '컬럼명' ] )

 

 

 

 

ㅡ 중요도 부여 ㅡ

feature_importances_ 

 

feature_importances_

 

 

 

 

ㅡ DataFrame 생성 후 정렬 ㅡ

pd.DataFrame

 

pd.DataFrame

 

index 는 x_one_hot 의 컬럼을 불러오기

중요도를 DataFrame 형태로 만들고 내림차순 정렬 후 출력

 



 

 

ㅡ DataFrame 생성 후 정렬 ㅡ

pd.DataFrame

 

 

특성 중요도 순위 top 15을 시리즈로 작성해서 sns.barplot 으로 시각화


 

 

 

 

[ GirdSerchCV ]

교차검증과 hyper parameter tuning 까지 한번에 수행

 

sklearn 라이브러리에서 제공하는 모델 성능 개선 함수

 

사용자가 모델과 hyper parameter 를 지정하면

순차적으로 hyper parameter를 변경해가며 학습과 평가 진행

ㅡ> 가장 성능 좋은 hyper parameter 제시



 

 

ㅡ GridSearchCV 과정 ㅡ

GridSearchCV

 

GridSerchCV

 

3x3x3x3 = 81개의 모델 생성 ㅡ> 최적값 제시

 

 



ㅡ GridSearchCV import ㅡ

GridSearchCV

 

GridSearCV import

 

 

 

 

ㅡ hyper parameter 값 지정 ㅡ

params ( dictionary 형태 )

 

params

 



 

ㅡ GridSearchCV 로 모델 설정 ㅡ

GridSearchCV

 

GridSearchCV

 

refit=True 이면 가장 좋은 parameter 값으로 재학습 설정

 



 

ㅡ 모델 학습 ㅡ

fit ()

 

fit ()

 



 

ㅡ 최적의 hyper parameter 값 출력 ㅡ

best_params_, best_score_, best_estimator_

 

best_params_, best_score_, best_estimator_

 

cv_results_



 

 

 

ㅡ 결과 DataFrame 으로 변환 ㅡ

pd.DataFrame

 

pd.DataFrame

 

info ()




 

ㅡ 필요한 정보만 뽑아보기 ㅡ

grid_result [ [ ' ' ] ]

 

grid_result

 



 

ㅡ 'rank_test_score'을 기준으로 정렬 ㅡ

sort_values ( by = '기준컬럼' )

 

sort_values

 

 

 

 

 

 

ㅡ 최적 모델 마무리 ㅡ

best_estimator_

 

best_estimator_

 

 

 

 

ㅡ 최적 모델 생성, 학습, 평가 ㅡ

best_estimator_, fit, score

 

best_estimator_, fit, score

 

 

 

 

 

 

 

 

 

Label Encoding / One-hot Encoding

Cross validation

 




 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

 



 

 

 

 

 

BYE