[ML] Iris Classification

박미영·2023년 5월 23일
0

DataSchool StudyNote - ML

목록 보기
1/19

📌머신러닝(Machine Learning)

명시적인 프로그램에 의해서가 아니라, 주어진 데이터를 통해 규칙을 찾는 것



📌 IRIS

  • 프랑스의 국화
  • 아이리스 Iris라는 이름은 그리스 신화의 무지개의 여신인 Iris에서 따온 것.
    헤라 여신이 Iris에게 내린 축복의 숨결이 땅으로 떨어져 핀 꽃



📍Iris 품종 분류

꽃잎(petal), 꽃받침(sepal)의 길이/너비 정보를 이용해서 이 3종의 품종을 구분할 수 있을것인가?



📍Python Iris 데이터

# sklearn에서 제공하는 iris 데이터
from sklearn.datasets import load_iris  
iris = load_iris()
iris


iris.keys()


  • 데이터 설명 DESCR에 있음
  • class: 분류해야 할 대상
print(iris['DESCR'])    


print(iris['target_names'])


print(iris['target'])

'setosa' - 0, 'versicolor'- 1, 'virginica' - 2 (각 50개)


- iris 데이터 데이터프레임 생성

import pandas as pd
iris_pd = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_pd.head()


  • species 컬럼 추가하기
iris_pd['species'] = iris.target
iris_pd.head()
iris_pd.tail()





📍iris 시각화

import matplotlib.pyplot as plt
import seaborn as sns
sns.boxplot(x='sepal length (cm)', y='species', data=iris_pd, orient='h');


# plt.figure(figsize=(12, 6))
sns.boxplot(x='sepal width (cm)', y='species', data=iris_pd, orient='h');


sns.boxplot(x='petal length (cm)', y='species', data=iris_pd, orient='h');

sns.boxplot(x='petal width (cm)', y='species', data=iris_pd, orient='h');

-> petal length, petal width로 구분했을때 setosa(0번)은 비교적 구분이 잘 되는 것을 확인 할 수 있다. 하지만 sepal length, sepal width, petal length, petal width 모두 versicolor(1번), virginica(2번)은 구분이 쉽지 않다는 것이 그래프로 확인 된다.



sns.pairplot(iris_pd, hue='species')

sns.scatterplot(x='petal length (cm)', y='petal width (cm)', data=iris_pd, hue='species', palette='Set2');

위 두 데이터로 봐도 0번은 구분이 잘 되는 반면 1, 2는 겹쳐진 부분들이 있다는 것이 확인된다. 하지만 구분이 가능 할 것 같다는 생각이 든다.


이렇게 규칙을 생각해볼 수 있겠다.
하지만 근거가 있는가? 저렇게 결론을 내도 되는 것인가?에 대한 답변은 알 수 없다.

so, 알고리즘 등장!

  • 현재 상황에서는 이것이 최선이라는 근거
  • 혹은 이런 방향, 저런 방향으로 진행했을 때의 각각의 차이점에 대한 정량적 수치 제시
  • 가로선이 어디에 있는 것이 최선인지 확인하는 작업이 필요하다.

경계선이 어디에 있는 것이 최선일까?



📌Decision Tree의 분할 기준

(Split Criterion)

📍Information Gain(정보 획득)

  • 보의 가치를 반환하는 데 발생하는 사전의 확률이 작을수록 정보의 가치는 커진다
  • 정보 이득이란 어떤 속성을 선택함으로 인해서 데이터를 더 잘 구분하게 되는 것



📍Entropy(엔트로피)

  • 열역학의 용어로 물질의 열적 상태를 나타내는 물리 량의 단위 중 하나. 무질서의 정도를 나타냄
  • 1948년 엔트로피 개념에서 힌트를 얻어 확률 분포의 무질서도나 불확실성
    혹은 정보 부담 정도를 나타내는 정보 엔트로피 개념을 클로드 섀넌이 고안함
  • 얼마만큼의 정보를 담고 있는가? 또한, 무질서도(disorder)를 의미, 불확실성(uncertainty)를 나타내기도 함



📍plog2p-p \log_{2}{p}

  • p는 해당 데이터가 해당 클래스에 속활 확률
  • 어떤 확률 분포로 일어나는 사건을 표현하는데 필요한 정보의 양
  • 값이 커질수록 확률 분포의 불확실성이 커지며 결과에 대한 예측이 어려워짐
  • 엔트로피는 이 확률들의 합

import numpy as np

# 0.001부터 1까지 0.001 간격으로
p = np.arange(0.001, 1, 0.001)
plt.grid()
plt.title('$-p \log_{2}{p}$')    # $ - 수학 표현법으로 출력
plt.plot(p, -p*np.log2(p));



📍지니 계수

  • Gini index 혹은 불순도율
  • 엔트로피의 계산량이 많아서 비슷한 개념이면서 보다 게산량이 적은 지니계수를 사용하는 경우가 많다.




그렇다면 다시 iris로 돌아와서

  • setosa를 제외한 나머지 데이터
iris12 = iris_pd[iris_pd['species']!=0]
iris12



📌Scikit Learn

  • 파이썬에서 가장 유명한 기계 학습 오픈 소스 라이브러리



📍DecisionTreeClassifier

  • sklearn을 이용한 DecisionTreeClassifier 구현
    _clf (Classifier 약자)가 사용될 때가 있음 지금은 그냥 tree라고 저장하자
#DecisionTree로 된 분류기
from sklearn.tree import DecisionTreeClassifier 
iris_tree = DecisionTreeClassifier()

  • iris.data의 2,3번 만 가져오겠다
iris.data[:, 2:]

  • 지도학습 (iris.target 즉, 정답을 알려줌)
    fit : 데이터와 정답을 줄테니 학습해!
iris_tree.fit(iris.data[:, 2:], iris.target)

여기까지 학습 완료



- Accuracy (성능 확인)

from sklearn.metrics import accuracy_score

# iris_tree -> 학습이 완료된 상태
# iris.data[:, 2:] 데이터를 줄테니 맞춰봐(predict) -> 지금은 정답을 주지 않음 
y_pred_tr = iris_tree.predict(iris.data[:, 2:])



  • 예측한 결과물
y_pred_tr



  • 원래 참값
iris.target



  • 원래의 참값과, 학습된 결과의 예측값의 정확도
accuracy_score(iris.target, y_pred_tr)



  • DecisionTree 구조
from sklearn.tree import plot_tree

# iris_tree -> 학습된 모델 
# 학습된 모델의 구조 구현
plot_tree(iris_tree);



#!pip install mlxtend
from mlxtend.plotting import plot_decision_regions

plt.figure(figsize=(12,6))
plot_decision_regions(X=iris.data[:,2:], y=iris.target, clf=iris_tree, legend=2)
plt.show()

  • 선이 어떻게 그어지는지는 랜덤성이 존재




⚠️조심해야할 점

  • 경계면이 많음(복잡함) -> 사용된 직선수가 많음
  • 위 tree에서 수많은 조건문들이 한일 -> 조건문들이 생길때마다 직선이 생김
  • 복잡한 경계면 때문에 accuracy가 높아진 것

그럼 accuracy가 99.3%라고 해서 다 믿을 수 있을 것인가!!? nope!
150개 데이터가 모든 세상의 iris 데이터를 대변할 수 있을까? -> 문제점 -> outlier 인것은 아닐까?
저 튀어나온 데이터가 돌연변이 같은 것일 수도 있다.
원래는 저렇게 튀어나올 확률이 굉장히 적은데 하필 저 데이터가 돌연변이로 튀어나온 데이터 일 수 있다!! (일반화 할 수 없다.)

내가 가진 150개 데이터로는 확인할 방법이 없다.
너무 accuracy가 99% 를 가지도록 만드는 것(복잡한 경계면을 가지게 하는 것)이 올바르지 않을 수도 있다고 생각해야함

  • 즉, 내가 가진 데이터에만 적합(fit)해지면 안된다! -> 과적합
  • 과적합은 동의의 기준이 없다. -> 디자이너, 엔지니어가 결정해야할 일임




"이 글은 제로베이스 데이터 취업 스쿨 강의를 듣고 작성한 내용으로 제로베이스 데이터 취업 스쿨 강의 자료 일부를 발췌한 내용이 포함되어 있습니다."

0개의 댓글