머신러닝 스터디 - Scikit-Learn 맛보기

KIM TAEHO·2021년 10월 2일
0

ml

목록 보기
6/9
post-custom-banner

Scikit-Learn 이란

  • 파이썬 기반의 다른 머신러닝 패키지도 시이킷런 스타일의 API를 지향할 정도로 쉽고 가장 파이썬스러운 API를 제공합니다.
  • 머신러닝을 위해 매우 다양한 알고리즘과 개발을 위한 편리한 프레임워크와 API를 제공합니다.
  • 오랜 기간 실전 환경에서 검증됐으며, 매우 많은 환경에서 상용되는 성숙한 라이브러리입니다.
  • 주로 Numpy 와 Scpy 기반 위에서 구축된 라이브러리 입니다.

머신러닝을 위한 용어 정리

피처(Feature)

  • 데이터 세트의 일반 속성
  • 머신러닝은 2차원 이상의 다차원 데이터에서도 많이 사용되므로 타겟 값을 제외한 나머지 속성을 모두 피처로 지칭

레이블, 클래스, 타겟(값), 결정(값)

타겟값 또는 결정 값은 지도학습 시 데이터의 학습을 위해 주어지는 정답 데이터
지도 학습 중 분류의 경우에는 이 결정값을 레이블 또는 클래스로 지칭

지도학습 - 분류

분류(Classification)는 대표적인 지도학습(Supervised Learning) 방법의 하나입니다.
지도학습은 학습을 위한 다양한 피처와 분류 결정값인 레이블(Label) 데이터로 모델을 학습한 뒤, 별도의 테스트 데이터 세트에서 미지의 레이블을 예측합니다.

즉 지도학습은 명확한 정답이 주어진 데이터를 먼저 학습한 뒤 미지의 정답을 예측하는 방식입니다.
이 때 학습을 위해 주어진 데이터 세트를 학습 데이터 세트, 머신러닝 모델의 예측 성능을 평가하기 위해 별도로 주어진 데이터 세트를 테스트 데이터 세트로 지칭합니다.

사이킷런을 이용한 붓꽃 데이터 분류

사이킷런을 통해 첫 번째로 만들어볼 머신러닝 모델은 붓꽃 데이터 세트로 붓꽃의 품종을 분류(Classification) 하는 것입니다. 붓꽃 데이터 세트는 꽃잎의 길이와 너비, 꽃받침의 길이와 너비 피처(Feature)를 기반으로 꽃의 품종을 예측하기 위한것입니다.

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

  • 데이터 세트 분리
    데이터를 학습 데이터와 테스트 데이터로 분리합니다.
  • 모델 학습
    학습 데이터를 기반으로 ML 알고리즘을 적용해 모델을 학습시킵니다.
  • 예측 수행
    학습된 ML 모델을 이용해 테스트 데이터의 분류(즉, 붓꽃 종류)를 예측합니다.
  • 평가
    이렇게 예측된 결과값과 테스트 데이터의 실제 결과값을 비교해 ML 모델 성능을 평가합니다.

사이킷런을 이용하여 붓꽃(Iris) 데이터 품종 예측하기

# 사이킷런 버전 확인
import sklearn
print(sklearn.__version__)
0.19.1

붓꽃 예측을 위한 사이킷런 필요 모듈 로딩

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

데이터 세트를 로딩

import pandas as pd

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

# iris.data는 Iris 데이터 세트에서 피처(feature)만으로 된 데이터를 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)
iris target값: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
iris target명: ['setosa' 'versicolor' 'virginica']
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) label
0 5.1 3.5 1.4 0.2 0
1 4.9 3.0 1.4 0.2 0
2 4.7 3.2 1.3 0.2 0

학습 데이터와 테스트 데이터 세트로 분리

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

학습 데이터 세트로 학습(Train) 수행

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

# 학습 수행 
dt_clf.fit(X_train, y_train)
DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=None,
            max_features=None, max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, presort=False, random_state=11,
            splitter='best')

테스트 데이터 세트로 예측(Predict) 수행

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

예측 정확도 평가

from sklearn.metrics import accuracy_score
print('예측 정확도: {0:.4f}'.format(accuracy_score(y_test,pred)))
예측 정확도: 0.9333
profile
즐거운 개발공부
post-custom-banner

0개의 댓글