플레이데이터 부트캠프 데이터 엔지니어링 트랙 19주차 (10.10~.13)

안인균·2023년 10월 15일
0
post-thumbnail

이번 주차는 Spark(스파크) 학습을 진행했습니다. Kaggle 사이트의 Titanic 데이터를 통해 EDA, 전처리, 모델 학습 과정을 진행했고, 이를 통해 스파크 활용에 익숙해질 수 있었습니다.
마지막 날에는 빅데이터 시스템 관련 학습이 마무리가 되가는 단계로 스파크와 Jeju_bus.csv 파일을 학습해 "버스 도착 예정 시간 예측" 하는 모델을 만들었습니다. 이 과정에서 하둡을 통해 csv 파일을 전달하고 또 스파크에서 완성된 모델을 하둡에 저장 및 리눅스 환경과 윈도우 환경이 공유 중인 폴더로 옮기는 등 다양한 작업을 경험할 수 있었습니다. 또한 다음주에 이를 이어서 Apache-Kafka를 통해 실시간 버스 데이터를 받아 해당 모델을 통해 예측하고 이를 웹으로 배포하는 것까지 할 예정입니다.

10월 9일은 한글날로 휴강이었습니다.


Learned

  • [Databricks](https://community.cloud.databricks.com/) 사이트를 이용해 Spark(스파크) 학습을 진행했습니다.

    • ML cluster 를 생성해 코드 연산을 할 수 있는 가상의 컴퓨터를 만들어 사용했습니다.
  • Spark_Prime 실습

# Databricks notebook source
from pyspark.sql import SparkSession

# spark 접속
sc = SparkSession.builder\
    .master("yarn")\
    .appName("spark_prime01")\
    .getOrCreate()

# COMMAND ----------

# 소수를 계산할 최대 수
MAX = 500000

# COMMAND ----------

# 3 이상 ~ MAX+1 미만의 수 저장할 리스트 생성
# 해당 리스트는 8개의 멀티 스레드로 동시 실행
rdd = sc.sparkContext.parallelize([ i for i in range(3,MAX+1)], 8)

# COMMAND ----------

# 소수 계산 함수
# rdd에 저장된 값을 순서대로 매개변수 n에 대입
def get_prime(n) : 
    isPrime = True
    
    for i in range(2,n):
        if n % i ==0:
            isPrime=False
            break
    if isPrime :
        return n

# COMMAND ----------

import time

# 현재시간 start에 대입
start = time.time()

# rdd 에 저장된 숫자들을 순서대로 get_prime에 대입
# .collect() : 함수의 실행결과를 가져옴
prime_list = rdd.map(get_prime).collect()

end = time.time()
print("소요시간 : ", end-start)

# COMMAND ----------
  • 이외에도 Kaggle 사이트에서 얻은 Titanic.csv 파일을 이용해 EDA 를 진행했습니다.

  • EDA를 통해 관련성이 있어 보이는 컬럼들을 찾았습니다.

  • Titanic.csv 파일을 SparkDataFrame 으로 받아 전처리 과정을 진행했습니다.

  1. 컬럼의 기울기(Skewness) 파악 후 처리
  2. 기존의 컬럼 값들을 이용해 새로운 컬럼 생성
  3. 결측치 처리
  4. 범주형(Categorical) 데이터 처리
  • 위와 같은 과정을 통해 모델 학습을 할 준비를 마쳤습니다.

전처리 완료된 Titanic

image

  • EDA와 전처리를 마친 Titanic 데이터를 RandomForest 모델과 XGBoost 모델 을 통해 분류 학습을 진행했고, 정확도를 측정했습니다.

    1. 학습에 불필요한 컬럼들, PassengerId, Name, Sex, Age, Ticket, Cabin, Embarkedm Sir 컬럼을 삭제했습니다.
    2. 학습 데이터 와 테스트 데이터를 7:3 비율로 나누었습니다.
    3. RandomForest(rf) 모델 객체를 생성해 학습을 진행했고, 정확도 결과 : 0.8397 이 나왔습니다.
    4. 똑같이 XGBoost(xgb) 모델 객체를 생성해 기본 파라미터 값으로 학습 진행, 정확도 결과 : 0.8258 이 나왔습니다.
    5. 따라서, xgb의 결과가 더 부정확했으나, 최적의 파라미터 값을 찾고자 HyperOpt 모듈을 참고해 파라미터 값을 찾는 과정을 진행했습니다.
    6. colsample_bytree, learning_rate, max_depth, min_child_weight 의 최적의 값들을 찾았고, 정확도 측정 결과 : 0.8641 로 향상된 것을 확인할 수 있었습니다.
  • jeju_bus.csv 파일과 Spark , RandomForest 모델을 통해 버스 운행 시간을 예측하는 모델을 구현하는 학습을 진행했습니다.

Liked

  • 스파크 개념을 잘 학습할 수 있었고, 실습 과정을 통해 사용하면서 흥미를 느껴서 좋았습니다.

  • 스파크의 노트북 파일에서 파이썬과 마크다운 이외에 %sql 을 통해 SQL쿼리문을 자유롭게 쓸 수 있어 좋았습니다.

  • SparkDataFramePandasDataFrame 의 사용 차이에 대해 느끼고 EDA 과정을 할 수 있어 만족스러웠습니다.

  • pyspark 의 다양한 문법 사용을 할 수 있어 좋았습니다.

  • 이전에 배웠던 머신러닝 알고리즘들을 되돌아볼 수 있는 시간이었고, Spark 사용을 많이 할 수 있어 만족스러웠습니다.

Lacked

  • Databricks 의 무료 계정을 사용 하다 보니 코딩을 조금만 하지 않더라도 클러스터가 자꾸 종료되었고 무료 계정에서는 다시 실행할 수 없어 이때마다 새로운 클러스터를 생성해 학습을 이어나갔습니다.
    클러스터 하나를 생성할 때도 대개 10분 정도의 시간이 걸려 지체 되는 상황이 자주 발생되어 아쉬웠습니다.

  • Spark 의 모델과 apache-kafka 을 이용해 30초마다 실시간으로 버스 운행 시간을 예측하고 DB 저장 후 웹 페이지로 보여주는 전체의 학습 과정을 위해 도커를 이용해 Zeppelin 사이트로 접근까지 완료할 수 있었습니다. 그러나 사용 중인 PC의 디스크 저장 공간 부족과 메모리로 인해 Spark 연산이 매우 느렸고, 결국 도커가 꺼지는 등의 사고를 겪어 당장의 구현보다는 컴퓨터 용량 확보를 위한 시간을 보낼 수 밖에 없었습니다. 수업 시간 내에 이를 다 하지 못한 점이 아쉬웠으나, 주말 동안 홈PC를 통해 모델 구현을 완료해볼 예정입니다.

Longed for

  • Spark_rf_model 구현 (완료)

  • 복습 및 취업 준비

0개의 댓글

관련 채용 정보