상세 컨텐츠

본문 제목

쉽게 시작하는 [SCIKIT LEARN] / 붓꽃 품종 분류하기

프로그래밍

by 경밤 2019. 11. 2. 20:31

본문

반응형

[목차]

1. 붓꽃 품종 분류를 위해서 붓꽃의 데이터를 가져오기

2. 데이터를 간략히 살펴보기

3. KNN 알고리즘으로 분류 예측과 KNN 모델을 평가하기

 

이 글에서는 중간 정도크기에 적합한 K- Nearest Neighbor(KNN) 알고리즘으로 머신러닝 모델을 만들어서 

3가지의 붓꽃 품종을 각 특성(예를 들면 꽃의 폭, 줄기의 길이)에 따라 분류(Classify)하는 과정을 글로 쉽고 차근차근하게 풀어서 쓰겠습니다.

 

- 앞서 들어가기 전에 ..

아래의 명령어를 프롬프트에서 실행해 scikit-learn 패키지를 다운로드해주세요.

pip install scikit-learn

{1} / 데이터 가져오기

scikitlearn에서는 연습용으로 데이터를 구비해놨음으로 우리는 그저 코드에서 사용만 하면 된다.

코드를 입력해주자.

from sklearn.datasets import load_iris
iris = load_iris()

load_iris를 통해 데이터를 iris변수에 담았다.

{2} / 데이터 살펴보기

데이터를 볼 차례다. 데이터들의 '키'를 보면, '키'에 '값'이 들어있다. 그래 맞다 Dictionary와 유사하다 정확히는 Bunch 클래스의 객체이다.

print(iris.keys())

돌아오는 값은 아래와 같다.

Output : dict_keys(['DESCR', 'target', 'data', 'target_names', 'feature_names'])

보면 iris에는 총 5개의 키가 있는걸 확인 할 수 있다. 하나 하나씩 간략하게 설명하겠다.

 

[DESCR]

이 키에는 이 데이터셋에 대한 간략한 설명이 들어있다.

[TARGET_NAMES]

여기엔 우리가 예측하려는 붓꽃 품종의 이름들이 있다. string 배열이다.

[FEATURE_NAMES]

이곳엔 붓꽃 데이터들의 특성을 설명하는 리스트가 저장되었다.

 

그 외..

Data에는 Feature를 수치 값으로 가지고있는 Numpy 배열이다.

Target을 출력해보면, 0 0 0 0 0 1 1 1 2 2 2 이런 식으로 보일 것 이다.

Target_Names의 인덱스들이다. 이 숫자들을 섞어서 훈련 타겟 데이터로 쓰일 수 있다.

{3} / 데이터 훈련 및 ML 모델 평가

새로운 머신러닝 모델을 한 데이터로 만들고 나면 그 데이터는 모델의 성능을 평가하는 목적으로 사용할 수 없다 왜냐면 모델이 이미 모델을 만들때 쓴(훈련할때 쓴) 데이터들을 다 기억하기 때문이다. 그렇기에 새로운 데이터로 모델을 평가 해야하는데  그러기 위해서 한 데이터를 임의의 퍼센테이지로 평가, 테스트용으로 나눠서 모델을 만든다.  Scikit Learn의 model_selection에 포함된 train_test_split 을 사용하겠다.

from sklearn.model_selection import train_test_split

위와 같은 코드를 붙여넣어 코드를 작성후 이제 데이터셋을 나눌 차례이다.

x_train, x_test, y_train, y_test = train_test_split(
    iris['data'], iris['target'], random_state=0)

코드를 붙여넣은 후 데이터를 보면 x_* 에는 data이 들어있고,  y_*에는 target이 섞여서 넣어졌다는 점이다. 하지만 이렇게 나눌 퍼센테이지를 주지 않으면 기본적으로 train엔 전체의 75%를, test엔 25%를 담는다.

 

이제 데이터의 분리가 끝났음으로 KNN알고리즘으로 머신러닝 모델을 만들 차례이다.

KNN에서 가장 중요한 매개변수는 근접한 이웃으로 정할 이웃의 갯수이다. 이웃의 갯수가 늘어날수록, 평균에 가까워 진다.

 

KNN 분류기를 넣어주고, 근접한 이웃의 개수 최대치를 1로 설정해 KNN 분류기의 객체를 만들었다.

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=1)

 

 

객체의 Fit함수로 train 데이터로 학습시켜 모델을 만들어준다. fit함수는 knn 객체를 리턴함으로 쓴 매개변수들을 볼 수 있다.

knn.fit(x_train, y_train)

내 환경인 Jupyter notebook에선 이렇게 출력이된다.

Output : KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
           metric_params=None, n_jobs=1, n_neighbors=10, p=2,
           weights='uniform')

이제 ML 모델을 만들었으니 예측해보자. 새로운 Data를 만들어서 한번 예측 시켜보자. 

아, 그전에 Data는 Numpy 배열이니 numpy를 import해주자.

import numpy as np
x_my_iris = np.array([[5, 3, 2, 0.5]])
print("예측 한 붓꽃 : {}".format(
    iris['target_names'][(knn.predict(x_my_iris))]))

결과는 아래와 같이 출력된다.

Output : 예측 한 붓꽃 : ['setosa']

 

하지만 이 결과를 신뢰할 수 는 없다 틀릴수도 있는 법. 우리는 이 모델을 평가 해야겠다.

knn객체의 score 메서드로도 우리가 따로 빼 두었던 테스트 세트의 정확도를 평가하자.

print("테스트 세트에 대한 정확도 : {}".format(knn.score(x_test, y_test)))

결과는 약 97%로 꽤 높은 수치다. 하지만 너무 높으면 또 새로운 데이터에 잘 적응하지 못할 수 있고 너무 낮으면 신뢰할 대상이 되지 못한다. 주의하자

 

마지막은 코드 전체 사진이다.

반응형

관련글 더보기