1-0 Scikit-learn 라이브러리 지원 Iris flowers 예제

codingart(66)
Published in
#kr
Words
789
Reading
4 min
Listen
Play
7y

Iris flowers Classification 문제는 2019년 텐서플로우 홈페이지 리모델링 전에 있었던 예제로서 붓꽃 꽃잎 사이즈와 꽃받침 사이즈 데이터를 사용하여 세부적으로 종을 분류하는 Scikit-learn 라이브러리 사용법을 배우는데 좋은 예로서 이미 교보문고에서 출판된 필자의 “파이선 코딩 초보자를 위한 텐서플로우 OpenCV 머신 러닝” 1장에서 아나콘다 tensorflow 가상환경 설치를 주제로 이미 다루었던 내용이기도 하다.

noname01.png

아래의 인터넷 주소에서 클론 작업을 통해 ZIP 파일을 받아와 압축을 해제하고 설치한다.
https://github.com/tensorflow/models
폴더 즉 models/samples/core/get_started/에서 premade_estimator.py 파일과 iris_data.py 파일을 작업하기 좋은 위치에 함께 저장한다. 아나콘다에서 일차적으로 iris_data.py를 실행하여 데이터 파일을 생성한 다음 premade_estimator.py를 실행하면 아래와 같은 분석 결과가 얻어진다.(※ 실제로는 iris_data.py를 직접 실행하지 않아도 premade_estimator.py 코드 앞부분에서 불러들여 실행하는 구조로 되어 있으므로 참조하기 바란다)

공식 사이트에서 주어졌던 결과와 비교해 보면 Virginica에서 오차가 상당히 큼을 알 수 있다. 매번 실행할 때 마다 Shuffling 및 랜덤 넘버 사용에 따라 3가지 결과에 꽤 변동이 있을 수 있으나 틀린 것이 아님에 유의하자.

아나콘다 스파이더3 편집기에서 붓꽃 예제를 다루기 위해서는 Scikit-learn 라이브러리 모듈이 사전에 설치되어 있어야 한다. 설치 방법은 가상환경 설치 방법을

noname02.png

참고하도록 한다. 아나콘다에서 텐서플로우 가상환경이 마련되어 있으면 아나콘다 명령 창에서 tensorflow를 활성화 시킨 후 command line 명령인 pip install sklearn 를 실행시키면 된다. 튜토리얼에 따라서는 pip3를 사용을 권장하는 경우도 있는데 그 문제는 아나콘다 명령 창에서 conda list 명령을 실행하여 pip 이나 pip3 디렉토리 중 이미 설치되어 있는 것을 확인하여 사용하는 문제로 귀착된다.

noname03.png

이와 같이 텐서플로우 가상환경에 sklearn 라이브러리 모듈이 설치되면 가상환경 내에 설치된 라이브러리 모듈들 간에 상호종속성(depencendy)이 확인되므로 함께 불러내어 사용이 가능하다. NumPy, Matplotlib, Pandas 들이 이미 설치되어 있을 것이다. 하지만 이 가상환경을 벗어나게 되면 라이브러리 모듈을 불러 올 수 없음에 유의한다.

굳이 텐서플로우 가상환경에 Scikit-learn 라이브러리인 sklearn을 설치하면 하나의 환경 하에서 텐서플로우로 머신 러닝을 하다가 Scikit-learn 으로 스위치하여 작업해도 아무런 문제가 없으며 이미 설치된 NumPy를 비롯 기본적인 라이브러리들이 상호 묶어져 있어 다시 설치할 필요가 없다.

Sklearn 라이브러리 모듈을 사용하는 붓꽃 식별 코드를 다루어 보자. 이 문제를 풀기 위해서 Pandas를 비롯 여러 개의 sklearn 라이브러리 모듈들을 아래와 같이 불러들인다. 이 부분은 수정없이 그대로 사용하기로 한다. 불러들이는 라이브러리 모듈들의 숫자가 좀 많아 보이지만 각론으로 다루게 될 내용을 미리 함꺼번에 다루어 보는 기회로 보면 될 것이다. 특히 후반부를 보면 linear regression을 비롯하여 LDA 및 SVM(Support Vector Machine) 모델까지 다루고 있음을 알 수 있다. LDA 및 SVM 기법 은 별도로 상세히 다루어 보기로 하며 여기서는 개괄적인 비교 작업에 국한하기로 한다.

noname04.png

아래의 코드에서처럼 인터넷 url 주소에서 Iris.data를 다운 받아 변수명 dataset 으로 선언한다, 데이터 파일의 확장자는 .csv 로서 pandas 라이브러리 모듈은 csv 데이터를 읽도록 특화되어 있다.

noname05.png

dataset.head(10) 의 출력은 첫 번째 즉 0번에서 열 번째 즉 9번까지의 데이터를 출력한다. 아울러 dataset.tail(10) 명령을 사용하면 끝부분의 10개 데이터를 출력하며 전체를 출력하고 싶으면 셸(Shell)에서 dataset을 실행시키면 된다.
dataset.describe()는 데이터 전체의 평균, 표준편차, 최대, 최소값을 포함하는 통계치를 계산하는 명령이며 dataset.groupby(‘class’).size()는 csv 데이타 파일의

noname06.png

‘class’ 행 데이터를 대상으로 내용을 구분하여 총 샘플 수를 출력해준다.

noname07.png

총 5행으로 구성되는 붓꽃 데이터는 각각 꽃받침의 길이와 폭, 꽃잎의 길이와 폭, 아울러 해당 꽃의 세부 종의 명칭으로 구성된다.

noname08.png

이 데이터를 Classification 목적으로 사용하기 위해서 다음과 같이 처리과정을 거치도록 한다. 꽃받침과 꽃잎 사이즈 데이터는 X 어레이, 꽃의 종명 즉 라벨명은 Y어레이로 둔다. validation_size는 머신 러닝 단계에서 학습용 데이터와 테스트용 데이터로 나누는 비율을 뜻한다. Iris_data 는 3개 종별로 각 50개씩 총 150 개로 이루어지므로 0.2는 총30개로서 각 종별 10개의 임의로 선택된 검증용 테스트 데이터를 뜻한다.
seed =7 은 난수 생성을 위한 초기 값으로서 항상 동일한 난수발생 결과를 주도록 한다.

noname09.png

sklearn 라이브러리 모듈을 사용하여 모델별로 머신 러닝 실행을 준비하자. 붓꽃의 세부적인 종을 구분하기 위하여 적용하는 선형 모델과 비선형 모델 모두를 포함하는 머신 러닝 모델들이다. 아래의 모델 중 GaussianNB를 제외한 모델들은 각각 1장의 각론에서 세부적으로 다루니 참고하기 바란다.

noname10.png

Scikit-learn 라이브러리 모듈은 TensorFlow 와는 별도로 발전해 온 오픈소스이므로 한편 이 문제에 대한 97% 수준의 TensorFlow 해도 1장에서 별도로 다루기로 한다. 그밖에 별도로 연구한 기법을 사용하면 100%의 식별도 가능한데 LDA 기법편과 공분산 효과를 감안한 Softmax 편에서 다루어 보기로 한다.

준비된 데이터와 모델을 사용 코드를 실행하여 결과를 출력한다.
noname11.png

실행결과에 의하면 SVM(Support Vector Machine)기법이 가장 정확한 결과를 주고 있다.

noname12.png

첨부된 파이선 코드를 다운 받아 실행해 보자.
#spyder_ex_01.py
#Load libraries
import pandas
from pandas.plotting import scatter_matrix
import matplotlib.pyplot as plt
from sklearn import model_selection
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
#Load dataset
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = pandas.read_csv(url, names=names)
print (dataset.head(10))
print (dataset.describe())
print(dataset.groupby('class').size())
#validation dataset
array = dataset.values
X = array[:,0:4]
Y = array[:,4]
validation_size = 0.2
seed = 7
X_train, X_validation, Y_train, Y_validation = model_selection.train_test_split(X, Y, test_size=validation_size, random_state=seed)
print(X_validation)
print(Y_validation)
scoring = 'accuracy'
models = []
models.append(('LR', LogisticRegression()))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC()))

evaluate each model in turn

results = []
names = []
for name, model in models:
kfold = model_selection.KFold(n_splits=10, random_state=seed)
cv_results = model_selection.cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring)
results.append(cv_results)
names.append(name)
msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())
print(msg)

마나마인로고.png