본문 바로가기
머신러닝

[사이킷런] 사이킷런 소개와 붓꽃 품종 예측하기

by 수픽 2021. 6. 2.

≫사이킷런 소개와 특징

사이킷런(scikit-learn)은 파이썬 기반의 머신러닝을 위한 가장 쉽고 효율적인 개발 라이브러리이다.

 

특징은 다음과 같다.

- 쉽고 가장 파이썬스러운 API 제공

- 머신러닝을 위한 매우 다양한 알고리즘과 편리한 프레임워크, API 제공

- 오랜 시간 실전 환경에 검증받아 성숙한 라이브러리

 

Anaconda를 설치하면 기본적으로 사이킷런까지 설치가 완료되고, sklearn.__version__으로 버전 정보를 확인할 수 있다.

import sklearn
print(sklearn.__version__)

사이킷런 버전 정보

 

≫머신러닝 만들기 - 붓꽃 품종 예측하기

붓꽃 데이터 세트는 꽃잎의 길이와 너비, 꽃받침의 길이와 너비 피처를 기반으로 꽃의 품종을 예측하기 위한 것이다.

분류(Classification)은 대표적인 지도학습(Supervised Learning) 방법의 하나이다.

지도학습은 학습을 위한 다양한 피처와 분류 결정값인 레이블(Label) 데이터로 모델을 학습한 뒤, 별도의 데이터 세트에서 미지의 레이블을 예측한다.

즉, 지도학습은 명확한 정답이 주어진 데이터를 먼저 학습한 뒤 미지의 정답을 예측하는 방식이다.


loard_iris()함수를 이용해 붓꽃 데이터 세트를 로딩한 후, 피쳐들과 데이터 값이 어떻게 구성되어 있는지 확인하기 위해 DataFrame으로 변환해보자.

 

붓꽃 데이터 세트 생성하는 데는 load_iris() 함수를 사용한다. ML 알고리즘은 의사 결정 트리 알고리즘을 구현한 DecisionTreeClassifier을 적용한다. 데이터 세트를 학습 데이터와 테스트 데이터로 분리하는 데 는 train_test_split() 함수를 사용한다. iris.data는 Iris 데이터 세트에서 피쳐만으로 된 데이터를 numpy로 가지고 있다. 그리고 iris.target은 붓꽃 데이터 세트에서 레이블 데이터를 numpy로 가지고 있다.

#붓꽃 데이터 세트 생성 load_iris() 함수, 의사 결정 트리 알고리즘을 구현한 DecisionTreeClassifier 적용
#데이터 세트를 학습 데이터와 테스트 데이터로 분리하는 train_test_split() 함수
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

#붓꽃 데이터 세트 로딩
iris=load_iris()

#iris.data는 Iris 데이터 세트에서 피쳐만드로 된 데이터를 numpy로 가지고 있음
iris_data=iris.data

#iris.target은 붓꽃 데이터 세트에서 레이블 데이터를 numpy로 가지고 있음
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)

결과

피쳐에는 sepal length, sepal width, petal length, petal width가 있다.

레이블은 0,1,2 세 가지 값으로 각각 Setosa 품종, versicolor 품종, virginica 품종을 의미한다.

 

[train_test_split() 함수]

학습 데이터로 학습된 모델이 얼마나 뛰어난 성능을 가지는지 평가하려면 테스트 데이터 세트가 필요하기 때문에 그 둘을 반드시 분리해야한다.

train_test_split() API는 test_size 파라미터 입력 값의 비율로 이 둘을 쉽게 분할한다.

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

 

해당 코드의 인자값과 반환값을 정리하면 다음과 같다.

인자값 반환값
피쳐 데이터 세트 : iris.data
레이블 데이터 세트 : iris_label
전체 데이터 세트 중 테스트 데이터 세트의 비율 : test_size = 0.2 (20%)
호출할 때마다 같은 학습/테스트 용 데이터 세트를 생성하기 위해 주어지는 난수 발생 값 : random_state
학습용 피처 데이터 세트 : X_train
테스트용 피처 데이터 세트 : X_test
학습용 레이블 데이터 세트 : y_train
테스트용 레이블 데이터 세트 : y_test

*random_state를 지정하지 않으면 수행할 때마다 다른 학습/데스트 용 데이터를 만들 수 있다. 

실습을 위해 동일한 숫자 값을 부여한다.

[DecisionTreeClassifier 의사 결정 트리 클래스]

학습 데이터를 기반으로 의사 결정 트리를 이용해 학습과 예측을 수행해보자.

생성한 DecisionTreeClassifier 객체fit() 메서드에 학습용 피쳐 데이터 속성과 결정값 데이터 세트를 입력해 호출하면 학습을 수행한다.

#객체 생성
dt_clf=DecisionTreeClassifier(random_state=11)
#학습 수행
dt_clf.fit(X_train, y_train)

 

이제 학습 데이터를 기반으로 학습이 완료됐다. 이제 학습된 DecisionTreeClassifier 객체를 이용해 예측을 수행하자.

예측은 반드시 학습 데이터가 아닌 다른 데이터를 이용해야하고, 일반적으로는 테스트 데이터 세트를 이용한다.

predict() 메서드에 테스트용 데이터 세트를 입력해 호출하면 학습된 모델 기반에서 테스트 데이터 세트에 대한 예측값을 반환하게 된다.

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

 

예측 결과를 기반으로 DesicionTreeClassifier의 정확도를 측정해 예측 성능을 평가해보자.

정확도란, 예측 결과가 실제 레이블 값과 얼마나 정확하게 맞는지를 평가하는 지표이다.

accuracy_score() 함수의 첫 번째 파라미터로 실제 레이블 데이터 세트, 두 번째 파라미터로 예측 레이블 데이터 세트를 입력하면 된다.

예측 정확도


붓꽃 데이터 세트로 분류를 예측한 프로세스는 다음과 같다.

1. 데이터 세트 분리 : 데이터를 학습 데이터와 테스트 데이터로 분리

2. 모델 학습 : 학습 데이터를 기반으로 ML 알고리즘을 적용해 모델을 학습시킴

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

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