본문 바로가기
  • 조금 느려도, 꾸준히
Artificial Intelligence/Machine Learning

[Colab / Keras] Avocado Price 예측 모델 만들기 2

by chan 2020. 4. 24.
반응형

# 데이터 전처리

신경망 모델을 학습시킬 때, 혹은 기계학습 기반의 인공지능 모델을 학습시킬 때 가장 중요한 것은 '좋은 데이터'를 인풋으로 제공하는 것이다. 이를 위해 여러 전처리 기법이 있고, 더 최적의 데이터 주입을 위해 다양한 머신러닝 알고리즘도 탄생했으며, 지금도 연구 중이다.

 

 

아보카도 데이터셋은 머신러닝 초보자 용으로 적합하기 때문에, 데이터 자체는 문제될 것이 없다. 다만 이를 어떻게 전처리하고, 가공해서 이용할 것이냐는 전적으로 사용자의 몫이다.

 

 

# 데이터 시각화

데이터 전처리를 하고, 기계를 학습시켜 올바른 인과관계를 통한 추론을 얻으려면 데이터 간 관계도 파악해야 한다. 이때 적용할 수 있는 방법이 데이터를 시각화 하는 것이다. 

 

가령 X라는 데이터와 Y라는 데이터의 상관관계를 분석하기 위해 산점분포도를 사용할 수도 있고, 통시적 흐름이 중요하다면 꺾은선 그래프로 표현할 수도 있다. 히스토그램을 이용할 수도 있으며, 응용 방법은 무궁 무진 하다.

 

 

이번 예측 모델 만들기 2탄에서는 위 두가지 방법을 이용해 데이터 간 상관관계를 파악하고 전처리를 통해 예측 모델을 학습시키는 과정에 대해서 다룰 것이다.

 

 

 

# Code Review

 

 *seaborn as sb -> seaborn as sns 수정

우선 필요한 라이브러리를 import 하였다.

 

 

 

위 4줄 코드는 그래프를 그릴 때 기본적인 색깔 설정을 해놓은 코드이고, 그 아래 코드를 통해 데이터를 다운받았다.

 

 

데이터를 다루기 쉽도록 쓰이지 않는 데이터(쓸모 없는 데이터)를 버리고, 편의 상 Key name을 다시 설정해준다.

 

info() 메서드를 통해 기본적인 데이터 정보를 볼 수 있다. 보면, 'date' , 'type' , 'region' 데이터 타입이 object로, 이는 문자열로 이루어진 데이터일 것이고, 나머지 데이터들은 float 64 수치형으로 되어 있다. 

 

우선, 'date' 즉 날짜 데이터를 다루기 위해서, 몇가지 전처리 과정을 거치도록 하겠다.

 

기존 Avocado 데이터에 년도별, 월별, 일별 데이터를 추가하고, 기계가 학습할 수 있도록 float 형으로 형변환을 해주었다.

 

 

1탄에서는 이러한 날짜 데이터를 사용하지 않았다. 하지만 날짜 데이터가 가격과 연관성을 지니고 있다면, 반드시 이용해야 하는 지표일 것이다.

 

왼쪽부터 년도별, 월별, 일별에 따른 가격 평균값을 계산하여 그래프로 나타낸 것이다. 오, 제일 왼쪽 그래프만 보더라도, 2016년엔 가격이 가장 낮고, 2017년에 가격이 가장 높았던 것을 볼 수 있다. 월별, 일별에 따라서도 가격이 다르게 나타난다. 즉, 날짜 데이터는 반드시 이용해야 하는 데이터이다. 아보카도는 가을에 가장 비싸구나

 

 

 

이번에는 날짜 말고, 1탄에서 이용하지 않은 데이터인 지역을 살펴보도록 하자.  지역에 따라서도 아보카도의 가격이 다를 수 있기 때문에, 이를 Seaborn 라이브러리를 이용하여 시각화 해 본다.

 

지역이 엄청 많다. 중요한건 지역 마다 가격 분포가 다르고, 또 모든 경우 conventional 보다 organic 타입의 아보카도가 비싸다. 지역 마다 가격에 차이가 나기 때문에 지역 역시 하나의 변수로 받아들여야 하며, 이를 전처리를 통해 기계각 학습할 수 있는 형태로 변환하여야 한다.

 

 

 

지역과 아보카도의 타입은 String 타입이기 때문에 기계가 학습할 수 없다. 따라서 One-hot encoding을 통해 학습할 수 있는 형태로 변환해준다.

 

원핫 인코딩을 거친 후 56개의 feature를 가진 특성 배열이 만들어졌다. 즉 지역이 54군데, 타입이 2가지 이므로 각각에 해당하는 특성의 원소가 1, 나머지는 0인 데이터가 만들어진 것이다.

 

새롭게 만들어진 데이터를 기존의 데이터에 합치고, 가격 데이터는 y 레이블로서 따로 분리하였다.

 

데이터 정규화를 위해 MinMaxScaler()를 이용하고, train_test_split() 함수를 통해 훈련 세트와 테스트 세트를 분리하였다.

 

이제 학습시킬 차례이다.

비교를 위해 1탄에서와 똑같은 모델, 컴파일 옵션, 훈련 옵션을 설정하고, 훈련을 시작하였다.

 

훈련이 끝났을 때 최종 손실은 0.0211로, 지난번 1탄에서는 대략 손실이 0.6 대로 나왔던 것을 고려하면, 꽤나 발전한 결과이다.

 

1탄에서 정의한 그래프 함수를 바탕으로, 테스트 세트에서 실제 가격 값과 모델의 예측 값을 비교해 보도록 한다.

 

 

와, 1탄에서의 결과와 비교해 보자.

 

1탄에서의 결과 그래프

1탄 결과 그래프와 비교했을 때, 상당히 훨씬 정확해진 결과를 산출하였다.

 

여기에 모델 하이퍼파라미터, 훈련 옵션, 컴파일 옵션을 잘 정의하면 더 정확한 그래프를 그릴 수 있을 것이다.

 

이렇게 가용한 데이터를 모두 사용하여 더 정확한 예측값을 얻는 방법에 대해 알아보았다.

반응형

댓글