티스토리를 기술블로그로 사용하고 있기 때문에 빅분기 코드 리뷰를 옮기려고 합니다.
네이버 블로그에는 링크만 걸어둘 예정입니다.
그리고 블로그에 준비 어떻게 했냐는 질문이 있었는데 현업에서 파이썬을 다루고 있어서 따로 시간내서 공부하진 않았습니다.
시험 전날 사이트에서 미리 제공한 샘플 문제만 한번 풀어보고 기본적으로 사용할 사이킷런 모듈 몇개 외워갔습니다.
이제 진짜 2회 실기 문제 복원을 해볼텐데요.
밑에 제가 적어둔 주피터 파일을 공유하긴 할텐데 블로그에도 적어보겠습니다.
단답형
---
## ***단답형***
---
*문제는 기억이안나서 답만 적음 (순서 상관x)*
1. 이상치
2. 평균대치법
3. 비지도학습
4. 부스팅
5. 그래디언트 부스트
- 그래디언트 부스팅인데 부스트라고 적어서 오답처리 될 줄 알았는데 맞다고해줌
6. 하이퍼파라미터
7. 후진제거법
8. 과대적합
9. roc curve
10. 은닉층 계산 문제
- 정확한 문제는 아님. 대충 비슷하게 복원.
10. 은닉층 계산 문제
\(x_1\,=\,0.5, \; x_2\,=\,0.6\)이고
각각의 가중치와 편향이 \(w_1\,=\,0.1,\;b_1\,=\,-0.1,\;w_2\,=\,0.2,\;b_2\,=\,0.05\)일 때
\(hidden layer(h_1)\)의 값을 구하시오.
(단, \(h_1\,<\,0\)이라면 \(h_1\,=\,-1\)임)
10. 해설
\((w_1\,\times\,x_1\,+\,b_1)\;+\;(w_2\,\times\,x_2\,+\,b_2)\;=\;h_1\)
\(h_1\;=\;-0.12\)
\(h_1\)가 음수이므로 \(h_1\,=\,-1\)
정확한 문제는 잘 기억이 안나지만 이런식이었던것 같네요.
정답만 보셔도 아시겠지만 까다로운 단답형 문제는 아니었어요.
필기 공부를 어느정도 하셨다면 다 풀 수 있을정도의 난이도였다고 생각합니다.
작업형 1 유형
#### 1번 문제 : 평균 구하기
'''
주어진 Dataset에서 CRIM값이 가장 큰 10개의 지역을 구하고
10개의 지역의 CRIM값을 그 중 가장 작은 값으로 대체함
AGE 컬럼 값이 80이상인 대체 된 CRIM 평균값을 구하라
'''
# TEST
import pandas as pd
# CRIM 컬럼 기준으로 데이터 내림차순 정렬
df = df.sort_values('CRIM', ascending=False)
# CRIM값이 가장 큰 10개의 값중 가장 작은 값 추출
min_crim = df[:10]['CRIM'].min()
# 가장 큰 10개의 값 대체
df.iloc[:10, 0] = min_crim
# 대체 후 AGE 칼럼값이 80이상인 CRIM값들의 평균
result = df.loc[df['AGE']>=80, 'CRIM'].mean()
print('최종 결과 : ', result)
#### 2번 문제 : 표준편차 비교하기
'''
주어진 Dataset에서 total_bedrooms컬럼의 중앙값으로 해당 컬럼의 결측치를 대체함
해당 컬럼 대치 전후의 표준편차 차이를 구하라
'''
# TEST
import numpy as np
import pandas as pd
# 대체 전 표준편차 계산
bf_std = np.std(df['total_bedrooms'])
# 결측치 채우기
df['total_bedrooms'].fillna(df['total_bedrooms'].median(), inplace=True)
# 대체 후 표준편차 계산
af_std = np.std(df['total_bedrooms'])
# 표준편차 차이 비교
result = bf_std - af_std
print('최종 결과 : ', result)
#### 3번 문제 : 이상치 합 구하기
'''
해당 문제는 시험에 사용된 데이터셋을 구하지 못해 2번 문제의 데이터셋을 사용하겠습니다.
주어진 Dataset의 total_rooms컬럼의 평균으로 부터 1.5 * 표준편차를 벗어나는 영역을 이상치라고 판단하고
이상치들의 합을 구하여라.
'''
# TEST
import numpy as np
import pandas as pd
# 1.5 * std값 구하기
std = np.std(df['total_rooms']) * 1.5
# 컬럼의 평균에 이상치 영역의 min, max 구하기
min_std, max_std = df['total_rooms'].mean() - std, df['total_rooms'].mean() + std
# min-max 범위를 벗어나는 값을 선택하여 합계 구하기
result = df.loc[(df['total_rooms'] > max_std) | (df['total_rooms'] < min_std), 'total_rooms'].sum()
print('최종 결과 : ', result)
작업형 2유형
dataset : https://www.kaggle.com/prachi13/customer-analytics (해당 링크에서 데이터를 다운받아 사용해주세요.)
인터넷에서 동일한 데이터셋이라고 봤는데 실제 동일한 데이터인지는 확신할 수 없습니다.
일단 문제풀기에 앞서 주관적인 생각과 데이터 처리방식에 대해 간단히 적어보겠습니다.
작업2유형에서는 힘을 전혀 안주고 만들었습니다. 즉, 가장 basic한 모델을 만들 생각을 하고 있었습니다.
단답형과 작업1유형에 크게 실수만 하지 않는다면 작업2유형에 꼭 높은 점수를 받을 필요가 없다 생각했고 시험에서도 까다로운 데이터를 주지 않을 것이라고 생각했습니다.
이미 시험보기전부터 RF모델을 사용하려고 했구요.
정확도를 올리려고 노력할 생각이 없어서 스케일링 사용 안했고
범주 컬럼 라벨링도 그냥 Labelencoder사용했습니다. (모델 돌아가는데 크게 문제 없습니다.)
코드실행시간이 1분으로 제한되어 있어서 하이퍼파라미터 최적화도 진행하지 않았습니다. (GridSearchCV)
해당 코드에서는 train에대한 roc-auc-score가 0.5정도 나왔는데
시험에서는 테스트할때 동일한 코드로 0.67정도 나왔습니다.
실제 정답에 대해서는 몇점이 나왔는지 모르겠지만.. 아마 비슷하게 나왔을텐데 점수 기준은 잘모르겠네요.
# 해당시험에서 사용한 패키지
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
# 해당 시험에서 제공해준 컬럼 정보에 Discount_offered 컬럼이 int type이었지만
# 제공받은 데이터셋에서는 Discount_offered 컬럼이 object type으로 되어있어
# Discount_offered 컬럼에 잘 못 들어간 문자열을 제거해 int type으로 다시 바꿔주는 작업을 진행함
# 컬럼내에 문자값이 들어있는 row를 찾고 해당 row의 문자값을 삭제
X_train.loc[(X_train.Discount_offered.str.contains('(\D)')),'Discount_offered'] \
= X_train.loc[(X_train.Discount_offered.str.contains('(\D)')),'Discount_offered'].str.replace('(\D)','')
X_train.Discount_offered = X_train.Discount_offered.astype(int) # int type 변환
# object column labeling
obj_col = X_train.select_dtypes(include='object').columns
le = [LabelEncoder() for i in range(len(obj_col))]
for l in range(len(obj_col)):
X_train[obj_col[l]] = le[l].fit_transform(X_train[obj_col[l]])
# y_test 데이터가 없으므로 x_train,y_train 데이터를 다시 split하여 점수 확인용으로 사용
train_x, test_x, train_y, test_y = train_test_split(X_train, y_train, train_size=0.8)
# modeling
rf_model = RandomForestClassifier()
rf_model.fit(train_x, train_y)
prediction = rf_model.predict(test_x)
roc_auc = roc_auc_score(test_y, rf_model.predict_proba(test_x)[:, 1])
print('***** roc : ', roc_auc, ' *****')
# x_test 전처리 진행 : x_train 처리 방식과 동일
# 숫자형 컬럼으로 변환과정
X_test.loc[(X_test.Discount_offered.str.contains('(\D)')),'Discount_offered'] \
= X_test.loc[(X_test.Discount_offered.str.contains('(\D)')),'Discount_offered'].str.replace('(\D)','')
X_test.Discount_offered = X_test.Discount_offered.astype(int) # int type 변환
# 라벨인코딩
for l in range(len(obj_col)):
X_test[obj_col[l]] = le[l].transform(X_test[obj_col[l]])
# 최종 모델 생성
rf_model = RandomForestClassifier()
rf_model.fit(X_train, y_train)
prediction = rf_model.predict(X_test)
# 최종 제출 값
result = pd.DataFrame(rf_model.predict_proba(X_test)[:, 1], columns=['test'])
result.to_csv('./수험번호.csv', index=False)
대충 기억을 되살려 복원을 해보긴했는데
정확하진 않을거에요..
코드도 뭐가 맞다 할 수 없고.. 그냥 참고만 해주시면 감사하겠습니다.
코드상에 오류가 있다면 말씀해주시구요
실제 데이터셋으로 위에 코드를 실행해볼 수 있도록 주피터 파일을 만들어놓았으니 필요하신분들은
사용해보셔도 됩니다
데이터셋을 구해본다고 했는데 시험장과 일치한 데이터인지는 기억이 가물가물 하네요.
작업1유형의 3번문제는 데이터셋을 구하지 못해 2번문제와 동일한 데이터를 사용했구요.
'Certificate' 카테고리의 다른 글
[글내림]빅데이터분석기사 노트정리 공유 (72) | 2021.05.10 |
---|---|
SQLD 노트정리 공유 (5) | 2021.04.30 |