Data Analysis & ML/Machine Learning

[Machine Learning][머신러닝] IRIS 분석 (결정 트리 모델(Decision Tree))

YSY^ 2020. 8. 26. 12:45

데이터셋 확인하기

용어

  • 레이블(Label), 타겟(Target)
    • 결정값, 출력데이터, 종속변수
    • 예측 대상이 되는 값. 지도학습시 학습을 위해 주어지는 정답 데이터
    • 분류의 경우 레이블을 구성하는 고유값들을 클래스(class)라고 한다.
  • 피쳐(Feature)
    • 속성, 입력데이터, 독립변수
    • Target이 왜 그런 값을 가지게 되었는지를 설명하는 변수.
    • Target값을 예측하기 위해 학습해야 하는 값들.

scikit-learn 내장 데이터셋 가져오기

  • scikit-learn은 머신러닝 모델을 테스트 하기위한 데이터셋을 제공한다.
    • 이런 데이터셋을 Toy dataset이라고 한다.
  • 패키지 : sklearn.datasets
  • 함수 : load_xxxx()
from sklearn.datasets import load_iris
iris = load_iris()
iris.keys()

scikit-learn 내장 데이터셋의 구성

  • scikit-learn의 dataset은 딕셔너리 형태의 Bunch 클래스 객체이다.
    • keys() 함수로 key값들을 조회
  • 구성
    • target_name: 예측하려는 값(class)을 가진 문자열 배열
    • target: Label(출력데이터)
    • data: Feature(입력변수)
    • feature_names: 입력변수 각 항목의 이름
    • DESCR: 데이터셋에 대한 설명

 

판다스 데이터프레임으로 구성

  • 데이터 프레임 생성 후 데이터 확인

[Machine Learning][머신러닝] IRIS 분석 (결정 트리 모델(Decision Tree)) 0

import pandas as pd

iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df['species'] = iris.target
iris_df

 

문제 정의

내가 발견한 Iris 꽃받침(Sepal)의 길이(length)와 폭(width)이 각각 5cm, 3.5cm이고 꽃의 꽃잎(Petal)의 길이와 폭은 각각 1.4cm, 0.25cm이 이었다. 이 꽃는 Iris의 무슨 종일까?

 

결정 트리(Decision Tree) 알고리즘을 이용한 분류

개요

  • 독립 변수의 조건에 따라 종속 변수를 분리
  • 머신러닝의 몇안되는 White box 모델
    • 결과에 대한 해석이 가능하다.
  • 과적합(Overfitting)이 잘 일어나는 단점이 있다.
  • 랜덤 포레스트(Random Forest), Gradient Boosting, Adaptive boosting과 같은 Boosting 계열 앙상블이 결정트리를 기반으로 하고 있다

[Machine Learning][머신러닝] IRIS 분석 (결정 트리 모델(Decision Tree)) 1

결정트리 모델을 이용해 머신러닝 구현

  1. import 모델
  2. 모델 생성
  3. 모델 학습시키기
  4. 예측
from sklearn.tree import DecisionTreeClassifier
# 모델생성
dt = DecisionTreeClassifier()
# 학습시키기-tain, fit => 우리데이터셋이 모델을 맞추는 작업
dt.fit(iris.data, iris.target)  #input, output

# 예측
pred = dt.predict(iris.data)
pred
#==> array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
#      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
#      0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
#      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
#      1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
#      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
#      2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])
# 검증 - 정확도
from sklearn.metrics import accuracy_score
accuracy_score(iris.target, pred)  
#정확도 (실제target, 예측결과) : 0 ~ 1

 

머신러닝 프로세스

[Machine Learning][머신러닝] IRIS 분석 (결정 트리 모델(Decision Tree)) 2

훈련데이터셋과 평가(테스트)데이터 분할

  • 위의 예는 우리가 만든 모델이 성능이 좋은 모델인지 나쁜 모델인지 알 수 없다.
  • 전체 데이터 셋을 두개의 데이터셋으로 나눠 하나는 모델을 훈련할 때 사용하고 다른 하나는 그 모델을 평가할 때 사용한다.
  • 보통 훈련데이터와 테스트데이터의 비율은 8:2 또는 7:3 정도로 나누는데 데이터셋이 충분하다면 6:4까지도 나눈다.

데이터셋 분할시 주의

  • 각 클래스(분류대상)가 같은 비율로 나뉘어야 한다.

 

scikit-learn의 train_test_split() 함수 이용 iris 데이터셋 분할

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = \
train_test_split(iris.data,#input data(feature)
                 iris.target, #output data(label)
                 test_size=0.2, #테스트 셋의 비율(전체중 20%, 기본:0.25)
                 stratify = iris.target, #각 class들을 같은 비율로 나눈다.
                 random_state=1 #random 시드값
                )

X_train.shape, X_test.shape, y_train.shape, y_test.shape
#==> ((120, 4), (30, 4), (120,), (30,))
type(X_train), type(y_train)
#==> (numpy.ndarray, numpy.ndarray)

모델생성 및 학습

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
dt.fit(X_train, y_train)

평가

  • 머신러닝 평가지표 함수들은 sklearn.metrics 모듈에 있다.
  • accuracy(정확도)
    • 전체 데이터셋중 맞춘 개수의 비율
      from sklearn.metrics import accuracy_score
      # 훈련데이터셋으로 예측
      pred_train = dt.predict(X_train)
      # 테스트 데이터셋으로 예측
      pred_test = dt.predict(X_test)
      

acc_train = accuracy_score(pred_train, y_train)
acc_test = accuracy_score(pred_test, y_test)

print(f"훈련데이터셋 정확도: {acc_train}, 테스트데이터셋 정확도:{acc_test}")
#==> 훈련데이터셋 정확도: 1.0, 테스스데이터셋 정확도:0.9666666666666667


- 혼동행렬 (Confusion Matrix)
    - 예측 한 것이 실제 무엇이었는지를 표로 구성한 평가 지표
    - 분류의 평가 지표로 사용된다.
    - axis=0: 실제, axis=1: 예측

from sklearn.metrics import confusion_matrix
cm_train = confusion_matrix(y_train, pred_train) #실제값, 예측값
cm_test = confusion_matrix(y_test, pred_test)

```
cm_train
==> array([[40, 0, 0],
[ 0, 40, 0],
[ 0, 0, 40]], dtype=int64)

cm_test
==> array([[10, 0, 0],
[ 0, 10, 0],
[ 0, 1, 9]], dtype=int64)

728x90
반응형