AI 머신러닝 딥러닝/파이썬 머신러닝 입문 공부일지

파이썬 머신러닝 입문 공부일지 10. 첫 번째 머신러닝 만들기 - 붓꽃 품종 예측하기 (2)

Tomitom 2023. 1. 4. 12:54
반응형

 

지난 번 포스팅에 이어서 붓꽃 품종 예측을 시작해봅니다. 

이전에 공부했던 것을 간단하게 리뷰해봅니다. 

 

사이킷런의 특징

  • 파이썬 친화적인 API
  • 머신러닝 알고리즘을 손쉽게 사용할 수 있는 API
  • 레거시(레거시 시스템은 낡은 기술이나 방법론, 컴퓨터 시스템, 소프트웨어 등을 뜻한다.)가 강력한 API. 오랫동안 쓰여 왔기에 신뢰도가 높다

사이킷런 없을 때 설치 절차

  1. 아나콘다 프롬프트를 연다.
  2. conda env list 명령어로 가상 환경 목록 확인
  3. conda activate 로 가상환경을 변경
  4. pip install scikit-learn==1.0.2 명령어로 설치

붓꽃 품종 예측하기 예제

  • 붓꽃 데이터 세트로 품종 예측하기
  • 피처로는 꽃잎의 길이와 너비, 꽃받침의 길이와 너비가 주어진다.
  • 피처란, 학습을 위해 주어지는 단서(특징) 데이터를 말한다.
  • 레이블이란 분류 결정값을 뜻하는 것으로 결과 카테고리라 할 수 있다.

 

붓꽃은 꽃잎의 너비와 길이, 꽃받침의 너비와 길이에 따른 품종이 다릅니다. 

 

 

 

 

우리는 이 레이블들을 모아 다양한 붓꽃의 종류를 분류해봅니다. 

 

 

 

붓꽃 데이터 분류 예측 프로세스 과정 

  • 데이터 세트 분리 : 데이터를 학습 데이터와 테스트 데이터로 분리합니다. -> train_test_split()
  • 모델 학습 : 학습 데이터를 기반으로 한 머신러닝 알고리즘을 적용해 모델을 학습시킵니다.  -> fit() 
  • 예측 수행 : 학습된 머신러닝 모델을 이용해 테스트 데이터의 붓꽃 종류를 예측합니다. -> predict() 
  • 평가 : 예측된 결과값과 테스트 데이터의 실제 결과값을 비교해 모델의 성능을 평가합니다. -> accuracy_score() 

 

사이킷런 패키지에서 사용할 모듈의 목록은 다음과 같습니다. 

 

사이킷런 하위 모듈 종류

  • dataset : 자체적으로 제공하는 데이터 세트 (알고리즘 학습용)
  • tree : 트리 기반 머신러닝 알고리즘 구현 클래스 모음
  • model_selection : 학습 데이터와 검증 데이터, 예측 데이터를 분리하거나 평가하기 위한 기능

 

(1) sklearn.datasets : 사이킷런에서 자체적으로 제공하는 데이터 세트를 생성 모듈 모임 

자체적으로 제공하는 데이터 세트에 붓꽃 데이터도 포함되어 있습니다.

load_iris() 를 이용해서 붓꽃 데이터 세트를 생성할 수 있습니다.

 

(2) sklearn.tree : 트리 기반 머신러닝 알고리즘 구현 클래스 모임

머신러닝 알고리즘은 의사 결정 트리 Decision Tree 알고리즘으로 이를 구현한 DecisionTreeClassifier 을 임포트 합니다.  의사 결정 트리란 일련의 분류 규칙을 통해 데이터를 분류하는 지도 학습 모델입니다.

 

 

타이타닉 탑승객 생존 여부 관련된 의사결정트리

 

이렇게 특정 질문에 따라 데이터를 구분하는 것을 의사 결정 트리 모델이라고 하고,

결정 트리에서 질문이나 정답은 노드Node 라고 불립니다. 그리고 맨 처음의 분류 기준을 Root Node 루트 노드 라고 해요. 

자세한 것은 이후에 머신러닝 주요 알고리즘 기법을 확인할 때 더 알아보겠습니다. 

 

(3) skelarn.model_selection : 학습 데이터와 검증 데이터, 예측 데이터로 데이터를 분리하거나 최적의 하이퍼 파라미터로 평가하기 위한 모듈 모임 

 

하이퍼 파라미터란?

최적의 학습을 위해 직접 입력하는 파라미터로 하이퍼 파라미터를 통해 머신러닝 알고리즘의 성능을 튜닝할 수 있습니다.

그리고 학습 데이터와 테스트 데이터로 분리할 때에는 train_test_split() 함수를 사용합니다. 

 

1. 사이킷런 모듈 임포트

 

이제 주피터 노트북을 생성하여 사이킷런 버전이 맞는지 확인하여 주세요. 

 

import sklearn 
print(sklearn.__version__)

 

사이킷런 모듈을 임포트 합니다. 

 

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

 

 

반응형

 

 

2. iris dataset 로드

 

사이킷런이 자체적으로 제공하는 데이터 세트 중에 붓꽃 데이터 세트를 로드합니다. 
load_iris() 함수를 사용해서 데이터 세트를 불러온 뒤 데이터의 구성을 확인하기 위해 데이터 프레임으로 변환합니다. 

붓꽃 데이터 세트를 로딩하면 data 와 target 을 가지는데, 모두 ndarray 배열 형태의 자료입니다. 

 

  • data : 피처 데이터 셋
  • feature_name : 피처 데이터 셋의 이름
  • target : classification에서는 라벨 데이터, regression에서는 결과 데이터
  • target_name : 라벨 데이터 이름
  • DESCR : 각각에 대한 설명

 

import pandas as pd

# 붓꽃 데이터 세트를 로딩합니다. 
iris = load_iris()

# iris.data는 Iris 데이터 세트에서 피처(feature)만으로 된 데이터를 numpy로 가지고 있습니다. 
# 피처 데이터 = 넘파이 ndarray
iris_data = iris.data

# iris.target은 붓꽃 데이터 세트에서 레이블(결정 값) 데이터를 numpy로 가지고 있습니다. 
# 문자열 형태는 머신러닝 알고리즘에 부적합하기에, 0~2 숫자 형태로 주어집니. 
iris_label = iris.target
print('iris target값:', iris_label)
print('iris target명:', iris.target_names)

# 붓꽃 데이터 세트를 자세히 보기 위해 DataFrame으로 변환합니다. 
iris_df = pd.DataFrame(data=iris_data, columns=iris.feature_names)
iris_df['label'] = iris.target
iris_df.head(3)

 

 

iris_data 에서 .data는 피처(특성feature)가 되고 target은 결정값(레이블lable)이 됩니다. 

즉, data 피처를 이용해서 예측한 결과를 target 레이블과 비교하여 분류를 합니다. 

 

그런데 머신러닝 알고리즘에서 통상 문자열 형태는 data 피처에 부적합하기 때문에 0~2의 형태로 주어집니다. 

iris target 값을 확인했을 때 0과 1, 2 로 구성된 데이터를 확인할 수 있죠. 

 

target은 우리가 분류를 해야할 결정값입니다. 

target_name 으로 분류할 타겟의 이름을 확인합니다. 

 

그리고 붓꽃 데이터를 시각화하여 자세히 보기 위해 데이터 프레임으로 변환하였습니다. 

 

 

 

3. 학습용 데이터와 테스트용 데이터 분리 

 

데이터를 분리하기 위해서는 train_test_split() API를 사용합니다. 

학습 데이터와 테스트 데이터를 test_size 파라미터의 입력값 비율로 쉽게 분할합니다. 

예를 들어 test_size = 0.2 를 입력하면 전체 데이터 중 테스트 데이터가 20%, 학습데이터가 80%로 데이터가 분할 되는 것입니다.

 

 

X_train, X_test, y_train, y_test = train_test_split(iris_data, iris_label, 
                                                    test_size=0.2, random_state=11)

 

 

train_test_split() 의 파라미터를 하나씩 살펴볼게요. 

  • iris_data : 피처 데이터 세트 
  • iris_label : 레이블 데이터 세트 
  • test_size : 전체 데이터 세트 중 테스트 세트의 비율 
  • random_state : 수행할 때마다 동일한 결과를 얻기 위해 적용합니다.  가령 1~100까지의 랜덤 번호 중에 100개의 데이터를 0.2 사이즈로 분할할 때 해당 함수를 처음 실행할 때에는 1~80번이 train,  81~100 번이 test가 될 수 있지만,  다시 수행하면 21~100  이 train, 1~20이 test가 될 수 있습니다.  즉, 호출할 때마다 비율은 같지만 추출한 레코드가 달라지는 것이지요.  random_state 를 설정하면 seed의 값을 고정시키기 때문에 여러번 수행하더라도 같은 랜덤 함수의 값을 받을 수 있습니다. 즉, 어떤 숫자를 적든 그 기능은 같기 때문에 숫자는 뭐든 적어도 상관 없습니다. 

 

  • 학습용 피처 데이터 세트 : X_train
  • 학습용 레이블 데이터 세트 : y_train
  • 테스트용 피처 데이터 세트 : X_test
  • 테스트용 레이블 데이터 세트 : y_test

 

4. 결정 트리로 학습과 예측 수행

 

머신러닝 분류 알고리즘 중 하나인 의사 결정 트리를 이용해서 학습과 예측을 수행합니다. 

우선 의사 결정 트리 클래스DecisionTreeClassfier 로 객체를 생성합니다. (random_state 는 고정값을 위한 것으로 숫자에 의미를 두지 마세요!) 

 

생성한 객체 df_clf 를 fit() 메소드에 학습용 피처데이터 속성과 결정값 데이터 세트를 입력해서 수행합니다. 

즉, 훈련 데이터가 준비되었다면, 머신러닝의 목적에 맞게 훈련을 시켜야 하는데 그 '훈련하라' 에 해당하는 것이 fit입니다. 

 

  • predict() 는 이렇게 훈련시킨 모델에 데이터를 주고 X_test 테스트 데이터 세트에서 예측을 해보라고 하는 것이에요. 테스트 데이터 세트에 의한 예측 값을 반환합니다. 

 

  • accuracy_score() 는 훈련시킨 데이터의 정확도를 알아봅니다. 첫 번째 파라미터에는 실제 레이블 데이터 세트, 두 번째 파라미터에는 예측 레이블 세트를 입력하면 됩니다.  실제 데이터 세트와 예측 데이터 세트 사이의 정확도를 알아봅니다. 

 

# DecisionTreeClassifier 객체 생성 
dt_clf = DecisionTreeClassifier(random_state=11)

# 학습 수행 
dt_clf.fit(X_train, y_train)

# 학습이 완료된 DecisionTreeClassifier 객체에서 테스트 데이터 세트로 예측 수행. 
pred = dt_clf.predict(X_test)

# 정확도 측정
from sklearn.metrics import accuracy_score
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))

 

학습한 의사 결정 트리의 알고리즘 예측 정확도가 9.333 으로 측정 되었습니다. 

 

여기까지 사이킷런을 사용하는 전반적인 방법과 기능들을 알아보았습니다. 

이 다음에는 사이킷런 기반의 프레임워크들에 대해서 알아볼게요. 

 

 

 

 

 

 

 

반응형