아나콘다텐서플로우

1-13 Sklearn 라이브러리에 의한 붓꽃(Iris flowers) 데이터 분류

coding art 2018. 4. 7. 18:28
728x90

파이선 코딩을 배우는 초보자도 머신 러닝에 한번 도전해 보자.

머신 러닝을 배우려는 초보자들이 가지게 될 의문점들을 하나하나 찾아내어

실제 풀어보고 결과를 확인해볼 수 있도록  완전히 뒷문으로 들어가 시작하는 머신 러닝!


우선 아래 url 을 방문하여 url 로 구성된 본 서의 목차 파일을 무료로 다운로드 받아 살펴보시기 바랍니다.

파이선 코딩 초보자를 위한 톈서플로우∙OpenCV 머신러닝 머리말과 url 목차 파일 다운로드
https://steemit.com/kr/@codingart/pryx1-opencv

noname03.png

_____________________________________________________________________________________________________


2018년에 구글 홈페이지 TensorFlow 예제였던 것으로 기억되는데 2020년 현재 구글 홈페이지를 방문해 보면 TensorFlow Lite 임베디드 IOT 분야에서 안드로이드 스튜디오에 버금가는 아마도 애플 IOS 지원하는 Swift 섹션에 이 예제가 그대로 남아 있다. 머신 러닝을 배워나감에 있어 반드시 다루어 보아야 할 예제로 볼 수 있다.


sklearn 라이브러리 모듈을 사용하는 붓꽃 분류 코드를 다루어 보자. 이 문제를 실행하기 위해서 pandas를 비롯 많은 갯수의 sklearn 라이브러리 모듈들을 다음과 같이 불러들이자. 이 부분은 수정하지 말고 그대로 사용하기로 한다. 특히 후반부를 보면 linear regression을 비롯하여 SVM(Support Vector Machine) 모델까지 다룰 수 있음을 알 수 있다.


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

dataset.head(10) 의 출력은 첫 번째 즉 0번에서 열 번째 즉 9번까지의 데이터를 출력한다.


dataset.describe()는 데이터 전체의 평균, 표준편차, 최대, 최소값을 포함하는 통계치를 계산하는 명령이다.


dataset.groupby(‘class’).size()는 csv 데이타 파일의 ‘class’ 행 데이터를 대상으로 내용을 구분하여 샘플 수를 출력해준다.



총 5행으로 구성되는 붓꽃 데이터는 각각 꽃받침의 길이와 폭, 꽃잎의 길이와 폭, 아울러 해당 꽃의 세부 종명으로 구성된다. 세부 종명이란 즉 붓꼿이 크기에 따라서 3가지 종이 있으며 그 이름이 다르다는 점이다.



이 데이터를 여러 가지 목적으로 사용하기 위해서 다음과 같이 처리과정을 거치도록 한다. 꽃받침과 꽃잎 데이터는 X 어레이 꽃의 종명은 Y어레이로 둔다. validation_size는 머신 러닝 단계에서 학습용 데이터와 검증용 데이터로 나누는 비율을 뜻한다. Iris_dta 는 3개 종별로 각 50개씩 총 150 개로 이루어지므로 0.2는 총30개로서 각 종별 10개의 임의로 선택된 데이터를 뜻한다.


seed =7 은 난수 생성을 위한 초기 값으로서 항상 동일한 결과를 주도록 한다. 이수를 바꾸면 결과도 변동된다.
sklearn 라이브러리 모듈을 사용하여 모델별로 머신 러닝 실행을 준비하자. 이 부분의 명령이 상당히 길므로 인덴트한 결과를 참조하기 바란다.
 X_train, X_validation, Y_train, Y_validation
  = model_selection.train_test_split
      (X, Y, test_size=validation_size, random_state=seed)
X_validation 과 Y_validation 은 150개의 데이터 중에서 임의로 추출된 샘플 데이터로서 각 모델별 식별 능력을 체크하기 위해 사용된다.



붓꽃의 세부적인 종을 구분하기 위하여 적용하는 머신 러닝 모델들이다. 이 모델들은 선형 모델과 비선형 모델 모두를 포함하고 있다.

LDA는 통계학의 천재적인 원조로 알려진 Fisher 교수의 Linear Discriminant Anaysis 기법의 약어이다. 여기서는 한 줄로 그 결과를 보여 주고 있지만 Classification 기법의 난이도가 높은 편이이다. 아울러 GaussianNB 라든지, SVC 기법은 필자의 저서 중 2권에 해당하는 ScikitPyTorch 머신러닝 편에서 상세히 다루고 있으니 참조하기 바란다.




앞 단계에서 준비된 데이터와 모델을 사용하여 코드를 실행하여 결과를 출력한다.



사용된 각각의 머신 러닝 모델들은 라이브러리 모듈이므로 사용자가 일일이 쪼개서 분석은 곤란하다. 앞에서부터 단계별로 기술되었듯이 데이터를 준비하여 사용하면 되리라 본다.




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)