인지야공/ADP/2번째 글
ADP 실기 — 시험장 환경에 있는 것과 없는 것
ADP 실기는 인터넷이 끊긴 채로 주어진 파이썬 환경에서만 푼다. pip install 이 안 된다.
그래서 시험 준비의 절반은 “무엇을 아느냐”가 아니라 “그 환경에 무엇이 깔려 있느냐”였다.
준비하면서 pip list 를 통째로 받아 적어 두었는데, 실제로 도움이 된 것은 목록 전체가 아니라
없는 것들이었다.
버전이 낡았다는 것을 먼저 안다
| 패키지 | 버전 |
|---|---|
| numpy | 1.21.6 |
| pandas | 1.1.2 |
| scikit-learn | 0.23.2 |
| scipy | 1.7.3 |
| statsmodels | 0.13.2 |
| matplotlib | 3.0.3 |
| seaborn | 0.9.0 |
| tensorflow | 1.13.1 (Keras 2.2.4) |
| xgboost | 0.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 ARIMA | from statsmodels.tsa.arima_model import ARIMA 다 |
지금 이 글의 코드를 최신 환경에 그대로 붙이면 몇 군데는 깨진다. 당시 환경 기준으로 적어 둔 것이라 그렇게 두었다.
없어서 당황한 것들
목록을 훑다 보면 있을 줄 알았는데 없는 것이 나온다.
| 없는 것 | 대신 쓴 것 |
|---|---|
apyori | mlxtend (0.17.0) 의 apriori + association_rules |
fancyimpute | sklearn.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