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: 데이터셋에 대한 설명

 

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

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

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 계열 앙상블이 결정트리를 기반으로 하고 있다

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

  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

 

머신러닝 프로세스

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

  • 위의 예는 우리가 만든 모델이 성능이 좋은 모델인지 나쁜 모델인지 알 수 없다.
  • 전체 데이터 셋을 두개의 데이터셋으로 나눠 하나는 모델을 훈련할 때 사용하고 다른 하나는 그 모델을 평가할 때 사용한다.
  • 보통 훈련데이터와 테스트데이터의 비율은 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
반응형