2.4 머신 러닝을 활용한 분석
2.4.2 신경망 구현 및 적용
머신 러닝을 수행하기에 앞서 먼저 문제에 적합한 머신 러닝 방법과 사용할 특징을 결정하고, 사용할 모델의 파라미터 설정을 결정하여 실제 문제를 처리할 분류기를 만드는 전처리(preprocessing) 작업이 필요하다<Figure 2.2>. 주제 분석(subject analysis)은 적절한 분류기(classifier)를 만드는 과정으로 원시 자료로부터 어떤 특징을 만들어낼 것인가를 결정하는 작업으로, 원시 데이터 중 6기 1차년도,
2차년도, 3차년도 데이터를 학습용 데이터로 7기 1차년도 데이터를
검증 용 데이터로 분리한 다음, 학습용 데이터 셋에서 특징을 추출하였다. 일반적으로 특징을 추출하는 방법은 사람의 경험이나 직관에 의존하는 경우가 많으며, 모델의 이론과 공식이 각 모델 별로 상이하므로 최상의 결과를 얻기 위해서는 많은 시간과 노력이 필요로 한다. 따라서 본 연구에서는 이러한 과정을 효율적으로 처리하기 위해 분류 알고리즘과 클러스터링을 통해 데이터들 사이의 관계를 파악하고 분석하는 작업을 실행하였다. 먼저 데이터를 Weka에 불러오기 위해서는 arff 포맷의 파일로 변환시켜주는 작업이 필요하다. 따라서 4차년도 데이터가 모두
38
들어있는 텍스트 파일을 arff 파일로 변화시켜주는 Java 코드를 작성하여 가공 데이터 포맷을 변경하였다<Figure 2.4>. 학습 모델에 사용할 관련 속성을 지닌 하위 데이터 세트를 선택하기 위해
Weka의 Attributeselection 객체를 통해 전처리 주요 과정인 특징
선택(feature selection)을 수행하였다. 특정 속성이 어느 정도 정보성이 높은지 평가하기 위해 ‘evaluator’ 파라미터와 ‘evaluator’가 매긴 점수에 따라 속성에 순위를 부여하는 ‘ranker’ 파라미터를 추가하였다. 분류 학습 모델을 만들기 위해 우선 의사결정 트리(decision tree) 객체를 정보성이 가장 높은 속성을 남기고, 정보성이 낮은 속성을 제거하여 좀 더 신속하고 정확한 예측이 가능한 러닝 모델을 구현하였다. Weka에 내장된 기능인
TreeVisualizer를 이용하여 트리의 구조를 확인하고 루트 노드(root
node)부터 속성의 일치 여부를 따라 가지를 타고 내려오면서 최종
리프 노드(leaf node)까지 확인하는 작업을 수행하였다. MLP을 구현하기위해 먼저 ‘MLP’패키지를 만들고 신경망 알고리즘의 기본 절차로 구성된 ‘MultiLayerPerceptrons.java’ 클래스와 역 전파의 실제 코드가 들어있는 ‘HiddenLayer.java’ 클래스를 생성하였다.
출력층에는 다 범주 로지스틱 회귀를 이용한 ‘LogisticRegression.java’
클래스를 사용하였다. ‘ActivationFunction.java’에는 시그모이드 함수의 기울기와 쌍곡 탄젠트(hyperbolic tangent, tanh)를 추가하였으며,
‘RandonGenerator.java’에는 정규분포를 갖는 난수(random number)를
생성하는 메소드를 작성하여 은닉층의 가중치를 무작위로 초기화할 수 있도록 하였다. MLP의 파라미터는 은닉층 HiddenLayer와
LogisticRegression의 가중치 W와 바이어스 b로 나타내었으며, W는
유닛 수에 맞춰 무작위로 초기화 될 수 있도록 코드를 작성하였다.
이때 초기값이 잘 분포되어 있지 않으면 지역 최소값 문제가 빈번하게 발생할 수 있으므로 임의 난수 시드(random seed)를
39
사용하여 실행시켰다. 더 효율적으로 데이터마이닝 부분에 집중 하기 위해 라이브러리를 이용한 알고리즘으로 추가 분석을 실행하였다. 현재 자바 기반으로 실무에 사용 가능한 라이브러리인
DL4J에서는 내부적으로 ND4J (N-Dimensional Array for Java)
라이브러리를 이용하고 있다(http://github.com/deeplearning4j/nd4j).
ND4J는 다양한 n차원 행렬 객체를 다룰 수 있게 해주는 과학
기술용 라이브러리로 GPU컴퓨팅도 지원 가능하다. 라이브러리를 사용하기 위해 먼저 Maven 프로젝트를 생성한 다음 패키지 명을
DLWJ.ND4J로 지정해주고, 클래스 명을 Perceptron.java로
설정해주었다. CVS파일로 변환시켜준 데이터 베이스를 사용하기
위해 CVS리더를 초기화 해주었으며, CVSRecodReader클래스를
이용하여 데이터를 로드 하였다. Weka를 통해 분석한 방법과 달리 .splitTestAndTrain () 메소드를 사용하여 데이터를 섞어준 다음 데이터를 학습용과 검증용으로 나누어 저장해 주고 본격적으로 모델을 구축하기 위해 시작 부분에 모델 구성을 정의해 주어 망을 설정해 주었다. 이때 제어(regularization) 코드를 추가해 모델이 과 적합되는 것을 방지하고 좀 더 일반화된 결과를 출력할 수 있도록 하였다. 명령어 .useDropConnect ()를 사용하여 드롭 아웃이 가능하도록 하였으며, .list ()에 입력층을 제외한 전체 layer수를 정의해주었다. 은닉층의 구성을 설정하기 위해 RBM층을 정의해주고, 모델의 연속 값을 다룰 수 있도록
RBM.VisibleUnit.GAUSSIAN을 사용하였다. 또한, 학습률을
최적화하기 위해 Updater.ADAGRAD를 사용하였다. 모델 구축을 완료한 다음 망을 학습 시키기 위해 프로세스 log코드와 model.fit
(train)을 사용하였으며, 평가를 위한 변수들을 설정해주었다.
마지막으로 반복 횟수를 늘리거나 시드 값을 변경하면서 파라미터 값을 조정해주었다.
40