본문 바로가기
머신러닝&딥러닝

[ML] 붓꽃 데이터로 알아보는 머신러닝

by IT 정복가 2023. 8. 30.
728x90

붓꽃 데이터는 붓꽃의 꽃잎,  꽃받침의 폭과 길이를 센티미터 단위로 측정한 것과

setosa, versicolor, virginica 종으로 분류한 데이터도 가지고 있다.

이 값들을 가지고 붓꽃이 어떤 품종인지 구분해 보자.

 

※ 붓꽃의 품종을 정확하게 분류한 데이터를 가지고 있으므로 이 문제는 지도학습에 속한다.

또한, 몇 가지 선택사항 중 하나를 선택하는 문제이므로 분류 문제에 해당한다.

 

1. 데이터 적재

< 1.1 데이터 키 알아보기 >

이 데이터는 사이킷런의 datasets 모듈에 포함되어 있다.

load_iris 함수를 사용해서 데이터를 적재할 수 있다.

#붓꽃 데이터 예제

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import mglearn

from sklearn.datasets import load_iris
iris_dataset = load_iris()

print("iris_dataset의 키:\n",iris_dataset.keys())

load_iris가 반환한 iris 객체는 파이썬 딕셔너리와 유사한  Bunch 클래스의 객체이다.

즉, 키와 값으로 구성되어 있다.

 

그렇다면 저 키의 값에는 어떻게 접근하는가?

 

< 1.2 값 접근하기 >

 

- DESCR의 값 접근

#DESCR 출력
print(iris_dataset['DESCR'][:193]+"\n...")

 

- target_names의 값 접근

#타깃 이름
print("타깃의 이름:",iris_dataset["target_names"])

 

- data의 값 접근

print("data의 크기:\n", iris_dataset["data"][:10])

(데이터가 150개가 되기때문에 10개만 출력했다.)

#data 크기
print("data의 크기:", iris_dataset["data"].shape)

shape로 크기를 출력해 보았다. 

꽃잎,  꽃받침의 폭과 길이(총 4개) 150개가 있다는 뜻이다.

 

이 배열은 150개의 붓꽃데이터를 가지고 있다.

머신러닝에서는 각 아이템은 샘플이라고 하고 속성은 특성이라고 한다.

 

- target 값 접근

#target
print("타깃:\n", iris_dataset["target"])

이 숫자의 의미는 iris_dataset["target_names"] 배열에서 확인할 수 있다.

  • 0: setosa
  • 1: versicolor
  • 2: virginica

1.2 성과 측정

이 데이터로 머신러닝 모델을 만들고 새로운 데이터의 품종을 예측해보자.

그 전에 이 모델이 진짜 잘 작동하는지 알아야 한다. 우리가 만든 모델의 예측을 신뢰할 수 있는지 알아햐 한다는 뜻이다.

 

모델의 성능을 측정하려면 레이블을 알고 있는 새 데이터를 모델에 적용해야 한다.

이를 위해 우리가 가지고 있는 레이블된 데이터 (150개의 붓꽃 데이터)를 두 그룹으로 나눠야 한다.

  1. 훈련 데이터 혹은 훈련 세트 >> 머신러닝 모델을 만들 때 사용
  2. 테스트 데이터 혹은 테스트 세트: >> 모델이 얼마나 잘 작동하는지 측정하는데 사용

 

scikit-learn은 데이터 셋을 섞어서 나눠주는 train_test_split 함수를 제공한다.

이 함수는 전체 행 중 75%를 데이터와 함께 훈련 세트로 뽑는다.

나머지 25%는 레이블 데이터와 함께 테스트 세트가 된다.

 

scikit-learn에서 데이터는 대문자 X로 표시하고 레이블은 소문자 y로 표기한다.

 

train_test_split의 반환값을 저장하는 코드

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    iris_dataset["data"], iris_dataset["target"], random_state=0
)

train_test_split 함수로 데이터를 나누기 전에 유사 난수 생성기를 사용해 데이터셋을 무작위로 섞는다.

 

이 함수를 여러 번 실행해도 결과가 똑같이 나오도록 유사 난수 생성기에 넣을 난수 초깃값을 random_state 매개변수로 전달한다. 

  • X_train: 전체 데이터셋의 75%
  • X_test: 나머지 25%
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
    iris_dataset["data"], iris_dataset["target"], random_state=0
)

print("X_train 크기", X_train.shape)
print("y_train 크기", y_train.shape)

print("X_test 크기", X_test.shape)
print("y_test 크기", y_test.shape)

 


1.3 예측하기

  • 꽃받침의 길이: 5cm
  • 꽃받침의 폭: 2.9cm
  • 꽃잎의 길이: 1cm
  • 꽃잎의 폭: 0.2cm

만약 위의 붓꽃을 보았다고 가정하자.

이 붓꽃이 어떤 품종인지 예측해보자.

 

예측에는 knn(k-최근접 이웃 알고리즘) 객체의 predict 메서드를 사용한다.

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

knn.fit(X_train, y_train)
X_new = np.array([[5,29,1,0.2]])

prediction = knn.predict(X_new)
print("예측:", prediction)
print("예측한 타깃의 이름",iris_dataset["target_names"][prediction])

 


1.4 모델 평가하기

테스트 데이터에 있는 붓꽃의 품종을 예측하고 실제 품종과 비교할 수 있다.

얼마나 많은 붓꽃 품종이 정확히 맞았는지 정확도를 계산하여 모델의 성능을 평가해보자.

y_pred = knn.predict(X_test)
print("테스트 세트에 대한 예측값:\n", y_pred)

print("테스트 세트의 정확도:{:.2f}".format(np.mean(y_pred == y_test)))

print("테스트 세트의 정확도:{:.2f}".format(knn.score(X_test, y_test)))

knn 객체의 score 메서드로도 테스트 세트의 정확도를 계산할 수 있다.

 

이 모델의 테스트 세트에 대한 정확도는 약 0.97이다.

테스트 세트에 포함된 붓꽃 중 97%의 품종을 정확히 맞혔다는 뜻이다.

728x90