본문 바로가기

IT 로그

머신러닝 왕초보 - 붓꽃 품종 예측

728x90
반응형

출처 : 위키백과

import sklearn

파이썬에서 가장 만만하게 사용하는 붓꽃 데이터셋 

사이킷런을 통해 해당 데이터로 머신러닝 모델을 만들어보자 

 

붓꽃 데이터셋으로 붓꽃의 품종을 classification 해보자 ! 

 

분류는 대표적인 지도학습이다 

그러니까 예측하려는 애 (피처: feature) 가 정해져있는 머신러닝이다. 

지도학습은 쉽게 말하면 정답이 주어져 있는 데이터로 먼저 컴퓨터를 학습 시킨 다음에 

미지의 정답을 예측하는 방법이다. 

 

데이터 세트를 아래 처럼 분류 한다 

- 학습을 위한 학습 데이터 set 

- 머신러닝 모델의 예측 성능 평가를 위한 테스트 데이터 set 

 

바로 코드를 처보자 !
import sklearn

1.  sklearn 모듈을 import 한다 

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

2. 코드를 상세하게 보자 

skelarn.datasets  : 사이킷런에서 자체적으로 제공하는 데이터 셋을 생성하는 모듈의 모임 

skelarn.tree : 트리기반 ML(Machine Learning) 알고리즘을 구현한 클래스 모임

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

--- 파이썬은 이렇게 내장된 모듈을 가져다 쓰기 좋은 언어이다 

* 하이퍼 파라미터 가 뭐야 ? : 머신러닝 알고리즘 별로 최적의 학습을 위해 직접 입력하는 파라미터를 통칭한다. 우리는 하이퍼 파라미터를 통해 머신러닝 알고리즘 성능을 튜닝할 수 있다. 

load_iris : skelarn.datasets 안에서 붓꽃 데이터를 가져온다

DecisionTreeClassifier : 의사결정 트리 알고리즘을 구현한 것 * 이걸가져다 쓰면 의사결정나무를 적용할 수 있다

train_test_split : 학습, 테스트 데이터셋을 분리하는데 사용하는 함수이다. 

 

3. 붓꽃 데이터 셋을 살펴보자 

iris = load_iris()

 load_iris()로 붓꽃 데이터셋을 불러왔다 

 

음... 2차원 list로 되어 있는거 같다 

 

iris_data = iris.data

iris 데이터 셋 안에 data. target, target_names 등의 속성값들이 있다.

그중 data를 불러보면 이렇게 피처(예측에 활용되는 데이터) 값 으로만으로 된 데이터가 들어 있는 것을 보고 있다 

iris.target은 어떨까?

iris_label = iris.target

1차원 리스트안에 0,1,2 가 있다. 

target안에는 붓꽃 데이터의 품종을 나타내는 레이블 (결정값 : 정답) 데이터를 numpy 형태(숫자형태)로 가지고 있다. 

그래서 iris_label이라는 변수를 만들어 target값을 넣어준다

이건 좀있다 머신러닝을 할때 파라미터로 이용하려고 이렇게 변수로 만들어주는 거다.

target_names 속성도 확인해보자 

print('target 명 :', iris.target_names)

target을 확인해보니['setosa' 'versicolor' 'virginica'] 이렇게 있다
이게 품종 이름인 셈이다 
각각 setosa  : 0 , versicolor :1  virginica : 2 를 의미한다. 

 

4. 붓꽃 데이터를 더 자세히 보자 

위에서 보기 힘들었던 붓꽃 데이터의 피처 값들을 자세히 보기 위해 DataFrame으로 변환한다. DataFrame으로 변환하기 위해서는 pandas라는 모듈이 필요하다 

import pandas as pd # as pd 는 pandas의 별명은 pd야 ! 이런 의미

iris_df = pd.DataFrame(data= iris.data, columns = iris.feature_names)
iris_df['label'] = iris.target
iris_df.head(3)

pd.DataFrame : 판다스 모듈에서 DataFrame 을 명령어로 처주면 데이터셋을 데이터프레임 형태로 변환해준다. iris_df['label'] : 변환된 데이터 셋에 레이블 값을 column으로 하나 더 넣어주는 작업이다. iris 데이터셋의 target 데이터를 label이라는 칼럼으로 iris_df 데이터프레임에 추가해준다. 

보면 label이라는 이름으로 칼럼이 하나 추가 되었다.

head() :

데이터프레임에서 위에 있는데이터 일부만 볼때 사용하는 함수이다.

위에 5개 데이터를 봤다. sepal(꽃받침) 길이 ,너비 petal(꽃잎) 길이, 너비 등이 column으로 있다. 이게 예측에 활용되는 값 즉 feature 값이 된다 .

5. 학습용, 테스트용으로 데이터를 분리하자 

이 작업을 안하면 사실상 머신러닝 성능 평가가 안되기 때문에 제대로 돌아가는지 확인이 어렵다 

사이킷런은 감사하게도 train_test_split()이라는 API 를 제공하기 때문에 그저 가져다 사용만 하면된다. 

주어진 데이터셋에서 몇대몇으로 학습과 테스트에 분류할건지를 파라미터(인자) 값으로 정해야 한다. 

보통 학습에 0.8, 테스트에 0.2 를 적용하는데 이건 데이터의 80%는 학습에 20%는 성능 검증에 이용한다는 의미이다. 

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

iris_data 는 꽃받침 길이 너비, 꽃잎 길이 너비 같은 feature 값을 의미하고 

iris_label 에는 iris.target_names였던 setosa를 비롯한 3가지 품종이 들어가 있다.  

test_size = 0.2로 입력해주면 나머지 train_size = 0.8로 알아서 분할한다. 

random_state : 호출할때마다 같은 학습, 테스트용 데이터 셋 생성을 위해 주어지는 난수 발생값 

* train_test_split () 는 호출할때 무작위로 데이터를 분리하기 때문에 random_state를 사용하지 않으면 매번 다른 결과값을 가져온다. 예제에서는 수행시마다 동일한 값을 부르기 위해 11이라는 임의의숫자를 썼고 아무 숫자나 사실 상관없다.

X_train 은 학습용 피처 데이터셋 , X_test는 테스트용 피처 데이터셋

y_train 은 학습용 레이블 데이터셋 , y_test는 테스트용 레이블 데이터셋

 

5. 데이터 확보도 끝났겠다 진짜 머신러닝 학습과 예측을 수행해보자 ! 

* 의사결정 트리클래스 DecisionTreeClassifier를 객체로 생성하자 

분류에는 다양한 알고리즘이 있는데 여기서는 의사결정 나무를 사용해본다. 

dt_clf = DecisionTreeClassifier(random_state=11)

여기서 random_state =11 을 정해주는건 위와 마찬가지 이유에서이다 수행할때마다 같은 값을 나오게 하기 위함이다. 

* 학습 시켜주자 인공지능에 밥을 준다는 느낌이다. 

dt_clf.fit(X_train, y_train)

fit이라는 함수를 사용해서 학습해주면 된다. 외우기도 쉬울듯

fit 시켜준다 ~~! 

이제 저 dt_clf라는 객체는 학습을 했다. 똑똑해졌다.

학습된 애로 예측을 해보고 성능을 보면 진짜 똑똑한지 아니면 바보인지 알수 있을 것이다.

pred = df_clf.predict(X_test)

예측이라는 말을 그대로 영어로 번역한 preict 함수를 써준다. 테스트용 피처 데이터셋인 X_test가 파라미터이다. 

pred에는 이제 예측한 결과가 들어가 있다. 

예측 결과의 성능을 측정해볼건데 여러가지 방법이 있지만 일단 가장 보편적인 accuracy 정확도 측정을 해보자 

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

y_test는 아까 분할해놓은 실제 데이터셋을 의미하고 

pred는 예측한 결과를 의미한다.

sklearn.metrix 안에는 accuracy_score 라는 정확도 측정함수를 제공한다. 

accuracy_score 은 실제 데이터셋을 첫 파라미터, 예측한 결과를 두번째 파라미터로 입력해서 사용해주면 된다. 

 

예측정확도: 0.9333

 

예측정확도를 확인해보면 93% 나 된다.

 

 

------------------------

 

정리하면 머신러닝은 결국... 

1. 데이터셋 분리 > 2. 모델학습 > 3. 예측 수행 > 4. 평가 

 

이것만 하면 끝이다.

 

 

출처 : 파이썬 머신러닝 완벽가이드 ; 권철민 (위키북스) 

 

반응형