04단계 · 2유형 — 예측과 제출
제출 파일 만들기
평가 데이터를 예측해 규격에 맞는 CSV 를 만들고, 되읽어서 규격을 확인한다.
먼저 알아볼게요
코드로 이동 ↓공식 체험환경 가이드가 2유형 제출에 대해 요구하는 것은 네 가지다: 지시된 칼럼명 사용 · 자동 생성되는 index 칼럼 제거 · 예측 결과 칼럼 1개 · 지시된 파일명, 별도 디렉터리 금지.
pd.DataFrame({"pred": 예측값}) 으로 열 하나짜리 표를 만들고 .to_csv("result.csv", index=False) 로 저장한다. `index=False` 가 빠지면 이름 없는 열이 하나 더 생긴다 — 다음 수업에서 그 모습을 직접 본다.
평가 데이터에는 정답 열이 없다. 학습에서 뺐던 열(ID·정답)을 평가에서도 똑같이 빼서 열 구성을 맞춰야 한다. DataFrame 으로 넘기면 열 이름이 다를 때 scikit-learn 이 보통 오류를 내 주지만, 이름 없는 배열로 넘기면 순서가 어긋난 채로 그냥 예측된다.
제출 행 수는 평가 데이터의 행 수와 같아야 한다. 40행을 받았으면 40행을 낸다.
저장한 뒤 다시 읽어서 확인하는 것까지가 제출이다. 파일이 만들어졌다고 믿지 말고 shape 와 columns 를 찍어 본다.
import pandas as pd
pd.DataFrame({"pred": [0.1, 0.9]}).to_csv("mini.csv", index=False)
print(pd.read_csv("mini.csv").columns.tolist())제출은 예측 열 1개·index 없음·지정 파일명. 저장한 뒤 다시 읽어 확인하는 것까지가 제출이다.
churn_train.csv 전체로 모델을 학습해 churn_test.csv 의 이탈 확률을 예측하고 result.csv 로 저장하세요(열 이름 pred, index 없음). 그 뒤 다시 읽어 ① shape ② 열 이름 ③ 확률 평균(소수 4) ④ 앞 3행을 출력하세요.
제공 파일 2개 · 내용 보기
파일은 준비되어 있어요. 코드에서 이름으로 불러오세요.
고객ID,성별,요금제,가입개월,월요금,부가서비스,이탈 C1001,남,standard,22,44300,3,1 C1002,여,premium,1,62000,1,1 C1003,남,premium,45,64000,0,1 C1004,남,basic,10,32200,1,1 C1005,남,premium,5,69500,0,1 C1006,여,basic,56,29500,0,0 C1007,여,premium,48,62800,2,0 C1008,여,standard,5,56700,1,1 C1009,여,basic,49,30600,3,0 C1010,여,premium,52,74800,2,1 C1011,여,basic,19,32800,2,1 C1012,여,standard,18,42200,3,0 C1013,남,standard,37,47900,1,0 C1014,남,basic,1,30500,4,1 C1015,여,standard,52,43200,0,0 C1016,남,premium,31,75300,3,1 C1017,여,basic,22,29100,1,1 C1018,남,standard,39,48400,1,1 C1019,남,premium,35,82500,0,0 C1020,남,standard,19,42600,3,0 C1021,남,basic,22,27300,4,1 C1022,여,basic,38,27800,1,1 C1023,남,standard,5,54200,0,1 C1024,여,premium,36,77200,3,0 C1025,여,standard,14,46500,1,1 C1026,남,premium,15,64500,2,1 C1027,남,basic,45,28100,4,0 C1028,남,standard,49,40600,1,1 C1029,남,standard,59,50800,4,0 C1030,여,basic,16,27800,3,1 C1031,남,basic,36,24900,0,1 C1032,남,basic,17,30200,4,0 C1033,여,basic,36,29900,3,1 C1034,남,basic,36,23800,2,0 C1035,여,standard,9,50200,1,1 C1036,여,premium,45,60800,2,0 C1037,여,standard,37,42900,3,0 C1038,여,basic,37,24800,2,0 C1039,남,standard,42,46300,0,0 C1040,여,basic,34,28400,2,1 C1041,남,premium,11,84200,3,1 C1042,남,standard,9,57000,4,1 C1043,여,standard,11,43500,3,1 C1044,여,basic,42,29200,2,1 C1045,여,premium,10,66800,4,1 C1046,남,premium,56,62700,2,0 C1047,남,standard,19,44100,3,1 C1048,여,basic,14,33700,2,0 C1049,여,basic,44,28800,0,1 C1050,여,premium,32,69800,0,1 C1051,남,basic,52,24100,3,0 C1052,남,standard,48,35900,1,0 C1053,여,basic,41,26300,0,0 C1054,여,basic,36,25500,1,1 C1055,여,basic,7,29000,3,0 C1056,여,basic,34,32700,3,1 C1057,남,standard,42,48900,4,1 C1058,여,basic,32,25800,1,1 C1059,남,standard,56,50100,3,0 C1060,여,standard,28,41500,1,0 C1061,여,premium,47,73900,0,0 C1062,남,premium,4,53900,3,1 C1063,여,premium,4,72600,0,1 C1064,여,basic,42,29100,4,1 C1065,남,basic,59,29800,4,0 C1066,남,premium,28,75100,1,0 C1067,남,basic,27,27200,0,0 C1068,남,basic,60,30100,2,1 C1069,여,premium,4,67400,1,1 C1070,여,basic,4,34100,0,1 C1071,남,standard,42,40800,4,0 C1072,여,premium,53,72900,4,0 C1073,남,standard,36,37500,1,0 C1074,남,standard,44,49800,0,0 C1075,남,basic,5,29700,3,1 C1076,남,premium,1,75600,3,1 C1077,남,standard,44,40600,1,1 C1078,여,basic,7,23800,1,0 C1079,여,premium,47,66100,4,1 C1080,남,standard,32,41500,1,0 C1081,남,premium,37,78500,4,1 C1082,남,premium,52,68500,1,0 C1083,남,premium,51,61900,3,1 C1084,남,basic,38,30000,2,1 C1085,남,basic,12,30900,0,0 C1086,남,premium,25,74900,1,1 C1087,여,standard,40,47300,1,0 C1088,남,standard,6,41600,1,1 C1089,남,premium,57,64200,4,0 C1090,여,basic,42,28700,0,1 C1091,여,standard,27,37300,0,1 C1092,남,basic,27,25900,2,1 C1093,여,basic,41,27900,0,0 C1094,남,standard,60,44200,0,0 C1095,남,premium,12,67100,2,1 C1096,남,standard,46,45700,1,0 C1097,여,standard,23,48800,1,1 C1098,남,premium,57,75300,4,0 C1099,남,premium,13,53900,0,0 C1100,여,premium,29,61600,3,1 C1101,남,standard,2,47300,3,1 C1102,남,standard,10,55900,1,1 C1103,남,premium,3,71800,1,1 C1104,남,premium,53,70000,1,0 C1105,남,premium,32,71300,2,1 C1106,남,premium,9,66000,0,1 C1107,여,premium,30,66100,2,1 C1108,남,standard,43,53500,3,0 C1109,남,basic,26,29400,4,0 C1110,여,standard,21,48500,4,0 C1111,남,standard,51,42400,0,1 C1112,남,premium,21,74100,4,0 C1113,남,premium,56,56600,0,0 C1114,남,standard,46,45300,4,0 C1115,여,standard,48,42300,4,0 C1116,여,basic,35,24700,4,1 C1117,여,premium,22,42700,1,0 C1118,남,standard,9,39900,4,1 C1119,남,premium,36,73100,1,0 C1120,여,premium,38,73800,0,1 C1121,여,standard,13,49300,4,0 C1122,남,basic,48,30300,0,0 C1123,남,standard,16,43800,0,1 C1124,남,premium,15,74000,2,1 C1125,남,basic,25,30200,0,1 C1126,남,basic,44,33000,2,1 C1127,남,basic,56,21800,3,0 C1128,남,standard,48,38600,1,0 C1129,여,premium,15,68200,0,1 C1130,여,basic,28,27400,3,0 C1131,남,standard,54,40800,4,0 C1132,남,basic,45,26900,3,0 C1133,여,premium,21,66200,0,1 C1134,여,premium,39,58900,0,0 C1135,남,basic,43,29000,3,0 C1136,남,standard,9,48600,4,1 C1137,남,basic,28,30300,1,0 C1138,남,premium,30,78600,4,0 C1139,남,basic,18,23900,3,0 C1140,남,standard,46,40900,2,1 C1141,남,premium,6,70300,0,1 C1142,남,basic,46,29100,1,0 C1143,남,standard,18,41600,3,0 C1144,여,basic,53,27800,3,1 C1145,여,basic,7,25400,0,1 C1146,남,basic,27,28800,0,1 C1147,여,premium,51,64300,4,0 C1148,남,premium,25,53100,2,0 C1149,남,standard,54,43800,1,1 C1150,남,premium,40,57700,0,1 C1151,여,standard,24,42900,3,1 C1152,남,premium,21,63300,1,1 C1153,여,standard,44,34800,3,0 C1154,여,basic,29,27400,2,1 C1155,여,premium,38,61500,1,0 C1156,여,premium,48,62600,4,0 C1157,남,basic,27,26900,1,1 C1158,남,standard,20,38000,4,0 C1159,여,premium,22,63700,2,1 C1160,여,standard,20,42800,1,0
고객ID,성별,요금제,가입개월,월요금,부가서비스 C2001,남,basic,32,30800,2 C2002,남,premium,31,63600,0 C2003,여,premium,51,56500,1 C2004,남,basic,15,31600,0 C2005,남,basic,8,35800,1 C2006,남,premium,4,67100,1 C2007,여,basic,13,21200,1 C2008,남,premium,57,67200,4 C2009,남,standard,55,45400,0 C2010,남,standard,30,46700,3 C2011,남,standard,43,38400,4 C2012,남,basic,33,31700,0 C2013,여,basic,20,29900,1 C2014,남,standard,47,43100,2 C2015,남,basic,4,28100,3 C2016,여,basic,31,31000,4 C2017,여,basic,7,25000,1 C2018,남,standard,10,49900,3 C2019,여,premium,2,73800,4 C2020,여,standard,51,40200,0 C2021,여,premium,48,63300,0 C2022,남,premium,43,60000,0 C2023,여,standard,12,48400,1 C2024,남,premium,8,68400,0 C2025,여,standard,47,42900,4 C2026,여,premium,1,66400,4 C2027,여,basic,18,34800,0 C2028,남,basic,27,27400,0 C2029,남,standard,2,57500,4 C2030,남,premium,8,74400,4 C2031,남,premium,44,74600,0 C2032,남,basic,7,35500,4 C2033,남,premium,39,76400,0 C2034,여,basic,40,29700,1 C2035,여,standard,18,42100,1 C2036,여,standard,25,47700,4 C2037,여,premium,46,52700,4 C2038,남,premium,46,64700,2 C2039,여,premium,47,65700,1 C2040,여,basic,15,29500,2
들여쓰기: Tab · 편집기에서 나가기: Esc 다음 Tab
실행 결과
실행하면 코드가 출력한 내용이 여기에 나타나요.
막혔을 때
풀이와 비교하기
내 코드와 한 줄씩 비교해 보세요. 풀이를 보는 것만으로 완료되지는 않아요.
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import OrdinalEncoder
train = pd.read_csv("churn_train.csv")
test = pd.read_csv("churn_test.csv")
X = train.drop(columns=["고객ID", "이탈"])
X_test = test.drop(columns=["고객ID"])
enc = OrdinalEncoder(handle_unknown="use_encoded_value", unknown_value=-1)
X[["성별", "요금제"]] = enc.fit_transform(X[["성별", "요금제"]])
X_test[["성별", "요금제"]] = enc.transform(X_test[["성별", "요금제"]])
y = train["이탈"]
model = RandomForestClassifier(n_estimators=100, random_state=42).fit(X, y)
pred = model.predict_proba(X_test)[:, 1]
pd.DataFrame({"pred": pred}).to_csv("result.csv", index=False)
check = pd.read_csv("result.csv")
print(check.shape)
print(check.columns.tolist())
print(round(float(check["pred"].mean()), 4))
print(check.head(3).round(4))