인지야공

인지야공/ADP/2번째 글

ADP 실기 — 시험장 환경에 있는 것과 없는 것

ADP 실기는 인터넷이 끊긴 채로 주어진 파이썬 환경에서만 푼다. pip install 이 안 된다. 그래서 시험 준비의 절반은 “무엇을 아느냐”가 아니라 “그 환경에 무엇이 깔려 있느냐”였다.

준비하면서 pip list 를 통째로 받아 적어 두었는데, 실제로 도움이 된 것은 목록 전체가 아니라 없는 것들이었다.

버전이 낡았다는 것을 먼저 안다

패키지버전
numpy1.21.6
pandas1.1.2
scikit-learn0.23.2
scipy1.7.3
statsmodels0.13.2
matplotlib3.0.3
seaborn0.9.0
tensorflow1.13.1 (Keras 2.2.4)
xgboost0.9 · lightgbm 2.2.3 · catboost 0.14.0

집에서 최신 버전으로 연습하다 시험장에서 막히는 지점이 여기다. 방향이 반대라는 게 함정이다. 보통은 “옛날 코드가 최신 라이브러리에서 안 돈다”를 걱정하는데, 여기서는 최신 코드가 옛날 라이브러리에서 안 돈다.

특히 걸렸던 것들:

최신에서 쓰는 것0.23.2 / 0.9.0 에서는
ConfusionMatrixDisplay.from_estimator(...)plot_confusion_matrix(model, X, y) 를 쓴다
cv.get_feature_names_out()cv.get_feature_names() 다
sns.countplot(data=df, x="gender")sns.countplot(df["gender"]) 로 그냥 넣는다
BaggingClassifier(estimator=...)base_estimator= 다
from statsmodels.tsa.arima.model import ARIMAfrom statsmodels.tsa.arima_model import ARIMA 다

지금 이 글의 코드를 최신 환경에 그대로 붙이면 몇 군데는 깨진다. 당시 환경 기준으로 적어 둔 것이라 그렇게 두었다.

없어서 당황한 것들

목록을 훑다 보면 있을 줄 알았는데 없는 것이 나온다.

없는 것대신 쓴 것
apyorimlxtend (0.17.0) 의 apriori + association_rules
fancyimputesklearn.impute.IterativeImputer (실험적 기능이라 별도 import 필요)
wordcloud워드클라우드를 못 그린다. 빈도 상위 단어 막대그래프로 대체
nltk영어 전처리를 정규식과 직접 만든 불용어 리스트로 처리

반대로 konlpy 0.5.1 은 있다. JPype1, mecab-python3, python-mecab-ko, jamo, hangulize 까지 깔려 있으니 한글 형태소 분석은 마음 놓고 써도 된다. 텍스트 마이닝 문제가 나오면 영어보다 한글 쪽이 오히려 안전하다.

그 밖에 있어서 반가웠던 것들 — pingouin(통계 검정 한 줄 요약), factor-analyzer(요인분석), scikit-posthocs(사후검정), pmdarima(auto ARIMA), PuLP(선형계획법), lifelines(생존분석), prince(대응분석), imbalanced-learn(SMOTE).

PuLP 가 있다는 건 최적화 문제가 나올 수 있다는 뜻이다. 실제로 22회에 재료 제약 아래 최대 수익을 내는 생산량을 구하는 문제가 나왔다.

한글 폰트

그래프에 한글을 쓰면 네모가 뜬다. 답안에 그래프를 첨부해야 하므로 이건 실점으로 직결된다. 맨 위에 넣고 시작한다.

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

font_path = 'C:/Windows/Fonts/malgun.ttf'
font_name = fm.FontProperties(fname=font_path, size=10).get_name()
plt.rc('font', family=font_name)
plt.rc('axes', unicode_minus=False)   # 마이너스 기호도 깨진다
plt.rc('font', size=10)
plt.style.use('ggplot')

unicode_minus 를 빼먹으면 축의 음수 값만 네모가 된다. 한글은 멀쩡한데 축이 이상해서 한참 찾았다.

출력이 잘리지 않게

describe() 나 연관규칙 결과를 캡처해 붙일 때 ... 로 생략되면 그대로 감점이다.

import pandas as pd
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)

답안 저장

예측 결과를 파일로 제출하라는 문제가 자주 나온다. 19회는 result.csv, 21회도 비슷했다.

top_rules.to_csv('result.csv', index=False)

index=False 를 빼면 이름 없는 첫 열이 하나 붙는다. 채점 기준에 걸리는지는 모르겠지만 붙여서 낼 이유가 없다.

정리

시험 전날 이 글 하나만 다시 보는 게 목적이라면 네 줄이다.

  • sklearn 은 0.23.2, seaborn 은 0.9.0 이다. 최신 API 를 쓰지 않는다
  • 연관분석은 mlxtend, 워드클라우드는 없다
  • 폰트 설정 네 줄을 맨 위에 박고 시작한다
  • 파일 제출은 index=False

표시는 이 브라우저에만 남는다. 서버로 가는 것은 없다.