붓꽃 데이터는 붓꽃의 꽃잎, 꽃받침의 폭과 길이를 센티미터 단위로 측정한 것과
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개의 붓꽃 데이터)를 두 그룹으로 나눠야 한다.
- 훈련 데이터 혹은 훈련 세트 >> 머신러닝 모델을 만들 때 사용
- 테스트 데이터 혹은 테스트 세트: >> 모델이 얼마나 잘 작동하는지 측정하는데 사용
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%의 품종을 정확히 맞혔다는 뜻이다.
'머신러닝&딥러닝' 카테고리의 다른 글
[ML] 일반화, 과대 적합, 과소 적합 (0) | 2023.09.15 |
---|---|
[ML] 지도학습의 분류와 회귀 개념 정리 (0) | 2023.08.30 |
[ML] NumPy, SciPy, matplotlib, pandas 개념 정리 (0) | 2023.08.27 |