머신러닝(IRIS데이터 예측)

Variety_·2021년 11월 12일
0

AI

목록 보기
1/8

머신러닝이란 ?

  • 명시적으로 프로그래밍하지 않고도 컴퓨터에 학습할 수 있는 능력을 부여하는 학문

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

  • IRIS 데이터 분류

    • 꽃잎, 꽃받침의 길이/너비를 이용해서 품종구분이 가능할까?
  • 데이터 관찰

from sklearn.datasets import load_iris
iris = load_iris()

iris.keys()
# 데이터 설명들
print(iris["DESCR"])

print(iris['target'])
print(iris['target_names'])

# 차례대로 0번째가 setosa, 1이 versicolor, 2가 virginica를 의미
  • 먼저 상황을 파악해야한다 ! ex) 품종 구분을 위한 특성공부
import pandas as pd
iris_pd =pd.DataFrame(iris.data, columns=iris['feature_names'])
iris_pd['species'] = iris.target

import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(12,6))
sns.boxplot(x='sepal length (cm)', y='species', data=iris_pd, orient='h')
# orient : 수평바로 그려라 

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

plt.figure(figsize=(12,6))
sns.scatterplot(x='petal length (cm)', y='petal width (cm)', data=iris_pd, hue='species', palette='Set2');
  • 품종을 구분하는 선을 어떻게 그을까?

  • 첫번째 setosa 구분은 너무 잘 되니 두번째 선을 어떻게 그을까?

Decision Tree

# 데이터 변경
iris_12 = iris_pd[iris_pd['species']!=0]
sns.scatterplot(x='petal length (cm)', y='petal width (cm)', data=iris_12, hue='species', palette='Set2');

# 과연이제 어떻게 선을 정할 것인가?

Decision Tree의 분할 기준(Split Criterion)

  • Decision Tree : 분류, 회귀 모두 가능한 지도 학습 모델 중 하나. 스무고개처럼 질문을 이어가며 학습

  • 정보 획득(Information Gain)

    • 정보의 가치를 반환하는 데 발생하는 사전의 확률이 작을수록 정보의 가치는 커진다.
    • 정보 이득이란 어떡 속성을 선택함으로 인해서 데이터를 더 잘 구분하게 되는 것
  • 엔트로피 : 불순도를 수치화한 지표 중 하나, 확률 변수의 불확실성을 수치로 나타낸 것

  • 엔트로피가 큰쪽에서 낮은쪽으로 이동해야함(무질서도를 낮춰야 함)

# p:해당 데이터가 해당 클래스에 속할 확률
# 어떤 확률 분포로 일어나는 사건을 표현하는데 필요한 정보의 양이며 이 값이 커질수록 확률 분포의 불확실성이 커지며 결과에 대한 예측이 어려워짐
import numpy as np
p = np.arange(0.001, 1, 0.001)
plt.plot(p, -p*np.log2(p))

# 엔트로피는 이확률들의 합
# 그러다 계산이 어려워서 지니계수라는 것이 등장

Scikit Learn

  • 현재 파이썬에서 가장 유명한 기계학습 오픈소스 라이브러리
from sklearn.tree import DecisionTreeClassifier
iris_tree = DecisionTreeClassifier()
iris_tree.fit(iris.data[:, 2:], iris.target)

# 성능확인
from sklearn.metrics import accuracy_score
y_pred_tr = iris_tree.predict(iris.data[:, 2:])
accuracy_score(iris.target, y_pred_tr)

과적합(Overfiting)

# 트리보기 
from sklearn.tree import plot_tree
plt.figure(figsize=(12,8))
plot_tree(iris_tree)

# 결정경계
from mlxtend.plotting import plot_decision_regions

plt.figure(figsize=(14,8))
plot_decision_regions(X=iris.data[:,2:], y=iris.target, clf=iris_tree, legend=2)
plt.show()
  • plot_tree

  • plot_decision_regions

  • Accuracy가 높다고 과연 믿을 수 있을까?

  • 내가 가진 데이터를 벗어나서 일반화할 수 있을까?

  • 어차피 얻은 데이터는 유한하고 내가 얻은 데이터를 이용해서 일반화를 추구하게 된다.

  • 이때 복잡한 경계면은 모델의 성능을 결국 나쁘게 한다.

데이터 분리

  • 훈련, 검증, 테스트 데이터로 분리해서 오버피팅을 방지해야함.
# 데이터를 훈련/ 테스트로 분리
from sklearn.datasets import load_iris
iris = load_iris()

from sklearn.model_selection import train_test_split
features = iris.data[:, 2:]
labels = iris.target
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=13)

# 훈련용/테스트용이 잘 분리 되었을까?
import numpy as np
np.unique(y_test, return_counts=True)

-> 고르게 분포 안됨

# 고르게 나눠주는 옵션 : stratify
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, stratify=labels, random_state=13)

# 위에 처럼 다시 train 데이터만 대상으로 결정나무 모델 생성
# 학습할 때 마다 일관성을 위해 random_state고정, 모델 단순화를 위해 max_depth조정
from sklearn.tree import DecisionTreeClassifier
iris_tree = DecisionTreeClassifier(max_depth=2, random_state=13)
iris_tree.fit(X_train, y_train)

plt.figure(figsize=(12,8))
plot_tree(iris_tree)

# 정확도 계산
y_pred_tr = iris_tree.predict(iris.data[:, 2:])
accuracy_score(iris.target, y_pred_tr)
# 결정경계 확인
from mlxtend.plotting import plot_decision_regions
plt.figure(figsize=(14,8))
plot_decision_regions(X=x_train, y=y_train, clf=iris_tree, legend=2)
plt.show()
# 정확도 측정
y_pred_tr = iris_tree.predict(X_test)
accuracy_score(y_test, y_pred_tr)

scatter_highlight_kwargs = {'s':150, 'label':'Test data', 'alpha':0.9}
scatter_kwargs = {'s':120, 'edgecolor':None, 'alpha':0.9}
plt.figure(figsize=(12,8))
plot_decision_regions(X=features, y=labels, X_highlight=X_test, clf=iris_tree,legend=2
                     ,scatter_highlight_kwargs=scatter_highlight_kwargs,
                     scatter_kwargs = scatter_kwargs,
                     contourf_kwargs={'alpha':0.2})
# 아래처럼하면 라벨이 바로 나오는 효오과
iris.target_names[iris_tree.predict(test_data)]
# 주요 특성 확인
iris_tree.feature_importances_
dict(zip(iris.feature_names, iris_tree.feature_importances_))

0개의 댓글