- 본 글은 스마트 인재개발원 서포터즈 활동으로 작성한 글입니다
지난 게시글 결정트리 이론에 이어서 실습 데이터 코드 정리를 올린다.
주피터 노트북 실습이다 보니 수업 자체가 정리가 잘 되어 있는 편이라, 업로드가 상대적으로 편한 것 같다.
그래서 굳이 코드 블럭으로 바꿔서 올리는 중 ㅎㅎ 보기도 좋고
이 실습은 내장 데이터인 mushroom.csv 를 이용하여, 식용버섯과 독 버섯을 구분해보는 실습이다.
decision tree 를 사용하는 것 말고는 이전에 한 다른 모델과 거의 같은 절차를 밟는다.
그래서 그런지 수업 마지막에는 과대적합 제어 코드와 교차 검증 적용을 해보는 형태로 진행 되었다.
아래에 코드를 순서대로 첨부해놓았다.
.
.
.
그럼 이제 진지하게 학습을 노잼 시작해보자...
# 문제정의
### 버섯의 특징을 사용해서 독/ 식용 버섯을 분류
## 목표
### Decision Tree 과대적합 제어/ 시각화 /특성 선택
# 데이터 수집
## jupyter notebook 내장 데이터
import pandas as pd
data = pd.read_csv('./data/mushroom.csv')
data.head()
data.shape # 데이터 행 컬럼 확인
# 전처리
## 결측치 확인
data.info()
# EDA 탐색적 데이터 분석
# 모델 선택 및 하이퍼 파라미터 튜닝
## 정답 데이터 분리
X = data.loc[ : , 'cap-shape' : ]
y = data.loc[ : , 'poisonous']
--- 개념 설명
Lavel 인코딩: 글자데이터를 수치 데이터로 변환하는 작업
Label Encoding : 수치값을 직접 대입하여 mapping 하는 작업
One-hot Encoding : 0 , 1 의 값을 가진 여러 개의 새로운 특성으로 변경
-- X_one_hot = pd.get_dummies(X2) # 작성 방식
##### 원핫의 경우 하나 하나 떼어서 하나의 칼럼으로 구분하여 분석할 수 있는 점이 분석에서 도움이 될 수 있음.
##### 결정트리에서, 머신 모델이 알아보기도 더 좋다고 함.
#### x1 =x 가 아니라 x1 = x.copy() ㄱㄱ # =로 해버리면 따라서 변경됨
---
X1 = X.copy()
X1['cap-shape'].unique() # db에 disinct 같은 것 하나만 보여줌
X1['cap-shape'].map({"x":0, "f":1, "k":2, "b":3, "s":4, "c":5})
X2 = X.copy()
# 원핫인코딩을 할 컬럼을 뽑아서 넣어주어야 함
X_one_hot = pd.get_dummies(X2)
X_one_hot.head()
## 훈련과 평가로 데이터 분리
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_one_hot, y, test_size = 0.3)
## 모델 불러오기, 학습, 평가
from sklearn.tree import DecisionTreeClassifier
tree_model = DecisionTreeClassifier()
tree_model.fit(X_train, y_train) # 모델 학습
tree_model.score(X_train, y_train) # train 데이터 스코어
tree_model.score(X_test, y_test) # test 데이터 스코어
# 시각화
!pip install graphviz # 시각화를 위한 graphviz 인스톨
import os
os.environ["PATH"]+=os.pathsep+'C:/Program Files/Graphviz/bin/'
from sklearn.tree import export_graphviz
export_graphviz(tree_model, out_file='tree.dot',
class_names=['p','e'],
feature_names=X_one_hot.columns,
impurity=True,
filled=True)
import graphviz
with open('tree.dot', encoding='UTF8') as f:
dot_graph = f.read()
display(graphviz.Source(dot_graph))
from subprocess import check_call
check_call(['dot','-Tpng','tree.dot','-o','tree.png'])
# 과대적합 제어
## leaf node : 10 개로 조정
### 1. leaf node 의 수를 10개로 조정한 모델
### 2. 학습
### 3. 평가
### 4. 시각화
from sklearn.tree import DecisionTreeClassifier
tree_model2 = DecisionTreeClassifier(max_leaf_nodes=10)
tree_model2.fit(X_train, y_train)
tree_model2.score(X_train, y_train)
tree_model2.score(X_test, y_test)
from sklearn.tree import export_graphviz
export_graphviz(tree_model2, out_file='tree2.dot',
class_names=['p','e'],
feature_names=X_one_hot.columns,
impurity=True,
filled=True)
import graphviz
with open('tree2.dot', encoding='UTF8') as f:dot_graph = f.read()
display(graphviz.Source(dot_graph))
### png로 바꾸는 코드
from subprocess import check_call
check_call(['dot','-Tpng','tree2.dot','-o','tree2.png'])
# 교차검증
from sklearn.model_selection import cross_val_score
### 네 가지가 필요
### 사용할 모델, 문제, 정답,데이터 분할 수(cv)
cross_val_score(tree_model, X_train, y_train, cv=5).mean()
### 앞으로 데이터 결과 값은 이전에 낸 스코어 보다 이 값을 더 신뢰하는 게 좋음
# 특성 선택
### 특성의 중요도를 볼 수 있는 것
### 117개 컬럼 각 중요도의 합은 1
fi = tree_model.feature_importances_
fi_df = pd.DataFrame(fi,index = X_train.columns)
fi_df.sort_values( by = 0, ascending = False).head(10)
### 추후 분석 권장 방식: (하이퍼 파라미터 수정, fit, 교차검증 값)의 반복
tree_model = DecisionTreeClassifier(max_leaf_nodes=10)
tree_model.fit(X_train, y_train)
cross_val_score(tree_model, X_train, y_train, cv=5).mean()
- 스마트인재개발원 홈페이지 https://www.smhrd.or.kr/
- 스마트인재개발원 네이버블로그 https://blog.naver.com/jang0_0yw
딥러닝 기술 동향 주워듣기 (0) | 2023.02.11 |
---|---|
[국비지원무료교육][빅데이터 개발자 과정][머신러닝] 파이썬- 여섯 번째 수업: 결정 트리 (0) | 2022.03.16 |
댓글 영역