본문 바로가기

Lecture ML

머신러닝 강좌 #1] 나의 첫번째 머신러닝 프로그램

반응형

sklearn을 이용한 첫 번째 머신러닝 프로그램은 대중적으로 많이 알고 있는 iris Data Set을 이용한 꽃받침의 길이와 너비 피처(feature)를 기반으로 꽃의 품종을 예측하는 내용입니다.

 

분류(Classification)는 대표적인 지도 학습(Supervised Learning) 방법의 하나입니다. 지도 학습은 학습을 위한 다양하 피처와 분류 결정 값인 레이블(Label) 데이터로 모델을 학습한 뒤, 별도의 테스트 데이터 세트에서 미지의 레이블을 예측합니다. 즉 지도 학습은 명확한 정답이 주어진 데이터를 먼저 학습 한 뒤 미지의 정답을 예측하는 방식입니다. 이때 학습을 위해 주어진 데이터 세트를 학습 데이터 세트, 머신러닝 모델의 예측 성능을 평가하기 위해 별도로 데이터 세트를 테스트 데이터 세트로 지정합니다.

 

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

import pandas as pd
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)

#붓꽃 데이터 세트를 로딩합니다.
iris = load_iris()
print('feature names''s shape:', len(iris.feature_names))
print('feature names :', iris.feature_names)

print('target names''s shape:', len(iris.target_names))
print('target names :', iris.target_names)

print('data shape :', iris.data.shape)
print('data :', iris['data'])

print('target shape :', iris.target.shape)
print('target :', iris.target)

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


#iris.target은 붓꽃 데이터 세트에서 레이블(결정 값) 데이터를 numpy로 가지고 있습니다.
iris_label = iris.target
print(iris_label)
print(iris.target_names)

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

- 데이터 구조 -

 

다음으로 학습용 데이터와 테스트용 데이터를 분리합니다. 반드시 두 데이터는 분리해야 합니다. 학습 데이터로 학습된 모델이 얼마나 뛰어난 성능을 가지는지 평가하려면 테스트 데이터 세트가 필요하기 때문입니다. 이를 위해서 Scikit-Learn에서 train_test_split() API를 제공합니다. 

 

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

상기 예시는 iris_data를 이용하고, 각 데이터 컬럼명은 iris_label, test 데이터 사이즈는 전체 데이터의 20%로 지정하며 Fix값을 기준으로 프로그램 실행시 동일한 데이터를 가져온다는 내용입니다. random_state는 아무값으이나 넣어도 무방합니다. 학습데이터는 X_train과 y_test으로 두고 20%의 테스트데이터는 X_test, y_test변수로 들어가게 됩니다. 

 

dt_clf = DecisionTreeClassifier(random_state=11)

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

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

from sklearn.metrics import accuracy_score
print('예측 정확도', accuracy_score(y_test, pred))

이제 확보된 학습 데이터를 기준으로 분류(Classfication 알고리즘의 하나인 의사 결정 트리를 이용해 학습과 예측을 수행해 보겠습니다. fit()메소드에 학습용 피처 데이터 속성과 결정값 데이터 세트를 입력해 호출하면 학습을 수행합니다. 

 

다음은 predict()메소드를 이용한 예측을 진행합니다. 예측은 반드시 학습데이터가 아닌 테스트데이터를 이용해야 합니다. 일반적으로 테스트 데이터 세트를 이용합니다. 

 

이번에는 머신러닝 모델의 성능 평가 방법 중 정확도를 측정하겠습니다. accuracy_score()메소드를 이용하여 정확도를 측정할 수 있습니다. 정확도는 예측 결과가 실제 레이블 값과 얼마나 정확하게 맞는지를 평가하는 지표입니다. 예측한 붓꽃 품종과 실제 테스트 데이터 세트의 붓꽃 품종이 얼마나 일치하는지 확인하는 것입니다. 

 

상기 프로그램을 실행하면 "예측 정확도 0.9666666666666667"가 나와 본 모델은 정확도가 96%임을 나타냈니다.

 


데이터를 통해 예측을 하는 단계는 다음과 같이 요약이 됩니다.

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

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

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

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

 

 

반응형