데이콘 실무역량 강화교육을 통해 경험했던 첫 번째 프로젝트에 대한 코드입니다. 코랩을 사용하였고 간단한 EDA를 통해 데이터의 특성을 파악하고 그에 따른 모델을 만들어 식수인원을 예측해보았습니다.
from google.colab import drive
drive.mount('/content/drive')
Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import cross_val_score, train_test_split, KFold
from sklearn.metrics import mean_squared_error, make_scorer
from sklearn.ensemble import RandomForestRegressor
from xgboost import XGBRegressor
from sklearn.metrics import mean_absolute_error
1.데이터 로드, 전처리
train = pd.read_csv('/content/drive/MyDrive/235743_구내식당 식사 인원 예측 AI 경진대회_data (1)/train.csv')
test = pd.read_csv('/content/drive/MyDrive/235743_구내식당 식사 인원 예측 AI 경진대회_data (1)/test.csv')
submission = pd.read_csv('/content/drive/MyDrive/235743_구내식당 식사 인원 예측 AI 경진대회_data (1)/sample_submission.csv')
train.head(1)
일자 요일 본사정원수 본사휴가자수 본사출장자수 본사시간외근무명령서승인건수 현본사소속재택근무자수 \ 0 2016-02-01 월 2601 50 150 238 0.0 조식메뉴 \ 0 모닝롤/찐빵 우유/두유/주스 계란후라이 호두죽/쌀밥 (쌀:국내산) 된장찌개 쥐... 중식메뉴 \ 0 쌀밥/잡곡밥 (쌀,현미흑미:국내산) 오징어찌개 쇠불고기 (쇠고기:호주산) 계란찜 ... 석식메뉴 중식계 석식계 0 쌀밥/잡곡밥 (쌀,현미흑미:국내산) 육개장 자반고등어구이 두부조림 건파래무침 ... 1039.0 331.0
test.head(1)
일자 요일 본사정원수 본사휴가자수 본사출장자수 본사시간외근무명령서승인건수 현본사소속재택근무자수 \ 0 2021-01-27 수 2983 88 182 5 358.0 조식메뉴 \ 0 모닝롤/연유버터베이글 우유/주스 계란후라이/찐계란 단호박죽/흑미밥 우거지국 고기완자... 중식메뉴 \ 0 쌀밥/흑미밥/찰현미밥 대구지리 매운돈갈비찜 오꼬노미계란말이 상추무침 포기김치 양상추... 석식메뉴 0 흑미밥 얼큰순두부찌개 쇠고기우엉볶음 버섯햄볶음 (New)아삭이고추무절임 포기김치
submission.head(1)
일자 중식계 석식계 0 2021-01-27 0 0
# 석식이용인원 0인 날 삭제
train = train[train['석식계'] != 0]
#요일 숫자로 변경
train.loc[train['요일']=='월','요일'] =1
train.loc[train['요일']=='화','요일'] =2
train.loc[train['요일']=='수','요일'] =3
train.loc[train['요일']=='목','요일'] =4
train.loc[train['요일']=='금','요일'] =5
#월,일 컬럼 추가
def month(text:str):
return int(text[5:7])
train['월'] = train['일자'].map(month)
def day(text:str):
return int(text[-2:])
train['일'] = train['일자'].map(day)
train.head()
#현재원 컬럼 추가
train['현재원'] = train['본사정원수'] - train['본사휴가자수'] - train['본사출장자수'] -train['현본사소속재택근무자수']
/usr/local/lib/python3.7/dist-packages/pandas/core/indexing.py:1817: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy self._setitem_single_column(loc, value, pi) /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:15: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy from ipykernel import kernelapp as app /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:20: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:25: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
#요일 숫자로 변경
test.loc[test['요일']=='월','요일'] =1
test.loc[test['요일']=='화','요일'] =2
test.loc[test['요일']=='수','요일'] =3
test.loc[test['요일']=='목','요일'] =4
test.loc[test['요일']=='금','요일'] =5
#월,일 컬럼 추가
def month(text:str):
return int(text[5:7])
test['월'] = test['일자'].map(month)
def day(text:str):
return int(text[-2:])
test['일'] = test['일자'].map(day)
test.head()
#현재원 컬럼 추가
test['현재원'] = test['본사정원수'] - test['본사휴가자수'] - test['본사출장자수'] -test['현본사소속재택근무자수']
test.head()
일자 요일 본사정원수 본사휴가자수 본사출장자수 본사시간외근무명령서승인건수 현본사소속재택근무자수 \ 0 2021-01-27 3 2983 88 182 5 358.0 1 2021-01-28 4 2983 104 212 409 348.0 2 2021-01-29 5 2983 270 249 0 294.0 3 2021-02-01 1 2924 108 154 538 322.0 4 2021-02-02 2 2924 62 186 455 314.0 조식메뉴 \ 0 모닝롤/연유버터베이글 우유/주스 계란후라이/찐계란 단호박죽/흑미밥 우거지국 고기완자... 1 모닝롤/대만샌드위치 우유/주스 계란후라이/찐계란 누룽지탕/흑미밥 황태국 시래기지짐 ... 2 모닝롤/핫케익 우유/주스 계란후라이/찐계란 오곡죽/흑미밥 매생이굴국 고구마순볶음 양... 3 모닝롤/촉촉한치즈케익 우유/주스 계란후라이/찐계란 누룽지탕/흑미밥 두부김칫국 새우완... 4 모닝롤/토마토샌드 우유/주스 계란후라이/찐계란 채소죽/흑미밥 호박맑은국 오이생채 양... 중식메뉴 \ 0 쌀밥/흑미밥/찰현미밥 대구지리 매운돈갈비찜 오꼬노미계란말이 상추무침 포기김치 양상추... 1 쌀밥/보리밥/찰현미밥 우렁된장찌개 오리주물럭 청양부추전 수제삼색무쌈 겉절이김치 양상... 2 쌀밥/흑미밥/찰현미밥 팽이장국 수제돈까스*소스 가자미조림 동초나물무침 포기김치 양상... 3 쌀밥/흑미밥/찰현미밥 배추들깨국 오리대패불고기 시금치프리타타 부추고추장무침 포기김치... 4 쌀밥/팥밥/찰현미밥 부대찌개 닭살데리야끼조림 버섯탕수 세발나물무침 알타리김치/사과푸... 석식메뉴 월 일 현재원 0 흑미밥 얼큰순두부찌개 쇠고기우엉볶음 버섯햄볶음 (New)아삭이고추무절임 포기김치 1 27 2355.0 1 충무김밥 우동국물 오징어무침 꽃맛살샐러드 얼갈이쌈장무침 석박지 1 28 2319.0 2 흑미밥 물만둣국 카레찜닭 숯불양념꼬지어묵 꼬시래기무침 포기김치 1 29 2170.0 3 흑미밥 동태탕 돈육꽈리고추장조림 당면채소무침 모자반무침 포기김치 2 1 2340.0 4 흑미밥 바지락살국 쇠고기청경채볶음 두부구이*볶은김치 머위된장무침 백김치 2 2 2362.0
2.랜덤포레스트 모델
1) 중식계 예측 모델
features= [
'월',
'일',
'현재원',
'본사휴가자수',
'본사출장자수',
'본사시간외근무명령서승인건수',
'현본사소속재택근무자수',
'중식계']
features = features[:-1]
X = train[features]
y = train['중식계']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=121)
lunch_model = XGBRegressor()
lunch_model.fit(X_train,y_train)
lunch_count_predict = lunch_model.predict(X_test[features])
[12:40:40] WARNING: /workspace/src/objective/regression_obj.cu:152: reg:linear is now deprecated in favor of reg:squarederror.
lunch_count_predict
array([ 945.72906, 539.6704 , 1186.4695 , 1000.1311 , 866.5936 , 1179.529 , 1090.462 , 1015.5139 , 824.95374, 749.7693 , 912.766 , 820.5057 , 864.0983 , 618.9503 , 1022.23706, 903.33545, 862.64636, 1002.95233, 869.6132 , 886.7356 , 702.4766 , 898.84064, 867.4587 , 908.203 , 838.39294, 820.34595, 654.7836 , 951.83514, 940.3116 , 912.1308 , 967.53107, 829.6354 , 1175.6791 , 930.3572 , 857.8167 , 871.6047 , 941.6267 , 631.5817 , 991.15234, 958.33734, 572.5593 , 1095.0574 , 998.5118 , 895.9858 , 860.61365, 1123.1451 , 749.8649 , 993.2236 , 1186.4003 , 783.4473 , 1045.7416 , 1198.7057 , 1062.2472 , 1032.5531 , 922.61176, 1231.4353 , 1197.9161 , 579.7688 , 795.3104 , 663.2518 , 966.3141 , 943.6151 , 875.8223 , 961.96967, 1149.7561 , 731.13 , 746.8876 , 1053.3972 , 600.7532 , 539.03345, 880.67645, 842.24347, 898.4181 , 759.09186, 874.743 , 1170.4321 , 877.7689 , 871.3899 , 1132.841 , 1150.67 , 1085.3727 , 904.3873 , 847.164 , 949.7919 , 1046.3679 , 927.10596, 859.9272 , 775.84216, 1165.0404 , 605.0369 , 397.76468, 948.38763, 793.17267, 1108.1409 , 670.02026, 836.3036 , 851.8093 , 726.95166, 957.61395, 772.92035, 933.2524 , 1201.1577 , 938.01526, 750.73236, 641.255 , 884.43225, 862.0689 , 1021.932 , 741.13165, 702.452 , 870.5559 , 719.277 , 866.1785 , 933.4715 , 1165.7429 , 927.05255, 1080.068 , 745.60345, 826.38367, 1045.7416 , 926.73016, 899.98755, 1149.8062 , 1100.2124 , 1088.5576 , 847.4715 , 891.8503 , 541.43536, 786.1559 , 1231.6101 , 1126.5914 , 677.0973 , 747.98315, 781.1359 , 907.05035, 1135.4366 , 953.1696 , 968.1085 , 797.1345 , 829.36163, 948.31726, 806.768 , 958.382 , 892.5848 , 1157.5659 , 680.4911 , 928.4836 , 903.1377 , 911.29047, 1037.3842 , 1121.2179 , 951.7742 , 521.12683, 867.3005 , 811.7522 , 1127.2616 , 695.6873 , 744.62915, 693.4935 , 985.8001 , 620.4086 , 1050.0452 , 971.53986, 830.3142 , 834.98944, 1052.7211 , 1103.9701 , 654.7836 , 548.16016, 637.187 , 914.1126 , 595.23083, 828.99005, 947.46606, 976.89294, 1208.3907 , 799.8632 , 710.0127 , 833.639 , 813.0613 , 751.99176, 960.1474 , 1121.0444 , 612.2651 , 873.08484, 951.23047, 1021.57623, 918.07623, 841.03125, 941.181 , 877.2818 , 936.2629 , 907.5369 , 904.9996 , 723.80414, 1092.5776 , 783.09357, 684.5076 , 1238.9667 , 877.38605, 639.3852 , 968.8393 , 820.5667 , 909.1334 , 1266.623 , 941.17206, 768.3477 , 971.9485 , 647.83093, 740.97424, 604.58167, 908.203 , 569.7109 , 1204.2941 , 734.0915 , 602.7272 , 813.4198 , 1176.5483 , 974.48 , 784.04193, 666.133 , 1118.6285 , 979.6803 , 989.7375 , 577.63275, 926.74585, 1169.1998 , 879.5887 , 1166.3804 , 935.2413 , 605.6789 , 692.4347 , 854.79974, 731.7876 , 802.7087 , 1068.8733 , 1028.7754 , 1135.6577 , 867.25586, 996.7889 , 1248.1224 , 928.75183, 887.4299 , 949.27423, 853.7457 , 757.33093, 1144.966 , 607.1081 , 790.24036, 1020.96344, 887.75024, 1118.3428 , 602.80756, 1195.208 , 786.3926 , 554.8449 , 894.1206 , 907.6923 , 659.589 , 883.43445, 808.6752 , 738.56683, 1002.5877 , 907.376 , 817.523 , 820.7947 , 1078.0437 , 718.6383 , 589.1289 , 1058.8018 , 1031.9985 , 775.413 , 867.3005 , 1083.4542 , 886.41797, 859.06256, 1184.3181 , 1134.058 , 695.4951 , 924.43933, 749.54834, 990.0405 , 983.5169 , 686.65796, 1217.0554 , 1190.5892 , 930.9009 , 893.369 , 718.7207 , 792.41833, 528.152 , 798.1784 , 931.7515 , 1065.5066 , 1224.7103 , 664.31433, 872.8551 , 993.2236 , 554.53296, 1125.5431 , 938.55597, 1211.1798 , 874.6232 , 561.23956, 617.21765, 772.92035, 1171.1814 , 855.8379 , 886.93115, 1035.8958 , 511.5861 , 648.32635, 1079.765 , 548.4623 , 691.4108 , 625.8013 , 943.7871 , 929.40137, 843.5466 , 907.48883, 585.81683, 791.13385, 943.80414, 1174.2709 , 886.4823 , 651.3803 , 1118.5608 , 618.7849 , 1188.1068 , 972.6595 , 1044.0734 , 689.3907 , 658.0526 , 1152.7595 , 842.5968 , 1037.5266 , 944.82477, 897.6893 , 1197.9519 , 1071.4222 , 863.40106, 897.5146 , 986.6445 , 594.67926, 977.44147, 1125.7396 , 1169.0137 , 641.5496 , 1105.3958 ], dtype=float32)
mean_absolute_error(y_test, lunch_count_predict)
80.4657417887603
plt.plot(lunch_count_predict)
plt.show()
#lunch_model.estimators_
2) 석식계 예측 모델
features
['월', '일', '현재원', '본사휴가자수', '본사출장자수', '본사시간외근무명령서승인건수', '현본사소속재택근무자수']
features.append('중식계')
features
['월', '일', '현재원', '본사휴가자수', '본사출장자수', '본사시간외근무명령서승인건수', '현본사소속재택근무자수', '중식계']
test['중식계'] = lunch_count_predict
test.head()
일자 요일 본사정원수 본사휴가자수 본사출장자수 본사시간외근무명령서승인건수 현본사소속재택근무자수 \ 0 2021-01-27 3 2983 88 182 5 358.0 1 2021-01-28 4 2983 104 212 409 348.0 2 2021-01-29 5 2983 270 249 0 294.0 3 2021-02-01 1 2924 108 154 538 322.0 4 2021-02-02 2 2924 62 186 455 314.0 조식메뉴 \ 0 모닝롤/연유버터베이글 우유/주스 계란후라이/찐계란 단호박죽/흑미밥 우거지국 고기완자... 1 모닝롤/대만샌드위치 우유/주스 계란후라이/찐계란 누룽지탕/흑미밥 황태국 시래기지짐 ... 2 모닝롤/핫케익 우유/주스 계란후라이/찐계란 오곡죽/흑미밥 매생이굴국 고구마순볶음 양... 3 모닝롤/촉촉한치즈케익 우유/주스 계란후라이/찐계란 누룽지탕/흑미밥 두부김칫국 새우완... 4 모닝롤/토마토샌드 우유/주스 계란후라이/찐계란 채소죽/흑미밥 호박맑은국 오이생채 양... 중식메뉴 \ 0 쌀밥/흑미밥/찰현미밥 대구지리 매운돈갈비찜 오꼬노미계란말이 상추무침 포기김치 양상추... 1 쌀밥/보리밥/찰현미밥 우렁된장찌개 오리주물럭 청양부추전 수제삼색무쌈 겉절이김치 양상... 2 쌀밥/흑미밥/찰현미밥 팽이장국 수제돈까스*소스 가자미조림 동초나물무침 포기김치 양상... 3 쌀밥/흑미밥/찰현미밥 배추들깨국 오리대패불고기 시금치프리타타 부추고추장무침 포기김치... 4 쌀밥/팥밥/찰현미밥 부대찌개 닭살데리야끼조림 버섯탕수 세발나물무침 알타리김치/사과푸... 석식메뉴 월 일 현재원 중식계 0 흑미밥 얼큰순두부찌개 쇠고기우엉볶음 버섯햄볶음 (New)아삭이고추무절임 포기김치 1 27 2355.0 982.415771 1 충무김밥 우동국물 오징어무침 꽃맛살샐러드 얼갈이쌈장무침 석박지 1 28 2319.0 993.918274 2 흑미밥 물만둣국 카레찜닭 숯불양념꼬지어묵 꼬시래기무침 포기김치 1 29 2170.0 582.148621 3 흑미밥 동태탕 돈육꽈리고추장조림 당면채소무침 모자반무침 포기김치 2 1 2340.0 1194.138306 4 흑미밥 바지락살국 쇠고기청경채볶음 두부구이*볶은김치 머위된장무침 백김치 2 2 2362.0 1070.221436
X = train[features]
y = train['석식계']
dinner_model = XGBRegressor()
dinner_model.fit(X,y)
dinner_count_predict = dinner_model.predict(test[features])
plt.plot(dinner_count_predict)
plt.show()
[12:28:28] WARNING: /workspace/src/objective/regression_obj.cu:152: reg:linear is now deprecated in favor of reg:squarederror.
submission['중식계'] = lunch_count_predict
submission['석식계'] = dinner_count_predict
submission.to_csv('submission.csv',index=False)