티스토리 뷰

반응형

앞번 PART2 까지의 과정에서 우리는 데이터셋을 여러가지 방법으로 살펴보았다.


이제는 이 데이터셋을 가지고 특정 알고리즘을 적용하여 예측하기까지 
최적의 알고리즘을 찾고 검증하는 단계를 진행해보고자 한다.


본 글은 http://machinelearningmastery.com/machine-learning-in-python-step-by-step/을 참고로 하였으며
필자는 전문적인 지식이 없고 공부하는 과정으로 일부 잘못된점이 있을 수 있으니 참고해 주세요.


먼저 유효성 검사에 쓰일 데이터 세트를 만들어야 한다.


기존에 로드된 iris 데이터 세트를 두개로 분할한다.

80% 는 모델을 학습하는데 사용할것이고, 20%는 유효성 검사에 사용할 것이다.


PART 2 마지막에 진행했던 코드들을 주석처리하고 다음 데이터 세트를 분리하는 코드를 새로 입력한다.


# Split-out validation dataset

array = dataset.values

X = array[:,0:4]

Y = array[:,4]

validation_size = 0.20

seed = 7

X_train, X_validation, Y_train, Y_validation = model_selection.train_test_split(X, Y, test_size=validation_size, random_state=seed)

train_test_split 함수에 대한 자세한 설명과 예시들은 [여기]서 확인하자.


실제로 데이터가 어떻게 분리되는지 확인해보고싶다면 각각의 변수들을 print 해보면 된다.

print("X_train : %s",X_train)

print("X_validation : %s ",X_validation)

print("Y_train : %s ",Y_train)

print("Y_validation : %s",Y_validation)

결과를 살펴보면 기존 데이터셋에서 데이터가 120개와 30개로 각각 랜덤하게 섞여서 배치된것을 알수 있다.


이제 각 알고리즘별로 정확도를 계산하기 위해 10-fold 교차 검증을 사용한다.

학습용 데이터 세트를 10개 파트로 분할하여, 9번의 트레이닝과 1번의 테스트를 진행하면서 각 모델의 정확도를 계산한다. 


# Test options and evaluation metric

seed = 7

scoring = 'accuracy'


# Spot Check Algorithms

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)

( 무작정 따라하기이기 때문에 LogisticRegression, LinearDiscriminantAnalysis 등의 알고리즘에 대한 자세한 이론은 과감히 패스.. 나중에 필요하면 그때 공부하자!  -- 사실 일부 이론을 공부해보다가 너무 빨리 벽에 부딪혀서.. 일단 이것저것 응용해보며 결과도 보고 추후에 자연스럽게 이론을 공부하고 이해도 빨리 되길 바라는 바임.. ) 

여기까지 저장후 실행해보자! 그 결과는 다음과 같다.

KNN과 CART 알고리즘이 가장 높은 점수가 나왔다.  


여기까지 다시 정리하자면 학습용 데이터 세트를 가지고 각 알고리즘별로 학습 후 테스트 ( 예측 ) 결과에 대한 점수이다.
학습시에는 X를 기준으로 Y를 정의하고 (  X : [5.4, 3.0, 4.5, 1.5] = Y : Iris-virginica  ) 테스트 시에는 [5.4, 3.0, 4.5, 1.5] 는 무슨 종인가? 라고 묻고 통계학적으로 예측해 결과를 내놓는것이다. 


예측을 하는데 가장 높은 점수를 받은 알고리즘을 선택하는건 당연하겠지.. 

최적의 알고리즘을 찾았으니 이제 유효성 검증용으로 분리해놓은 데이터 세트를 가지고 해당 모델의 유효성을 검증해보자.


참고 사이트에서는 KNN 이 가장 높아 KNN 알고리즘을 가지고 검증하기 때문에 일단 따라해보기로 한다.


유효성을 검증하기 위한 코드이다.

# Make predictions on validation dataset

knn = KNeighborsClassifier()

knn.fit(X_train, Y_train)

predictions = knn.predict(X_validation)

print(accuracy_score(Y_validation, predictions))

print(confusion_matrix(Y_validation, predictions))

print(classification_report(Y_validation, predictions))


print("prediction result : %s", predictions)

print("Y_validation : %s", Y_validation)


코드상에는 예측을 위한 X값만 있고 Y값이 없다는것을 잘 봐두어야 한다. 


결과는 다음과 같다.


0.9 는 정확도 수치이고

[[7 0 0]

 [0 11 1]

 [0 2 9 ]] 는 confusion_matix 결과  [ confusion_matrix 함수 정보,  confusion matrix WIKI ]


다음 Iris-setosa 에 대한 정확도 1.00( 100% ), support : 7 ( 예측 결과 7개 라는 뜻일듯.. ) 등 결과에 대한 각각의 리포트 정보이다.


그리고 

prediction result 는 예측 결과이고, Y_validation은 본 테스트를 진행하기에 앞서 따로 빼놓은 원본? 데이터이다. 

즉 위의 리포트에 보면 Iris-setosa 가 100% 정확도를 보이고 support 가 7 이 나온건 예측결과와 원본과 비교해보면 알수 있다. 



여기까지 데이터세트를 가지고 예측 하기 위한 최적의 알고리즘을 찾아내고, 해당 알고리즘을 가지고 예측 테스트를 통해 검증해보기까지의 단계를 마친다.


참고 사이트에 코드만 가지고 복붙하고 결과 보는데까지는 30분도 걸리지 않는다.

다만 왜 이런 결과가 나오고, 어떻게 이런 결과가 나올수 있을지 분석하고 공부하는데까지 3일이 걸렸다. 

물론 블로그 쓰는것까지 하루에 시간을 쪼개다보니 더 오래걸리긴 했지만, 블로그에 옮기며 더 쉽게 설명하려 하니 내가 조금 더 공부하게 되고 좋은것같다.


반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함