안녕하세요~!
27년차 진로탐색꾼 조녁입니다!
오늘은 6일차에 같이 풀었던 자전거 공유 문제를 같이 리뷰해볼까 합니다!
* 모든 코드는 구글에서 제공하는 Colab 환경에서 작성하였습니다.
[머신러닝 6단계 리마인드]
1) 문제 정의 및 모델 선정 -> 2) 데이터 수집 -> 3) 데이터 전처리 -> 4) 특징 추출 ->5) 학습 -> 6) 검증
우선 처음에 해야할 것은 문제를 정의하고 모델 선정하는 것입니다. 자전거 공유문제는 워싱턴 D.C.의 Capital Bikeshare 프로그램에서 자전거 대여 수요를 예측하기 위해 과거 사용 패턴과 날씨 데이터를 결합해야합니다.자세한 내용은 kaggle 링크 첨부할게요.
www.kaggle.com/c/bike-sharing-demand
자전거 공유 시스템 수요 예측
사람들은 한 장소에서 자전거를 빌려서 필요에 따라 다른 장소로 반납할 수 있습니다. 이러한 시스템에서 생성된 데이터는 이동 기간, 출발 위치, 도착 위치 및 경과 시간을 명시적으로 기록하기 때문에 연구자들에게 매력적입니다. 따라서 자전거 공유 시스템은 도시의 이동성을 연구하는 데 사용될 수 있는 센서 네트워크 역할을 합니다. 이번 대회에서 참가자들은 워싱턴 D.C.의 캐피털 바이케쉬 프로그램에서 자전거 대여 수요를 예측하기 위한 것입니다. 과거 사용 패턴을 날씨 데이터와 결합해서 몇 대의 자전거가 필요할 것인지 예측하여 확률을 도출하면 됩니다.
-
즉 , 자전거 수요를 예측해야함.
위의 문제를 읽어보셨다면 어떤 모델을 사용할 지 정하시고 그에 따라 사용할 라이브러리를 부르시면 됩니다.
위 파일들을 업로드 해주실 건데, 전에 타이타닉때는 다운로드 API 통해서했었는데 이번에는 colab 좌측 파일모양 아이콘 누르시고 거기에 업로드 버튼 누르시고 위에 파일들 업로드 해주시고 시작할게요!!
1. Import Libraries
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras import layers, models
이번에는 타이타닉과 달리 DNN(심층 신경망) 모델을 이용해서 예측해볼 것이기 떄문에 관련 라이브러리를 불러줍니다.
딥러닝 관련 용어들은 아래 제가 정리 중이니 참고하실 분들은 참고해주세요!
2.Input tensor와 Target tensor 준비(훈련데이터)
* 자전거 수요 예측 데이터셋 파일 down
auto_mpg_dataset_url = "https://drive.google.com/uc?export=download&id=1WhSZll5tDUUl3sFLJMIO01a0d2tQtfc7"
dataset_path = tf.keras.utils.get_file("/content/bike-demand.csv", auto_mpg_dataset_url)
dataset_path
kaggle에 들어가서 csv 파일을 다운로드 받는 방법도 있지만 저는 강사님이 제공해주신 url 로 데이터를 불러와서 경로를 지정해줬습니다.
불러온 데이터를 확인하실 때는 지정한 경로에 있으니 확인하실 수 있어요. ( Colab 노트북 화면 좌측 파일 아이콘 클릭)
* 데이터 셋 파일을 읽어 Dataframe 객체 생성
raw_dataset = pd.read_csv('/content/bike-demand.csv')
dataset = raw_dataset.copy()
dataset.info()
pandas의 data는 dataframe이다.
data 확인할 때 1) 행과 열의 갯수 확인 -> 2) 열 정보 들어있는 지 확인 , 없다면 추가 -> 3)빈곳 없는 지 확인 -> 4) 데이터 타입 확인
train_df = pd.read_csv('train.csv',parse_dates=['datetime'])
print(train_df.shape)
train_df.head()
시작할 때 Colab 에 저장한 csv 파일을 pandas의 dataframe의 형태로 지정해주고 형태랑 head 확인
여기서 parse_dates를 이용해 날짜 데이터를 parsing(문장 분석)하였고 col name 은 datetime 으로 지정해서 train 데이터를 불러옵니다.
test_df = pd.read_csv('test.csv',parse_dates=['datetime'])
print(test_df.shape)
test_df.head()
3.Explore Dates
3-1. Preprocessing(전처리)
train_df['datetime'].dt
train_df['year'] = train_df['datetime'].dt.year
train_df['month'] = train_df['datetime'].dt.month
train_df['day'] = train_df['datetime'].dt.day
train_df['hour'] = train_df['datetime'].dt.hour
train_df['minute'] = train_df['datetime'].dt.minute
train_df['second'] = train_df['datetime'].dt.second
train_df['dayofweek'] = train_df['datetime'].dt.dayofweek
train_df['year-month'] = train_df['year'].astype('str')+'-'+train_df['month'].astype('str')
print(train_df.shape)
train_df.head()
datetime 안에 있던 년월일시분초,요일, 년-월 데이터로 분리해서 새로운 col을 생성해줍니다. 모습은 위와 같습니다.
test_df['year'] = test_df['datetime'].dt.year
test_df['month'] = test_df['datetime'].dt.month
test_df['day'] = test_df['datetime'].dt.day
test_df['hour'] = test_df['datetime'].dt.hour
test_df['minute'] = test_df['datetime'].dt.minute
test_df['second'] = test_df['datetime'].dt.second
test_df['dayofweek'] = test_df['datetime'].dt.dayofweek
test_df['year-month'] = test_df['year'].astype('str')+'-'+test_df['month'].astype('str')
print(test_df.shape)
test_df.head()
test df 도 train df 와 같이 datetime 안에 정보들을 각각 나눠서 열을 만들어 줍니다.
train_df['clear'] = train_df['weather']==1
train_df['mist'] = train_df['weather']==2
train_df['lightheavy'] = train_df['weather']==3
train_df['heavy'] = train_df['weather']==4
weather 는 각각 1,2,3,4 값을 clear,mist,lightheavy, heavy 로 나눠서 새로운 열 생성
test_df['clear'] = test_df['weather']==1
test_df['mist'] = test_df['weather']==2
test_df['lightheavy'] = test_df['weather']==3
test_df['heavy'] = test_df['weather']==4
test 값도 똑같이 나눠 준다.
train_df['Spring'] = train_df['season']==1
train_df['Summer'] = train_df['season']==2
train_df['Fall'] = train_df['season']==3
train_df['Winter'] = train_df['season']==4
test_df['Spring'] = test_df['season']==1
test_df['Summer'] = test_df['season']==2
test_df['Fall'] = test_df['season']==3
test_df['Winter'] = test_df['season']==4
season 도 똑같이 열을 나눠서 새로운 열로 저장해준다.
3-2.Visualization(시각화)
%matplotlib inline
import seaborn as sns
시각화에 사용할 seaborn 불러주고 ,%matplotlib inline : 그래프를 노트북 내에 보여달라는 명령어 를 입력해줍니다.
figure, ((ax1,ax2,ax3),(ax4,ax5,ax6))= plt.subplots(nrows=2,ncols=3)
figure.set_size_inches(18,10)
sns.barplot(data=train_df, x='year',y='count', ax=ax1)
sns.barplot(data=train_df, x='month',y='count', ax=ax2)
sns.barplot(data=train_df, x='day',y='count', ax=ax3)
sns.barplot(data=train_df, x='hour',y='count', ax=ax4)
sns.barplot(data=train_df, x='dayofweek',y='count', ax=ax5)
sns.barplot(data=train_df, x='year-month',y='count', ax=ax6)
가로*세로 3*2로 각각 year , month, day , hour, dayofweek, year-month 별로 대여 빈도에 대한 차이를 그래프로 보여줍니다. 이 때 아까 import 한 seaborn 을 사용하였습니다. month graph를 봤을 때 확실히 추운 겨울보단 여름에 자전거 사용량이 늘어나는 것을 볼 수 있죠!
반면 dayofweek 같은 경우는 큰차이가 없어서 학습하는데 별 도움이 안될 것 같네요!
figure, ax1 = plt.subplots(nrows=1,ncols=1)
figure.set_size_inches(18,5)
sns.pointplot(data=train_df, x='hour',y='count', hue='workingday',ax=ax1)
figure, ax2 = plt.subplots(nrows=1,ncols=1)
figure.set_size_inches(18,5)
sns.pointplot(data=train_df, x='hour',y='casual', hue='workingday',ax=ax2)
figure, ax3 = plt.subplots(nrows=1,ncols=1)
figure.set_size_inches(18,5)
sns.pointplot(data=train_df, x='hour',y='registered', hue='workingday',ax=ax3)
여기서 hue에 카테고리 데이터인 'workingday'를 넣어서 평일과 주말의 차이를 볼 수 있는데요.
첫번째 그래프를 보면 확실히 평일에는 출퇴근 시간에 사용량이 많고, 주말은 오후시간에 사용량이 많네요!
두번째 그래프를 같이 보시면 casual(1회용 사용)은 평일보다 주말 오후에 많았고
세번째 그래프에서 정기권 사용은 평일, 출퇴근 시간대가 주말보다 많이 나타나고 있습니다.
train_df.columns.values
이제 전처리를 마치고 열값들을 확인해줍니다.
이후 학습 과정부터는 다음 게시물에 포스팅 하겠습니다!
'프로그래밍 공부 > 코드프레소 교육' 카테고리의 다른 글
[코드프레소XAI양재허브]AI/ML 기초교육 5일차 (2)_ 타이타닉 예측하기 (1) | 2021.01.12 |
---|---|
[코드프레소XAI양재허브] 인공지능 실무과정 2일차 (0) | 2020.12.08 |
[코드프레소XAI양재허브]AI/ML 기초교육 5일차 (1) (0) | 2020.12.07 |
[코드프레소XAI양재허브]AI/ML 기초교육 4일차 (2) (2) | 2020.12.04 |
[코드프레소XAI양재허브]AI/ML 기초교육 4일차 (1) (2) | 2020.12.03 |