pythonML

[pythonML] 데이터셋분리/학습/예측/평가 - 붓꽃 품종 예측

독립성이 강한 ISFP 2022. 2. 22. 01:15
728x90
반응형

사이킷런(Scikit-learn)은 파이썬에서 사용할 수 있는 강력한 머신러닝 라이브러리입니다.

사이킷런은 다양한 머신러닝 알고리즘과 유틸리티 함수들을 제공하여 데이터 분석과 예측 모델링을 쉽게 할 수 있도록 도와줍니다.

 

분류(Classification)는 지도학습(Supervised Learning)의 한 종류로,

주어진 데이터를 미리 정의된 클래스 레이블 중 하나로 분류하는 문제를 말합니다.

이를 위해 분류 모델은 입력 데이터와 해당 데이터의 정답인 클래스 레이블 사이의 관계를 학습하여 새로운 데이터에 대한 클래스를 예측합니다.


붓꽃이란?

붓꽃은 세포핵을 둘러싼 꽃받침(sepal)과 꽃잎(petal)으로 구성되어 있으며, 이러한 특징을 기반으로 붓꽃의 품종을 식별할 수 있습니다.

붓꽃의 품종은 주로 다음과 같이 3가지로 분류됩니다:

  1. Setosa (세토사): Setosa는 붓꽃 중에서 가장 작은 꽃잎과 꽃받침을 가지고 있습니다.
    꽃잎과 꽃받침이 비교적 짧고 뾰족한 모습을 갖고 있으며, 주로 흰색 또는 연한 분홍색을 띠고 있습니다.

  2. Versicolor (버시컬러): Versicolor는 Setosa보다 크고 긴 꽃잎과 꽃받침을 가지고 있습니다.
    꽃잎의 색은 보통 연한 보라색이며, 중간 크기의 붓꽃입니다.

  3. Virginica (버지니카): Virginica는 붓꽃 중에서 가장 크고 긴 꽃잎과 꽃받침을 가지고 있습니다.
    꽃잎의 색은 주로 짙은 보라색이며, 다른 품종들에 비해 상대적으로 더 큰 크기를 갖고 있습니다.

저희는 3가지 붓꽃 품종을 예측하는 분류 문제를 해결하고자 합니다.

 

붓꽃 데이터 분류 예측을 위한 과정

1. 데이터 준비: 분류 모델을 학습하기 위해 입력 데이터와 클래스 레이블을 준비

2. 데이터셋 분리 : 전체 데이터를 학습 / 테스트 데이터로 분리

3. 모델 선택 & 학습 : 적절한 모델을 선택 & 학습 데이터로부터 모델 학습

4. 모델 예측 : 학습된 모델을 이용해 테스트 데이터의 분류를 예측

5. 모델 평가 : 예측된 결괏값과 테스트 데이터의 실제 결괏값을 비교해 모델 성능 평가


붓꽃 품종 예측

1. 라이브러리 설치

필요한 라이브러리를 설치하기 위해서는 먼저 파이썬 패키지 관리자인 pip를 사용하여 설치해야 합니다.

아래의 명령을 터미널 또는 명령 프롬프트에 입력하여 필요한 라이브러리를 설치할 수 있습니다

pip install pandas
pip install scikit-learn

2. 라이브러리 불러오기

from sklearn.datasets import load_iris # 붓꽃 데이터 생성 라이브러리
from sklearn.model_selection import train_test_split # 데이터셋을 학습, 테스트, 예측 데이터로 분리하는 라이브러리
from sklearn.tree import DecisionTreeClassifier # 트리기반 ML 알고리즘(의사결정나무)을 불러오는 라이브러리
from sklearn.metrics import accuracy_score # 정확도 평가 라이브러리
import pandas as pd # pandas 라이브러리

3. 데이터 준비

붓꽃 데이터를 불러오고, 입력 데이터(X)와 클래스 레이블(y)을 변수에 저장해보겠습니다.

iris = load_iris() 
X = iris.data # 피처 데이터
y = iris.target # 레이블 데이터
  1. iris = load_iris(): load_iris() 함수를 사용하여 scikit-learn 라이브러리에 내장되어 있는 붓꽃 데이터셋을 반환합니다.
  2. X = iris.data: iris.data 는 붓꽃 데이터셋의 입력 데이터를 나타냅니다.
    이 데이터는 꽃의 꽃잎 길이, 꽃잎 너비, 꽃받침 길이, 꽃받침 너비의 4가지 특성(feature)로 이루어져 있습니다.
    X 변수에 입력 데이터를 저장합니다.
  3. y = iris.target: iris.target은 붓꽃 데이터셋의 클래스 레이블을 나타냅니다.
    이 데이터는 꽃의 품종을 나타내는 정수 값으로 이루어져 있습니다.
    y 변수에 클래스 레이블을 저장합니다.

    코드를 실행하면 X 변수에는 입력 데이터가, y 변수에는 클래스 레이블이 저장되어 붓꽃 데이터셋이 준비된 상태가 됩니다. 이후 이 데이터를 활용하여 분류 모델을 학습하고 예측을 수행할 수 있습니다.
print("피처 데이터",X)

 

print("레이블 데이터",y)

4. 데이터셋 분리

데이터를 학습 데이터와 테스트 데이터로 나누어 보도록 하겠습니다.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

해당 코드는 붓꽃 데이터를 80%의 학습 데이터20%의 테스트 데이터분리하는 과정을 나타냅니다.

random_state=42를 사용하여 동일한 분할 결과를 재현할 수 있습니다. 

 

train_test_split 함수는 데이터를 학습 데이터와 테스트 데이터로 나누기 위해 사용됩니다.

이 함수는 입력된 데이터를 무작위로 섞은 후, 지정한 비율에 따라 학습 데이터와 테스트 데이터로 분할합니다.

 

< train_test_split(X, y, test_size=0.2, random_state=42) 파라미터 >

  • X: 특성 데이터 (꽃잎의 길이와 너비, 꽃받침의 길이와 너비)를 가진 2차원 배열
  • y: 타깃 데이터 (품종)를 가진 1차원 배열
  • test_size: 테스트 데이터의 비율을 나타내는 부동 소수점 수입니다.
    예를 들어, test_size=0.2는 데이터의 20%를 테스트 데이터로 사용하고 나머지 80%를 학습 데이터로 사용합니다.
  • random_state: 데이터를 분리하기 위한 난수 발생기의 시드 값입니다.
    동일한 random_state 값이 주어지면, 동일한 분할 결과가 생성됩니다. 이를 통해 재현 가능한 결과를 얻을 수 있습니다.

train_test_split 함수는 4개의 반환값을 가집니다

 

< X_train, X_test, y_train, y_test >

  • X_train: 학습 데이터의 특성 데이터
  • X_test: 테스트 데이터의 특성 데이터
  • y_train: 학습 데이터의 타깃 데이터
  • y_test: 테스트 데이터의 타깃 데이터
# 데이터셋이 8:2의 비율로 잘 분리가 되었는지 확인하는 코드

print("X_train: ",X_train.shape)
print("X_test: ",X_test.shape)
print("y_train: ",y_train.shape)
print("y_test: ",y_test.shape)

> X_train:  (120, 4)
> X_test :  (30, 4)
> y_train:  (120,)
> y_test :  (30,)

5. 모델 선택 & 학습

Decision Tree 분류 모델을 생성하고 학습시켜보겠습니다.

model = DecisionTreeClassifier()
model.fit(X_train, y_train)
  1. model = DecisionTreeClassifier(): DecisionTreeClassifier 클래스를 사용하여 Decision Tree 분류 모델을 생성합니다.
    DecisionTreeClassifier는 사이킷런에서 제공하는 Decision Tree 기반 분류 모델입니다.
    모델을 생성한 후에는 해당 모델을 변수 model에 할당합니다.
  2. model.fit(X_train, y_train): fit 메서드를 호출하여 모델을 학습시킵니다. 
    학습 데이터인 X_train과 그에 해당하는 타깃 데이터인 y_train을 인자로 전달합니다.
    모델은 주어진 학습 데이터를 사용하여 패턴을 학습하고, 결정 경계를 만들어 특성과 타깃 간의 관계를 모델링합니다.

이를 통해 모델은 주어진 특성 데이터를 사용하여 품종을 예측할 수 있게 됩니다. 학습된 모델은 model 변수에 저장되어 있습니다.

6. 모델 예측

학습된 Decision Tree 모델을 사용하여 테스트 데이터에 대한 예측을 수행해보겠습니다.

y_pred = model.predict(X_test)
y_pred

> array([1, 0, 2, 1, 1, 0, 1, 2, 1, 1, 2, 0, 0, 0, 0, 1, 2, 1, 1, 2, 0, 2,
       0, 2, 2, 2, 2, 2, 0, 0])

 

predict 메서드를 호출하여 테스트 데이터 X_test에 대한 예측값을 계산합니다.

X_test는 모델이 처음보는 데이터로, 이 데이터의 특성을 바탕으로 모델이 예측을 수행합니다.

예측 결과는 y_pred 변수에 저장됩니다.

 

y_pred는 예측된 품종의 레이블로 구성된 1차원 배열입니다.

각 원소는 해당 테스트 데이터의 예측된 품종을 나타냅니다.

예를 들어, y_pred[0]는 첫 번째 테스트 데이터의 예측 결과를 나타냅니다.

 

이렇게 예측된 결과는 모델의 성능을 평가하거나, 새로운 데이터에 대한 예측을 수행하는 등 다양한 용도로 활용할 수 있습니다.

7. 모델 평가

모델의 예측 결과를 평가하기 위해 정확도(accuracy)를 계산하고 출력해 보겠습니다.

accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

> Accuracy: 1.0

accuracy_score 함수를 사용하여 예측된 품종(y_pred)실제 품종(y_test)을 비교하여 정확도를 계산합니다.

정확도는 예측이 실제 값과 얼마나 일치하는지를 계산하여 측정합니다.

계산된 정확도는 accuracy 변수에 저장됩니다.

 

print 함수를 사용하여 계산된 정확도를 출력합니다.

이를 통해 모델의 성능을 확인할 수 있습니다. 정확도는 0과 1 사이의 값으로, 1에 가까울수록 예측의 정확도가 높음을 의미합니다.

이를 통해 모델이 얼마나 정확하게 품종을 예측하는지를 알 수 있습니다.

 

출력된 결과를 확인해 보니 정확도가 1이 출력되었습니다.

예측 결과의 정확도가 1로 출력되었다는 것은 모델이 테스트 데이터에 대해 100% 정확한 예측을 수행했다는 의미입니다.

즉, 모델이 테스트 데이터의 품종을 완벽하게 맞추었다고 볼 수 있습니다.

이는 매우 좋은 성능을 가진 모델이라고 할 수 있습니다.


모든 코드

from sklearn.datasets import load_iris # 붓꽃 데이터 생성 라이브러리
from sklearn.model_selection import train_test_split # 데이터셋을 학습, 테스트, 예측 데이터로 분리하는 라이브러리
from sklearn.tree import DecisionTreeClassifier # 트리기반 ML 알고리즘(의사결정나무)을 불러오는 라이브러리
from sklearn.metrics import accuracy_score # 정확도 평가 라이브러리
import pandas as pd # pandas 라이브러리

iris = load_iris() 
X = iris.data # 피처 데이터
y = iris.target # 레이블 데이터

print("피처 데이터",X)
print("레이블 데이터",y)

print("X_train: ",X_train.shape)
print("X_test: ",X_test.shape)
print("y_train: ",y_train.shape)
print("y_test: ",y_test.shape)

model = DecisionTreeClassifier()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
y_pred

accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

 

 

 

 

 

 

 

728x90
반응형