데이콘(Dacon)이란?
데이콘이란 인공지능, 데이터사이언스 경진대회 사이트입니다.
이 사이트에서 연습으로 제공하는
"서울시 따릉이 대여량 예측 경진대회"에
참여해서 데이터를 이용해
모델에 훈련시키고
예측값을 구해 제출까지 진행해보겠습니다.
https://dacon.io/competitions/open/235576/overview/description
서울시 따릉이 대여량 예측 경진대회 - DACON
분석시각화 대회 코드 공유 게시물은 내용 확인 후 좋아요(투표) 가능합니다.
dacon.io
아직 부족한 면이 많지만
직접 해봐야 실력이 늘으니
학원에서 학습한 내용을 최대한 가지고
진행할 예정해 보겠습니다!
1. 규칙 확인
규칙을 확인하는게 첫번째가 되야겠죠.
1일 최대 제출 횟수는 10회로 되어있네요.
평가 산식 즉 loss값 측정은 RMSE입니다.
저는 MSE를 사용하는 것만 배웠으니
일단 이걸 사용해봐야겠네요.
저는 팀이 아니라 개인이니
나머지는 구체적인 규칙에는 해당이 안되네요.
MSE와 RMSE는 따로 포스팅에서 설명하겠습니다!
1. 규칙
- 제출 횟수 및 최대 팀원
- 1일 최대 제출 횟수 : 10회
- 팀 최대 인원 : 5명
- 리더보드
- 평가 산식 : RMSE
2. 외부 데이터 및 사전학습 모델
- 공공 데이터와 같이 누구나 얻을 수 있고 법적 제약이 없는 외부 데이터 허용
- 사전학습 모델의 경우 사전학습에 사용된 데이터를 명시해야 함
3. 개인 및 팀 병합 규정
- 개인 참가 방법 : 팀 신청 없이 자유롭게 제출탭에서 제출 가능
- 팀 참여 방법 : 팀 탭에서 가능, 상세 내용은 팀 탭에서 팀 병합 정책 확인
- 하나의 대회는 하나의 팀으로만 등록 가능
- 팀 병합 후 해체 및 개인 참가 불가
4. 유의사항
- 사용 가능 언어 : Python, R
2. 데이터 정보 확인 및 다운로드
규칙 다음 데이터 정보 확인입니다.
주어지는 데이터는 마포구의
아래의 속성값에 대한
데이터들을 주는군요.
train.csv 와 test.csv를 받아
예측값을 구해
submission.csv에
넣고 제출하면 되겠습니다!
서울시 마포구의 날짜별, 시간별 기상상황과 따릉이 대여 수 데이터
1. train.csv / test.csv
- id 고유 id
- hour 시간
- temperature 기온
- precipitation 비가 오지 않았으면 0, 비가 오면 1
- windspeed 풍속(평균)
- humidity 습도
- visibility 시정(視程), 시계(視界)(특정 기상 상태에 따른 가시성을 의미)
- ozone 오존
- pm10 미세먼지(머리카락 굵기의 1/5에서 1/7 크기의 미세먼지)
- pm2.5 미세먼지(머리카락 굵기의 1/20에서 1/30 크기의 미세먼지)
- count 시간에 따른 따릉이 대여 수
2. submission.csv (제출 파일 형식)
다운로드를 눌러 세가지 데이터를
받아주었습니다.
3. 프로젝트 생성
keras_dacon_ddarung.py
란 프로젝트를 생성해주었습니다.
떨리고 재미있는 순간입니다
4. 데이터 전처리
이전 포스팅에서 다뤘었죠?
먼저 Pandas를 이용해
csv파일을 받아오고
데이터 분석과
데이터 전처리를 해보겠습니다.
https://aigaeddo.tistory.com/17
13. csv 파일 데이터 다루기(pandas 패키지)
포스팅할게 산더미인데 실습이 많아져 쌓아만 놓고 있습니다!! 하루가 더 길었으면 좋겠습니다. 이번엔 csv 파일이 뭔지를 설명하고 pandas 패키지를 이용해 데이터 전처리와 csv 가져오기, 내보내
aigaeddo.tistory.com
저는 아래와 같이
pandas 패키지를 사용해
데이터를 DataFrame 클래스 형태로
가져왔습니다.
import pandas as pd
path = '/Users/사용자명/Documents/Workspace/_data/'
train_csv = pd.read_csv(path + 'train.csv')
test_csv = pd.read_csv(path + 'test.csv')
submission_csv = pd.read_csv(path + 'submission.csv')
그런 후 데이터 분석을 하고
어떻게 처리할지 먼저 정리했는데요
아래 함수로 확인해보니
(info()함수로도 확인이 가능합니다!)
print(train_csv.isna().sum())
print(test_csv.isna().sum())
결측치가 몇가지 있어
비가 온 유무에 대한 컬럼은 0으로,
나머지는 평균값으로 처리해주기로 했습니다.
아직 데이터분석을 배우지 않아서
배운 내용만 토대로 해보려합니다!
print(train_csv.info())
print(test_csv.info())
print(train_csv.isna().sum())
print(test_csv.isna().sum())
'''
id 고유 id
hour 시간
temperature 기온
precipitation 비가 오지 않았으면 0, 비가 오면 1
windspeed 풍속(평균)
humidity 습도
visibility 시정(視程), 시계(視界)(특정 기상 상태에 따른 가시성을 의미)
ozone 오존
pm10 미세먼지(머리카락 굵기의 1/5에서 1/7 크기의 미세먼지)
pm2.5 미세먼지(머리카락 굵기의 1/20에서 1/30 크기의 미세먼지)
count 시간에 따른 따릉이 대여 수
train_csv null 값
id 0
hour 0
hour_bef_temperature 2
hour_bef_precipitation 2
hour_bef_windspeed 9
hour_bef_humidity 2
hour_bef_visibility 2
hour_bef_ozone 76
hour_bef_pm10 90
hour_bef_pm2.5 117
count 0
dtype: int64
test_csv null 값
id 0
hour 0
hour_bef_temperature 1
hour_bef_precipitation 1
hour_bef_windspeed 1
hour_bef_humidity 1
hour_bef_visibility 1
hour_bef_ozone 35
hour_bef_pm10 37
hour_bef_pm2.5 36
dtype: int64
결측치가 있는 부분
temperature
precipitation
windspeed
humidity
visibility
ozone
pm10
pm2.5
각 컬럼의 결측치를 어떻게 처리할 것인가?
내가 아는 방식 : 0 혹은 평균.
temperature : 평균
precipitation : 0
windspeed :평균
humidity :평균
visibility :평균
ozone : 평균
pm10 :평균
pm2.5 :평균
구상한대로
hout_bef_precipitation은 0으로,
나머지는 평균을 넣어
결측치 제거를 해주었습니다.
#trai
train_csv['hour_bef_precipitation'].fillna(value= 0.0 , inplace=True)
train_csv.fillna(test_csv.mean(), inplace= True)
# train_csv.fillna(train_csv.interpolate(method='values'), inplace=True)
#test
test_csv['hour_bef_precipitation'].fillna(value= 0.0 , inplace=True)
test_csv.fillna(test_csv.mean(), inplace=True)
# test_csv.fillna(test_csv.interpolate(method='values'), inplace=True)
이후 아래와 같이 데이터 구성을 출력해서 살펴보면
1. submission의 'count'를 예측 해야하고
2. train 데이터의 count는 출력값
이 외의 값은 입력값이 된다.
3. test 데이터로 모델을 평가해서
count의 예측값을 받는다
이렇게 분석이 가능합니다.
print(train_csv.shape) # (1459, 11)
print(test_csv.shape) # (715, 10)
print(submission_csv.shape) # (715, 2)
print(train_csv.columns)
print(test_csv.columns)
print(submission_csv.columns)
'''
==train_csv colums==
Index(['id', 'hour', 'hour_bef_temperature', 'hour_bef_precipitation',
'hour_bef_windspeed', 'hour_bef_humidity', 'hour_bef_visibility',
'hour_bef_ozone', 'hour_bef_pm10', 'hour_bef_pm2.5', 'count'],
dtype='object')
==test_csv colums==
Index(['id', 'hour', 'hour_bef_temperature', 'hour_bef_precipitation',
'hour_bef_windspeed', 'hour_bef_humidity', 'hour_bef_visibility',
'hour_bef_ozone', 'hour_bef_pm10', 'hour_bef_pm2.5'],
dtype='object')
==submission_csv colums==
Index(['id', 'count'], dtype='object')
일단 train 데이터에서
입력값과 출력값을 나눠보겠습니다.
count외의 값은 x
count값은 y
값으로 넣어주었습니다.
#데이터 x,y 자름
x = train_csv.drop('count', axis= 1)
# x = train_csv.drop(columns='count')
y = train_csv['count']
이번엔 해당 포스팅에서 살펴본
사이킷런의 model_selection 모듈의
train_test_split함수를 사용해
입출력값 x 와 y를
훈련데이터와 평가데이터로 나눠주겠습니다.
https://aigaeddo.tistory.com/10
7. 데이터) 데이터 쪼개기 (훈련 데이터, 평가 데이터)
전에 코드들에서는 10개면 10개 전부 모델에 훈련시켰는데요,,, https://aigaeddo.tistory.com/9 6. 데이터) 입출력 데이터 개수 변경 안녕하세요. 학원에서 저는 텐서플로우 기초를 배우고 있습니다. 학습
aigaeddo.tistory.com
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x,y, shuffle=True,
train_size=0.7, random_state=0)
5. 모델생성과 훈련
이렇게 쪼개진 데이터를 이용해서
훈련할 모델을 만들겠습니다.
저는 아직 Sequential()이라는
모델과 Dense라는 레이어만 학습했으니
이걸 이용해보겠습니다.
loss 평가방식도 아직은 mse만 배웠으니 이걸사용하고 루트를 씌워주겠습니다
from keras.models import Sequential
from keras.layers import Dense
# 모델구성
model = Sequential()
model.add(Dense(64, input_dim = len(x.columns)))
model.add(Dense(32))
model.add(Dense(1))
#컴파일, 훈련
model.compile(loss='mse', optimizer='adam')
model.fit(x_train, y_train, epochs=random_epoch, batch_size=random_batch_size)
6. 모델 평가 예측하기
mse에 np패키지에서 sqrt라는 함수로 루트를 씌워
rmse_loss값을 구해줬습니다.
이걸 주지표로 모델의 성능을 평가할 예정이고
r2 결정계수(아래 포스팅에서 다뤘었죠? )로
보조지표로서 모델을 평가하겠습니다.
https://aigaeddo.tistory.com/15
11. 결정계수(R2) - Scikit Learn r2_score
오늘도 학원에서 학습한 내용을 꾸준히 블로그 글로 정리해서 올리려고 합니다 이번 포스트에서 정리해볼 내용은 "결정계수"입니다. 1. 결정계수(R2)가 뭐죠 결정계수는 바로 이것이라고 합니다.
aigaeddo.tistory.com
from sklearn.metrics import r2_score
#평가 ,예측
rmse_loss = np.sqrt(model.evaluate(x_test, y_test))
y_predict = model.predict(x_test)
r2 = r2_score(y_test, y_predict)
print('rmse_loss : ', loss)
print('r2 : ', r2)
7. 예측값 저장
훈련된 모델에 test_csv의 입력값을 넣어
출력된 예측값들을
submission_csv(pandas DataFrame)의
'count' 컬럼에 넣어줍니다.
그리고 pandas DataFrame의
to_csv()함수로 csv파일을 생성합니다.
저는 매번 파일이름을 바꾸기 귀찮아서
현재 시간 문자열로 반환해주는 함수를 하나 만들어서
실행될때마다 변경되는 파일명으로 넣어줬습니다.
index=False는 index를 생성하지 않겠다는 파라미터입니다
마찬가지로 이전 포스팅에서 설명했었죠??
#파일이름에 설정할 시간 문자열
def get_save_time():
ltm = tm.localtime(tm.time())
save_time = f"{ltm.tm_year}{ltm.tm_mon}{ltm.tm_mday}{ltm.tm_hour}{ltm.tm_min}{ltm.tm_sec}"
return save_time
#csv로 값 전달
submit = model.predict(test_csv)
submission_csv['count'] = submit
file_path = path + f"submission_{get_save_time()}.csv"
submission_csv.to_csv(file_path, index=False)
설정해준 파일 경로로 이동하면
파일이 아주 잘 생성되었네요.
열어서 확인해보면 예측값도
잘 들어가 있습니다!!
8. 제출
이렇게 생성된 submission.csv 파일을
데이콘에 제출하면 점수와 몇등인지를
리더보드에서 확인하실 수 있습니다!
제가 제출한 예측치는 69.72686으로 전체 1653등이네요 ㅎㅎ
이상으로 데이콘의 연습대회에 예측치를 구해서
제출해보았습니다.
점점 더 발전되는 모습으로
정식 대회도 도전해 보고 싶네요!
다음에는
해외의 인공지능 경진대회 사이트 "캐글"의 연습대회에
참가 해보겠습니다
+ 추가 ) 학습을 진행하며 계속 비교 갱신 해보겠습니다
'인공지능 개발하기 > Machine Learning' 카테고리의 다른 글
[Tensorflow] 16. 데이터쪼개기 2) validation data (2) | 2024.01.13 |
---|---|
[Tensorflow] 15. 선형회귀 평가방식(MSE, MAE, RMSE) (2) | 2024.01.13 |
[Tensorflow] 13. csv 파일 데이터 다루기(pandas 패키지) (1) | 2024.01.08 |
[Tensorflow] 12. 연습용 데이터 사용해보기 Scikit Learn datasets (1) | 2024.01.07 |
[Tensorflow] 11. 결정계수(R2) - Scikit Learn r2_score (1) | 2024.01.05 |