티스토리 뷰

Untitled9

인공신경망 실습

Iris data를 사용해 실습을 진행해보겠다. 여기서는 iris 중 setosa, versicolor, virginica라는 품종의 데이터에 대해 살펴보겠다. 데이터는 먼저 Training Data Set과 Test Data Set으로 구분해 보겠다.

(1) iris data set 로드

In [53]:
from sklearn.datasets import load_iris

sklearn라이브러리의 datasets라는 모듈에서 load_iris를 import한다.
이 코드는 sklearn.datasets의 모듈에 있는 아이리스 데이터를 불러오는 부분이다.

In [54]:
iris=load_iris()

load_iris() 함수는 아이리스 dataset을 불러오는 기능을 수행한다.
iris = load_iris()는 불러온 아이리스 데이터를 iris라는 변수에 할당한다.

(2) Iris data set의 key값 확인

아이리스 데이터가 iris 변수에 잘 저장되었는지 확인해보자.

In [55]:
iris.keys()
Out[55]:
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])

iris.keys()는 iris data set의 컬럼 값을 출력하는 함수이다.
Iris data set의 컬럼 값으로 data, feature_names, target, target_names, DESCR 등이 있는 것을 볼 수 있다.

먼저, data 컬럼은 아이리스 데이터가 있는 부분이며, feature_names는 iris data set의 특징을 기술하는 부분이다.
Target과 target_names는 다층신경망을 이용해 분석하려는 목적변수이며 target에는 setosa, verginia, virginica 등이 있다.
마지막으로 DESCR은 iris data에 대한 설명을 포함하고 있다.

(3) shape을 이용한 데이터의 전체 크기 확인

그럼 데이터를 확인해보자.

In [56]:
iris['data'][0:10]
Out[56]:
array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2],
       [4.7, 3.2, 1.3, 0.2],
       [4.6, 3.1, 1.5, 0.2],
       [5. , 3.6, 1.4, 0.2],
       [5.4, 3.9, 1.7, 0.4],
       [4.6, 3.4, 1.4, 0.3],
       [5. , 3.4, 1.5, 0.2],
       [4.4, 2.9, 1.4, 0.2],
       [4.9, 3.1, 1.5, 0.1]])

iris data 0번째부터 9번째까지를 슬라이싱 해보겠다.
10개의 배열이 출력되는데, 이 값들은 아이리스 데이터를 분류하는 특징 값을 의미한다.

(4) 데이터 셋 분리

Iris의 target변수를 기반으로 다층신경망을 학습하겠다.

In [57]:
X = iris['data']
y = iris['target']

Iris data set의 data를 X변수에 할당하며 분류하고자 하는 target 변수는 y변수에 할당한다.
즉, y변수에는 iris 종, 즉 setosa, versicolor,virginica등이 들어있으며, X에는 해당 종에 대한 특징 값들이 들어 있다.

(5) Train, Test 데이터 셋 구분

다층신경망을 학습하기 전에 Training Data set과 Test Data Set으로 데이터를 분리하는 방법에 대해 알아보겠다.

In [58]:
from sklearn.model_selection import train_test_split

sklearn.model_selection 라이브러리 안에 있는 train_test_split 모듈을 이용한다.
sklearn.model_selection의 train_test_split 모듈을 import하여, train_test_split 모듈을 이용해 Training Data Set은 75%, Test Data Set은 25%로 분할 한다.

In [59]:
X_train, X_test, y_train, y_test =  train_test_split(X,y)

분할된 훈련 데이터셋과 테스트 데이터셋은 각각 X_train, X_test, y_train, y_test에 할당된다.

(6) StandardScaler 라이브러리 로드

In [60]:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()

Sklearn라이브러리의 preprocessing 모듈에 있는 StandardScaler 함수를 import하고, StandardScaler 함수의 결과 값을 scaler라는 변수에 저장한다.
이 StandardScaler 함수는 데이터의 범위를 평균 0, 표준편차 1의 범위로 바꿔주는 모듈이다.
결과적으로 scaler 변수에는 StandardScaler 함수를 통해 정규화된 데이터가 저장된다.

(7) X_train 데이터 정규화

In [61]:
scaler.fit(X_train)
Out[61]:
StandardScaler(copy=True, with_mean=True, with_std=True)

X_train에 대한 데이터를 scaler.fit()을 이용해 평균과 표준편차를 계산한다.

(8) X_train, X_test 데이터 정규화 및 변환

In [62]:
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

transform이라는 모듈이 보이는데 이 모듈은 데이터를 정규화 형식으로 변환한다.
예를 들어 10, 50, 40, 20, 100, 70, 60, 100 등의 값을 scaler.transform 모듈을 사용할 경우 0, 0.5, 0.4, 0.2, 1, 0.7, 0.6, 1로 정규화 된다.
이렇게 해서 X_train과 X_test 두 개의 값을 정규화 한다.

(9) MLP 알고리즘 로드 및 Hidden Layer를 할당

다층신경망 분류알고리즘을 불러와서 은닉층을 설정하는 부분이다.

In [63]:
from sklearn.neural_network import MLPClassifier

sklearn.neural_network 라이브러리의 MLPClassifier라는 모듈을 import한다.

In [64]:
mlp = MLPClassifier(hidden_layer_sizes=(10,10,10))

MLPClassifier는 다중신경망 분류 알고리즘을 저장하고 있는 모듈인데, mlp라는 변수에 MLPClassifier() 함수를 실행한 결과를 저장한다.
함수의 파라미터로 hidden_layer_sizes=(10,10,10)과 같이 설정했는데, 이것은 3개의 은닉층을 만들고 각 계층별로 10개의 노드씩 할당하라는 명령어이다.

(10) X_train, y_train 데이터 학습

MLP(X_train, y_train) 함수는 설정한 은닉층 3계층의 신경망에 X_train과 y_train 데이터를 활용하여 학습시킨다.
이번에는 학습한 인공신경망 결과의 파라미터에 대해 알아보겠다.

In [65]:
mlp.fit(X_train, y_train)
C:\Anaconda3\lib\site-packages\sklearn\neural_network\multilayer_perceptron.py:562: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (200) reached and the optimization hasn't converged yet.
  % self.max_iter, ConvergenceWarning)
Out[65]:
MLPClassifier(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9,
       beta_2=0.999, early_stopping=False, epsilon=1e-08,
       hidden_layer_sizes=(10, 10, 10), learning_rate='constant',
       learning_rate_init=0.001, max_iter=200, momentum=0.9,
       n_iter_no_change=10, nesterovs_momentum=True, power_t=0.5,
       random_state=None, shuffle=True, solver='adam', tol=0.0001,
       validation_fraction=0.1, verbose=False, warm_start=False)
  • Activation : 다층 신경망에서 사용하는 활성화 함수
  • Alpha : 신경망 내의 정규화 파라미터
  • Batch_size : 최적화를 시키기 위한 학습 최소 크기
  • Epsilon : 수치 안정성을 위한 오차 값
  • Learning_rate_init : 가중치를 업데이트 할 때 크기를 제어
  • Max_iter : 최대 반복 횟수
  • Hidden_layer_sizes : 히든 레이어의 크기
  • Learning_rate : 단계별로 움직이는 학습 속도
  • Shuffle : 데이터를 학습 시 데이터들의 위치를 임의적으로 변경하는 지의 여부
  • Solver : 가중치 최적화를 위해 사용하는 함수
  • Validation_fraction : training data를 학습 시 validation의 비율
  • Validation : training data를 학습 시 데이터가 유의미한지를 검증하는 데이터

(11) 예측한 X_test를 변수 predictions에 저장

이전에 X_train과 y_train을 이용하여 학습한 결과 모델을 mlp에 넣었었다.
이번에는 이 mlp를 기반으로 X_test를 예측해 predictions라는 변수에 저장해 보겠다.

In [66]:
predictions = mlp.predict(X_test)

(12) 학습 성능 평가

테스트 결과를 이용하여 우리가 학습한 모델의 성능을 평가해 보겠다.
평가를 위해 classification_report와 confusion_matrix 모듈을 사용하겠다.

In [67]:
from sklearn.metrics import classification_report, confusion_matrix

sklearn.metrics 라이브러리에서 classification_report와 confusion_matrix모듈을 import 한다.
confusion_matrix모듈을 이용해 실제 값 y_test와 예측 값을 비교한다.

In [68]:
print(confusion_matrix(y_test, predictions))
[[15  0  0]
 [ 0  8  2]
 [ 0  0 13]]

결과 값으로 [15,0,0]이라는 값을 볼 수 있는데, 이는 15개가 제대로 분류되었다는 의미이다.
실제 값 setosa에 대해 예측 값이 setosa가 나온 경우이다.
두번째 배열 [0,8,2]의 경우 vericolor라는 클래스는 8개를 분류했지만 2개의 경우 예측 값이 잘못되어 versicolor를 virginica로 분류한 경우이다.

(13) Precision, Recall, F1-Score를 이용한 평가

Classification_report모듈에서는 Precision(정확률), Recall(재현률), f1-score를 계산해준다.
실제 결과와 예측 결과를 비교했을 때 둘 다 참인 경우를 TP(True Positive)라고 하며 실제 결과는 참이지만 예측 결과가 거짓인 경우를 FN(False Negative)라 한다.
또한 실제 결과는 거짓인데 예측 결과에서 참인 경우를 FP(False Positive)라 하며, 둘 다 거짓인 경우를 TN 즉, True Negative라 한다.

예시를 들어 보면, Iris data를 이용했을 때 테스트 데이터를 setosa로 제대로 판별한 경우가 정확률이 된다.
또한 테스트 데이터 중 아이리스 데이터의 setosa가 10개인 경우 분류 결과 8이라는 숫자가 나왔다면 재현율은 0.8이 된다.
마지막으로 F1-score는 정확률과 재현율을 둘 다 이용해 계산한다.

(14) Precision, Recall, F1-Score 평가 결과 확인

In [70]:
print( classification_report(y_test, predictions))
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        15
           1       1.00      0.80      0.89        10
           2       0.87      1.00      0.93        13

   micro avg       0.95      0.95      0.95        38
   macro avg       0.96      0.93      0.94        38
weighted avg       0.95      0.95      0.95        38

평가 결과 0.95, 즉 95% 이상의 높은 정확성을 확인할 수 있다.

출처 - 파이썬을 이용한 빅데이터 분석

공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함