상세 컨텐츠

본문 제목

[국비지원무료교육][빅데이터 개발자 과정][머신러닝] 파이썬- 일곱 번째 수업: 결정 트리(2)

Python/MachineLearning

by Sam_Park 2022. 3. 22. 09:24

본문

- 본 글은 스마트 인재개발원 서포터즈 활동으로 작성한 글입니다

 

지난 게시글 결정트리 이론에 이어서 실습 데이터 코드 정리를 올린다. 

주피터 노트북 실습이다 보니 수업 자체가 정리가 잘 되어 있는 편이라, 업로드가 상대적으로 편한 것 같다.

 

그래서 굳이 코드 블럭으로 바꿔서 올리는 중 ㅎㅎ 보기도 좋고

 

이 실습은 내장 데이터인 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

 

스마트인재개발원

취업과 나를 IT다! 빅데이터, 인공지능, 프로그래밍 전문 취업연계교육기관

smhrd.or.kr

 

스마트인재개발원 : 네이버 블로그

빅데이터, 인공지능, 사물인터넷, SW 전문 취업연계 무료교육기관‍♀️ 교육은 무료로! 취업은 당당하게!

blog.naver.com

 

관련글 더보기

댓글 영역