실기
연습 화면을 불러오는 중…
연습 화면을 불러오는 중…
Python으로 준비하는 실기
코딩이 처음이라면 한 줄 실행부터.
설명 옆에서 직접 써 보고, 결과를 확인하며 배웁니다.
설치·가입 없이 이 화면에서 실행
코드를 실행해 안녕하세요를 출력해요.
처음 보는 코드를 읽고, 오류 메시지를 읽고, 짧은 코드를 스스로 고칠 수 있다.
표에서 원하는 숫자 하나를 뽑아내는 길을 스스로 찾을 수 있다.
전처리 조건을 그대로 코드로 옮겨, 문제가 요구한 자리수로 값을 낼 수 있다.
학습 데이터로 모델을 만들고 평가 데이터의 예측을 규격에 맞는 CSV 로 낼 수 있다.
검정통계량과 p-value 를 구하고 그 결과를 과장 없이 문장으로 옮길 수 있다.
도움말과 파일을 확인하며 혼자 문제를 풀고 제출할 수 있다.
배운 내용을 실전으로
train.csv 는 인구조사 4,000건과 정답 target(1 = 연소득 5만 달러 초과, 0 = 그 이하)이고, test.csv 는 정답이 없는 1,000건이다.
workclass·occupation·native_country 에는 원자료에 실제로 비어 있던 값이 그대로 들어 있다. 범주형 결측을 어떻게 다룰지 정해야 한다.
test.csv 의 각 행에 대해 target 을 0 또는 1 라벨로 예측한다.
예측 결과를 pred 열 하나만 가진 result.csv 로 현재 폴더에 저장한다. 행은 test.csv 와 같은 순서로 1,000개이며, 자동 생성되는 index 열이 있으면 안 된다.
제출하면 앱이 형식을 검사한 뒤 macro F1 을 계산한다. 이 규격은 공식 「실기 체험 환경 가이드」가 적은 2유형 제출 형식(예측 칼럼 1개·index 제거·지시된 파일명)과 같다.
isna().sum() 으로 빈칸을, dtypes 로 문자열 열을 찾는다. 이 자료의 결측은 합성한 것이 아니라 원자료에 있던 것이다.fillna('unknown') 은 "모른다" 자체를 하나의 범주로 만든다. 결측 행을 버리면 평가 자료의 행이 줄어 제출 행 수가 맞지 않는다.reindex(columns=학습열, fill_value=0) 없이는 평가 자료에만 있는 범주 때문에 열 개수가 어긋나 predict 가 실패한다.predict 를 쓴다 — 확률은 이 문항의 답이 아니다.pd.DataFrame({'pred': pred}).to_csv('result.csv', index=False). 공식 규격은 예측 칼럼 1개이며 경로를 따로 지정하지 않는다.import pandas as pd
from sklearn.ensemble import RandomForestClassifier
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
categorical = ['workclass', 'marital_status', 'occupation', 'sex', 'native_country']
numeric = [column for column in test.columns if column not in categorical and column != 'id']
x_train = train[numeric].copy()
x_test = test[numeric].copy()
for column in categorical:
dummies_train = pd.get_dummies(train[column].fillna('unknown'), prefix=column)
dummies_test = pd.get_dummies(test[column].fillna('unknown'), prefix=column)
# 평가 자료에만 있는 범주는 버리고, 없는 범주는 0 으로 채워 학습 열에 맞춘다
dummies_test = dummies_test.reindex(columns=dummies_train.columns, fill_value=0)
x_train = pd.concat([x_train, dummies_train], axis=1)
x_test = pd.concat([x_test, dummies_test], axis=1)
model = RandomForestClassifier(n_estimators=200, random_state=42)
model.fit(x_train, train['target'])
pred = model.predict(x_test)
pd.DataFrame({'pred': pred}).to_csv('result.csv', index=False)이 문항의 지표는 macro F1 이라 라벨을 내야 한다. 확률을 내면 형식 검사에서 "정수가 아니다" 로 걸린다. macro F1 은 두 클래스의 F1 을 단순 평균하므로, 적은 쪽 클래스(여기서는 target 1)를 거의 못 맞히면 정확도가 높아도 점수가 낮다. 이 기준 풀이의 macro F1 은 약 0.7396 이다. 제출 파일에 id 를 함께 넣으면 열이 2개가 되어 공식 규격에 어긋난다 — 행 순서가 곧 대응이다.
id 열을 함께 제출했다다른 문항에서 id, pred 두 열을 내던 습관이 그대로 나온다. 공식 규격은 "답안 CSV 파일에는 예측 결과 칼럼 1개만 생성" 이고, 열이 하나 더 있으면 형식 검사에서 걸린다.