일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 유데미코리아
- 코딩테스트
- 파이썬
- 2024년
- 데이터분석가
- 실습
- 프리온보딩
- 프로젝트
- 러닝스푼즈
- 프로그래머스
- 자격증준비
- 유데미부트캠프
- trouble shooting
- 부트캠프후기
- 코테
- 자격증
- 데이터시각화
- Python
- SQL
- tableau
- 회고록
- 쿼리테스트
- Tableau Desktop Specialist
- 태블로
- 유데미
- 취업부트캠프
- AICE
- MySQL
- 데이터분석
- 스타터스부트캠프
- Today
- Total
신이 되고 싶은 갓지이
4. Python 머신러닝 - 지도학습2(의사결정나무)와 실습 본문
1. 의사결정나무
: 한번에 하나의 설명변수를 사용하여 정확한 규칙들을 생성하는 알고리즘. 다음과 같이 하나의 설명변수의 조건에 따라 가지치기 되어 모든 조건이 한쪽만 갖게 되어 명확한 예측을 할 수 있을 때까지 나누어준다.
- 어떤 기준이 올바른 기준일까?
- 기준점으로 나누었을 때 영역의 복잡도가 낮을 때
- 한쪽으로 쏠린 단순한 결과가 나왔을 때
- 수학적으로 엔트로피(복잡도를 표현한 식)이 낮을 때
- 좋은 기준점을 어떻게 정할까?
- 각 변수를 이용해 가능한 모든 기준점을 통해 구간을 분리
- 분리된 구간의 복잡도가 가장 낮은 기준점을 선택
- 위의 과정을 계속 반복
2. 오버피팅
: 학습 데이터를 너무 과도하게 학습하여 outlier에 민감한 결과를 나타냄
- 오버피팅 방지
- 분류시 각 구역에서 객체의 갯수가 n개 이상일 때만 분류
3. 실습
1) train, test 데이터셋 생성
import pandas as pd
import os
# 데이터를 불러오기
iris = pd.read_csv("./data/IRIS.csv")
# 타겟 변수의 구성을 살펴보기
iris['species'].value_counts()
# 아이디를 생성
iris['id'] = range(len(iris))
# 열의 순서를 바꾸기
iris = iris[['id','sepal_length','sepal_width','petal_length','petal_width','species']]
# iris 중에서 100개를 랜덤으로 추출해 train 데이터로 지정
train = iris.sample(100,replace=False,random_state=2020).reset_index().drop(['index'],axis=1)
# 추출되지 않은 나머지를 test 데이터로 지정
test = iris.loc[ ~iris['id'].isin(train['id']) ]
test = test.reset_index().drop(['index'],axis=1)
2) 의사결정나무
- DecisionTreeClassifier(min_samples_split = n) : 의사결정나무에서 최종 노드의 최소 샘플 수를 n으로 설정
# 의사결정나무를 위한 패키지
from sklearn.tree import DecisionTreeClassifier
# 최종 노드의 최소 샘플 수를 10으로 설정
dt = DecisionTreeClassifier(min_samples_split = 10)
# 의사결정나무 모델을 train 데이터에서 학습
dt.fit(train[['sepal_length','sepal_width','petal_length','petal_width']],train['species'])
# 예측 확인
predictions = dt.predict(test[['sepal_length','sepal_width','petal_length','petal_width']])
# 정확도 확인
(pd.Series(predictions)==test['species']).mean()
→ 결과적으로 96%의 정확도를 갖는다.
3) 의사결정나무가 만든 규칙을 시각화하고 해석
- tree.plot_tree(dt, feature_names = ['변수1', '변수2', '변수3'], impurity=False, max_depth=n, fontsize=m, proportion=True) : 학습시킨 모델 dt과 input변수들을 T/F 여부를 확인하지 않고, 최대 깊이 n, 글씨 크기 m로 해당 노드의 데이터 비율을 보여주며 시각화
# 그림의 기본 크기를 설정
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 16,10
# 의사결정나무를 시각화
from sklearn import tree
import matplotlib.pyplot as plt
a=tree.plot_tree(dt, feature_names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width'],
impurity=False, max_depth=2, fontsize=10, proportion=True)
plt.show(a)
4) Cross Validation
test, train 데이터셋을 랜덤하게 나누기 때문에 어떻게 나누는지에 따라 결과가 달라지며 모델의 성능이 항상 동일하지 않아 모델 성능 측정의 신뢰성이 하락한다. 이를 해결하기 위해 데이터를 n등분 하여 첫번째 데이터셋은 test, 나머지는 train으로 하여 학습 시키는 방법을 n번째 데이터셋까지 반복하여 학습시켜서 나온 정확도의 평균으로 정확도를 측정한다면 신뢰성이 높아진다. 3등분하여 3번 정확도를 측정하면 3th fold Cross Validation이라 부른다.
- cross_val_score(dt, df[['변수1', '변수2', '변수3']], df['species'], cv=5, scoring="accuracy") : df를 5등분하여 Cross Validation를 통해 학습
from sklearn.model_selection import cross_val_score
import numpy as np
# 최종 노드의 최소 샘플 수를 10으로 설정
dt = DecisionTreeClassifier(min_samples_split = 10)
# Cross Validation 학습
scores = cross_val_score(dt, iris[['sepal_length','sepal_width','petal_length','petal_width']],
iris['species'], cv=5, scoring="accuracy")
np.mean(scores)
'Python' 카테고리의 다른 글
3. Python 머신러닝 - 지도학습1(KNN, 의사결정나무)의 실습 후 모델 성능 측정하기 (1) | 2024.01.25 |
---|---|
2. Python 머신러닝 - Clustering을 실습을 통해 알아보기(Boston Data), 인코딩 (2) | 2024.01.23 |
1. Python 머신러닝 - 공분산과 상관계수, 차원축소를 실습을 통해 알아보기(Boston Data) (2) | 2024.01.22 |
7. Python 기초 - API 활용하여 데이터 수집하기 (1) | 2024.01.19 |
6. Python 기초 - 일시를 관리하는 datetime 라이브러리 (1) | 2024.01.15 |