본문 바로가기

Data Scientist

sklearn 기초 - 붓꽃 품종 예측하기

반응형

사이킷런(scikit-learn)은 파이썬 머신러닝 라이브러리 중 가장 많이 사용되는 라이브러리다. 

pip install scikit-learn
conda install sciket-learn

import sklearn
print(sklearn.__version__)

pip 또는 conda로 사이킷런을 인스톨하고 임포트 해준다.

버전확인까지 해주는 습관을 들이는 것이 좋다.

 

첫 번째로 만들어볼 머신러닝 모델은 붓꽃 데이터 세트로 붓꽃의 품종을 분류(classification)하는 것이다. 

가장 대표적이고 모르면 간첩이자 깔끔하게 정제된 데이터셋이기 때문에 입문용으로 모두가 안다고 한다...

 

붓꽃(iris) 데이터 세트는 꽃잎의 길이와 너비, 꽃받침의 길이와 너비 피처(Feature)를 기반으로

꽃의 품종을 예측하기 위한 것이다.

 

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

지도학습은 학습을 위한 다양한 피처와 분류 결정값인 레이블(Label) 데이터로 모델을 학습한 뒤, 

별도의 테스트 데이터 세트에서 미지의 레이블을 예측한다. 

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

이 때 학습을 위해 주어진 데이터 세트를 학습 데이터 세트, 머신러닝 모델의 예측 성능을 평가하기 위해 

별도로 주어진 데이터 세트를 테스트 데이터 세트로 지칭한다. 

보다 쉽게 말하면 데이터를 공부할 문제집과 모의고사 따로 나누어서 지정해준 뒤

(데이터셋을 학습데이터와 테스트 데이터로 분리하는 데는 train_test_split( ) 함수를 사용할 예정이다)

학습 후 시험 결과를 살펴보는 식이다. 

 

- sklearn.datasets 내의 모듈은 사이킷런에서 자체적으로 제공하는 데이터 세트를 생성하는 모듈의 모임이다.

- sklearn.tree 내의 모듈은 트리 기반 ML 알고리즘을 구현한 클래스의 모임이다. 

- sklearn.model_selection은 학습 데이터와 검증 데이터, 예측 데이터로 데이터를 분리하거나 최적의 

하이퍼 파라미터로 평가하기 위한 다양한 모듈의 모임이다. 

 <하이퍼 파라미터란 머신러닝 알고리즘별로 최적의 학습을 위해 직접 입력하는 파라미터들을 통칭하며, 

하이퍼 파라미터를 통해 머신러닝 알고리즘의 성능을 튜닝할 수 있다> 

 

여기선 붓꽃 데이터셋을 생성하는 데는 load_iris( )를 이용하며, ML 알고리즘은

의사 결정 트리(Decision Tree) 알고리즘으로, 이를 구현한 DecisionTreeClassifier를 적용한다. 

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

load_iris( ) 함수를 이용해 붓꽃 데이터 세트를 로딩한 후, 피처들과 데이터 값이

어떻게 구성되었는지 확인하기 위해 DataFrame 형태로 변환한다. 

 

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)

피처에는 sepal length, sepal width, petal length, petal width가 있다. (sepal: 꽃받침, petal: 꽃잎)

레이블(Label, 결정값)은 0, 1, 2 세 가지 값으로 되어 있으며 

0: Setosa, 1: vesicolor, 2: virginca 품종을 의미한다. 

테이블을 보면 품종에 따른 꽃잎과 꽃받침의 길이와 폭을 확인할 수 있다. 

다음은 아이리스 데이터를 가져와보았다. 

 

iris #iris데이터세트를 호출해보면 이렇게 장황하게 나온다...

{'DESCR': '.. _iris_dataset:\n\nIris plants dataset\n--------------------\n
\n**Data Set Characteristics:**\n\n    :Number of Instances: 150 (50 in each of three classes)
\n    :Number of Attributes: 4 numeric, predictive attributes and the class\n
:Attribute Information:\n       
- sepal length in cm\n       
- sepal width in cm\n        
- petal length in cm\n        
- petal width in cm\n      
- class:\n                
- Iris-Setosa\n                
- Iris-Versicolour\n              
- Iris-Virginica\n                \n    
:Summary Statistics:\n\n    ============== ==== ==== ======= ===== ====================\n 
Min  Max   Mean    SD   Class Correlation\n    ============== ==== ==== ======= ===== ====================\n    
sepal length:   4.3  7.9   5.84   0.83    0.7826\n    sepal width:    2.0  4.4   3.05   0.43   -0.4194\n   
petal length:   1.0  6.9   3.76   1.76    0.9490  (high!)\n    
petal width:    0.1  2.5   1.20   0.76    0.9565  (high!)\n    
============== ==== ==== ======= ===== ====================\n\n    
:Missing Attribute Values: None\n    :Class Distribution: 33.3% for each of 3 classes.\n    
:Creator: R.A. Fisher\n    :Donor: Michael Marshall (MARSHALL%PLU@io.arc.nasa.gov)\n   
:Date: July, 1988\n\nThe famous Iris database, first used by Sir R.A. Fisher. 
The dataset is taken\nfrom Fisher\'s paper. Note that it\'s the same as in R,
but not as in the UCI\nMachine Learning Repository, which has two wrong data points.
\n\nThis is perhaps the best known database to be found in the\npattern recognition 
literature.  Fisher\'s paper is a classic in the field and\nis referenced frequently 
to this day.  (See Duda & Hart, for example.)  The\ndata set contains 3 classes of 50 
instances each, where each class refers to a\ntype of iris plant.  One class is linearly
separable from the other 2; the\nlatter are NOT linearly separable from each other.\n\n..
topic:: References\n\n   - Fisher, R.A. "The use of multiple measurements in taxonomic problems"\n   
Annual Eugenics, 7, Part II, 179-188 (1936); also in "Contributions to\n     
Mathematical Statistics" (John Wiley, NY, 1950).\n  
- Duda, R.O., & Hart, P.E. (1973) Pattern Classification and Scene Analysis.\n   
(Q327.D83) John Wiley & Sons.  ISBN 0-471-22361-1.  See page 218.\n   
- Dasarathy, B.V. (1980) "Nosing Around the Neighborhood: A New System\n     
Structure and Classification Rule for Recognition in Partially Exposed\n     
Environments".  IEEE Transactions on Pattern Analysis and Machine\n     
Intelligence, Vol. PAMI-2, No. 1, 67-71.\n   - Gates, G.W. (1972) 
"The Reduced Nearest Neighbor Rule".  IEEE Transactions\n     
on Information Theory, May 1972, 431-433.\n   - See also: 1988 MLC Proceedings, 54-64. 
Cheeseman et al"s AUTOCLASS II\n     conceptual clustering system finds 3 classes in the data.\n 
- Many, many more ...',
 'data': array([[5.1, 3.5, 1.4, 0.2],
        [4.9, 3. , 1.4, 0.2],
 .
 .
 .
    
        [5.9, 3. , 5.1, 1.8]]),
 'feature_names': ['sepal length (cm)',
  'sepal width (cm)',
  'petal length (cm)',
  'petal width (cm)'],
 'filename': '/usr/local/lib/python3.6/dist-packages/sklearn/datasets/data/iris.csv',
 'target': array([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]),
 'target_names': array(['setosa', 'versicolor', 'virginica'], dtype='<U10')}

호출하면 장황하게 이런 저런 얘기를 하고 data, target, filename, target_names 등의 자료들이 나온다. 

데이터가 2차원 형태로 되어 있음을 알 수 있다. 

앞선 코드들과 대조해보면 왜 저런 코드를 썼는지 얼추 이해가 된다. 

 

# 학습용 데이터와 테스트용 데이터 분리
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을 사용한다. 

여기선 test_size를 0.2로 입력했는데 전체 데이터 중 테스트 데이터가 20%, 학습 데이터가 80%가 된다. 

첫번째 파라미터인 iris_data는 피처 데이터 세트이고, iris_label은 레이블 데이터 세트다. 

마지막 파라미터인 random_state은 호출할 때마다 같은 학습/테스트용 데이터를

생성하기 위해 주어지는 난수 발생 값이다.

train_test_split( )는 호출 시 무작위로 데이터를 분리하므로 random_state를 지정하지 않으면

수행할 때마다 다른 학습/테스트용 데이터를 만들 수 있다. (숫자는 아무거나 해도 상관없다)

 

학습용 피처 데이터 세트를 X_train, 테스트용 피처 데이터 세트를 X_test.

학습용 레이블 데이터 세트를 y_train, 테스트용 레이블 데이터 세트를 y_test로 반환한다. 

 

이제 학습 데이터를 확보했으니 이 데이터를 기반으로 머신러닝 분류 알고리즘의

하나인 의사 결정 트리를 이용해 학습과 예측을 수행한다.

먼저 사이킷런의 의사결정트리클래스인 DecisionTreeClassifier를 생성한다.

생성된 DecisionTreeClassifier 객체의 fit( ) 메소드에 학습용 피처 데이터 속성과

결정값 데이터 세트를 입력해 호출하면 학습을 수행한다. 

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

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


DecisionTreeClassifier(ccp_alpha=0.0, 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='deprecated',
                       random_state=11, splitter='best')

객체 생성 후 학습을 수행하면 이와 같이 여러 파라미터들을 알아서 할당해서 반환한다. 

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

DecisionTreeClassifier 개체의 predict( ) 메소드에 테스트용 피처 데이터 세트를 입력해 호출하면 학습된

모델 기반에서 테스트 데이터 세트에 대한 예측값을 반환하게 된다. 

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

예측 결과를 기반으로 의사 결정 트리 기반의 DecisionTreeClassifier의 예측 성능을 평가해 보면

(다양한 방법이 있지만 여기선 정확도로 평가) 정확도는 예측 결과가 실제 레이블 값과

얼마나 정확하게 일치하는지 확인해본다. 

사이킷런은 정확도 측정을 위해 accuracy_score( ) 함수를 제공한다. 

acuuracy_score( )의 첫 번째 파라미터로 실제 레이블 데이터 세트,

두 번째 파라미터로 예측 레이블 데이터 세트를 입력하면 된다. 

 

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

예측 정확도: 0.933333

정확도가 93.33%라고 한다. 코드의 {0:4f}는 소수점 넷째 자리까지 나오게 하라는 뜻이다. 

처음봤을 땐 엥 이게 다인건가 뭐한거지 싶었다.. 지금도 잘 모르겠긴 하다. 

좀 더 이해를 돕기 위해서 하나씩 쳐봤다. 

보면 총 30개 중에서 2개만 다른 것을 확인할 수 있다. 2/30=약 6.7%정도로 93%의 정확도를 뜻한다는 것을

다시 한번 확인할 수 있었다. 

 

프로세스 정리:

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

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

3. 예측 수행: 학습된 ML 모델을 이용해 테스트 데이터의 분류(즉, 붓꽃 종류)를 예측한다.

<학습모델 통한 테스트 데이터의 레이블 값을 예측하는 것이다> 

(자꾸만 레이블같은 단어가 입에 안붙어서 개념이 헷갈린다..)

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

 

 

작성기준: 파이썬 머신러닝 완벽 가이드 

http://www.yes24.com/Product/Goods/87044746

 

파이썬 머신러닝 완벽 가이드

『파이썬 머신러닝 완벽 가이드』는 이론 위주의 머신러닝 책에서 탈피해 다양한 실전 예제를 직접 구현해 보면서 머신러닝을 체득할 수 있도록 만들었다. 캐글과 UCI 머신러닝 리포지토리에서 난이도가 있는 실습 데이터를 기반으로 실전 예제를 구성했고, XGBoost, LightGBM, 스태킹 기법 등 캐글의 많은 데이터 사이언스에서 애용하는 최신 알고리즘과 기...

www.yes24.com

😁

반응형

'Data Scientist' 카테고리의 다른 글

웹크롤링(Requests & BeautifulSoup)  (0) 2020.02.26
사이킷런 주요 모듈정리  (0) 2020.02.24
군집화(K-means clustering)  (0) 2020.02.16
빅데이터를 지배하는 통계의 힘  (0) 2020.02.11
판다스 한번에 정리하기  (0) 2020.02.11