1. 데이터 불러오기
2. 데이터 전처리
- test 데이터에서 이상치, 결측치 삭제 하면 안됨
- 전처리 시, 전처리한 내용이 db에 반영될 수 있도록 네이밍 또는, inplace=True 적용해야 함 (계속 놓치는 부분)
- 컬럼 drop : 머신러닝과 관계없는 컬럼 drop (id,이름)
- 컬럼은 numeric과 object 분리하기
- (col_cat) object컬럼 -> 원-핫 인코딩
- (col_num) numeric -> MinMax 스케일링
2.1 결측치 처리
결측치 삭제 | |
결측치 행 삭제 (전체) | df=df.dropna() |
결측치 행 삭제 (특정 컬럼) | df=df.dropna(subset=['column1','column2']) |
결측치 열 삭제 (전체) | df=df.dropna(axis=1) |
결측치 열 삭제 (특정 컬럼) | df=df.drop(['column1','column2'],axis=1) |
결측치 채우기 (범주형) | |
결측치 최빈값 채우기 | mode=df['column1'].mode()[0] df['column1']=fillna(mode) |
결측치 새로운 변수 생성 | df['column1']=df['column1'].fillna('X') |
결측치 채우기 (수치형) | |
결측치 평균값 대체 | mean=int(df.column1.mean()) df['column1']=df['column1'].fillna(mean) |
결측치 중앙값 대체 | median=int(df.column1.median()) df['column1']=df['column1'].fillna(median) |
2.2 이상치 처리
- 이상치는 일반적인 데이터 패턴에서 벗어난 값을 말한다. 이상치는 IQR을 활용하거나 도메인 전문가라면 판단할 수 있다. 빅데이터 분석 시험에서는 이상치 처리를 명시한 것이 아니라면 생략해도 좋다.
2.3 인코딩 (범주형 데이터)
- train과 test data에 모두 적용하는 것을 잊지 말것
- shape를 통해 train/test 모두 column 늘어난 것 확인
인코딩 - 원핫인코딩 vs 레이블 인코딩 - object컬럼의 unique수 확인 시, 매우 많을 경우 레이블 인코딩, 적을 때는 원-핫 인코딩 - object컬럼의 unique수에 따라 칼럼별 인코딩 방법을 달리해도 되지만, 시험이라는 특수성 상 일괄 적용해서 빠르게 검증하는 것이 좋음 |
|
인코딩할 때 train.test 합친 후 다시 분할 | |
원핫인코딩(one-hot) | |
trian | train_oh=pd.get_dummies(train) |
test | test_oh=pd.get_dummies(test) |
주의점 | train과 test데이터의 value_counts 고유값이 일치하지 않은 경우 오류 발생하므로 원핫 인코딩할 때는, 데이터를 합쳐서 인코딩한 후에 train/test 분리하는 것을 추천함 예를 들어 train데이터의 과일종류 열에는 사과, 포도, 배 3개 존재하는데 test데이터에는 사과,포도만 있는 경우 인코딩 오류 발생함. data=pd.concat([train,test],axis=0) #데이터 합치기 data_oh=pd.get_dummies(data) # 원핫인코딩 적용 train_oh=data_oh.iloc[:len(train)].copy() #train 데이터 구분하기 test_oh=data_oh.illoc[len(train):].copy() #test 데이터 구분하기 train_oh.shape #shape 확인하기 test_oh.shape |
레이블인코딩(label-encoding) - for문 돌려야 함 | |
인코딩할 object 컬럼 추출 | (방법1) cols=train.select_dtypes(include='object').columns |
(방법2) cols=train.colulmns[train.dtypes==object] | |
(방법3) cols=['column1','column2',...''] - 직접 지정 | |
1) for 문으로 라벨 인코딩하기 | from sklearn.preprocessing import LableEncoder for col in cols: le = LabelEncoder() train[col]=le.fit_transform(train[col]) test[col]=le.fit_transform(test[col]) |
2) cat.codes 함수 활용 | for col in cols: df[col]=df[col].astype('category').cat.codes |
2.4 스케일링 (수치형 데이터)
수치형 컬럼 정의 | # 수치형 컬럼명 cols = ['age', 'fnlwgt', 'education.num', 'capital.gain', 'capital.loss', 'hours.per.week'] |
MinMax스케일링 - 모든 값이 0과 1사이의 값 |
from sklearn.preprocessing import MinMaxScaler scaler=MinMaxScaler() train_copy[cols]=scaler.fit_transform(train_copy[cols]) test_copy[cols]=scaler.fit_trainsform(test_copy[cols]) |
표준화(Z-score정규화) - 평균이 0, 표준편차가 1인 표준 정규분포로 변경 |
from sklearn.preprocessing import StandardScaler scaler=StandardScaler() train_copy[cols]=scaler.fit_transform(train_copy[cols]) test_copy[cols]=scaler.fit_transform(test_copy[cols]) |
로버스트 스케일링 - 중앙값과 사분의 값을 활용하여 이상치 영향 최소화 |
from sklearn.preprocessing import RobustScaler scaler=RobustScaler() train_copy[cols]=scaler.fit_transform(train_copy[cols]) test_copy[cols]=scaler.fit_transform(test_copy[cols]) |
3. 검증 데이터 나누기 (데이터 전처리 완료 후)
검증 데이터 분할 | from sklearn.model_selection import train_test_split * from sklearn.preporcessing에서 import하는 것이 아니다 -- X_train, X_val, y_train, y_val 순서를 암기할 것 X_train, X_val, y_train, y_val = train_test_split( train, #X데이터로 dataframe 형태로 입력 target, #y데이터로 Series 형태로 입력 test_size=0.2, #검증용 데이터 비율 (test 문자 의미와 무관) random_state=2014 ) |
shape 확인 | 데이터 분할 이후 2가지 확인 X_train.shape, X_val.shape의 컬럼 수가 일치 해야 한다. y_train.shape, y_val.shape에서 컬럼 열부분에 1이 나타나지 않는 시리즈 형태여야 한다. 시리즈 형태의 shape 예시 (1000,) (500,) |
4. 모델 학습
1. 모델 구분하기 (분류/회귀) 첫번째 방법 target(label)이 어떤 형태로 되어 있는지 확인하기 - df.target.value_counts()값이 종류가 N개 즉 너무 많으면 회귀, 몇가지로 분류되면 분류모델 - 회귀 : 예측하고자 하는 값이 연속형 변수 (ex. 수요예측,접속량,사용량,판매금액) - 분류 : 확률값 또는 카테고리 두번째 방법 : 평가 지표 살펴보기 - 회귀 : MAE, MSE, RMSE 등 Error가 붙어 있으면 회귀 |
|
2. 분류 모델 | |
예측값 확인 | 예측할 값이 각 레이블에 속한 확률값을 반환하는 것인지 ->predict_proba ㄴ 평가지표 : ROC_AUC 아니면 각 레이블을 반환하는 것인지 구분하기 ->predict ㄴ 평가지표 : Accurcy(정확도) |
분류 모델 | Random Forest (입력형 데이터로 숫자만 처리할 수 있음) from sklearn.ensemble import RandomForestClassifier rf=RandomForestClassfier() rf.fit(X_train,y_train) pred=rf.predict_proba(X_val) print(rf.classes_) # 컬럼의 순서를 확인해보기 ['<=50K', '>50K'] 순서로 되어 있을 때 pred의 첫번째 열인 <=50K인 확률을 추출하고 싶은 경우, pred의 두번째 열인 >50K인 확률을 추출하고 싶은 경우, pred[:,1] |
LightGBM (object를 categori타입으로 변환하면 인코딩 없이 진행할 수 있다) import lightgbm as lgb lgbmc.fit(X_train,y_train) pred=lgbmc.predict_proba(X_val) roc_auc =roc_auc_score(y_val, pred[:,1]) print('roc_auc:', roc_auc) pred=lgbmc.predict(X_val) accuracy=accuracy_score(y_val,pred) print('accuarcy_score', accuracy) f1= f1_score(y_val, pred, pos_label='>=50K') print('f1_score:',f1) |
|
분류 모델 평가 검증 지표= 지표(실제값,예측값) |
ROC_AUC - 주로 양성 클래스에 속할 확률을 예측하기 위해, 모델에 pred_proba()를 사용 - 1에 가까울수록 모델 성능이 우수함 pred=rf.predict_proba(X_val) from sklearn.metrics import roc_auc_score roc_auc=roc_acu_score(y_val,pred[:,1]) print('roc_auc:', roc_auc) |
Accuary 정확도 - 전체 데이터 중 올바르게 예측된 데이터의 비율 - 다중분류와 이진분류와 차이가 없다. pred=model.predict(X_val) from sklearn.metrics import accuarcy_score accuracy=accuracy_score(y_val,pred) print('accuarcy_score', accuracy) |
|
Recall 재현율 - 실제 양성인 데이터 중 모델이 양성으로 예측한 비율 (1에 가까울수록 좋은 모델) from sklearn.metrics import recall_score recall=recall_score(y_val,pred) * 분류 타깃값이 문자일 경우 양성 클래스 지정 recall=recall_score(y_val,pred,pos_lable='A') * 다중분류 (파라미터) recall=recall_score(y_val,pred, average='macro') |
|
Preicsion 정밀도 - 양성으로 예측된 데이터 중 실제로 양성인 비율 - 분류 타깃값이 문자일 경우 양성 클래스 지정 from sklearn.metrics import precision_score precision=precision_score(y_val,pred) *분류 타깃값이 문자일 경우 양성 클래스 지정 precision=precision_score(y_val,pred,pos_lable='A') * 다중분류 (파라미터) precision=precision_score(y_true,y_pred,average='macro') |
|
F1-Score 조화 평균 - 수치가 높을수록 좋은 모델 - 불균형 데이터를 평가하는데 좋은 지표 (재현율과 정밀도를 Recall과 Precision의 조화평균) from sklearn.metrics import f1_score *분류 타깃값이 문자일 경우 양성 클래스 지정 f1=f1_score(y_val,pred,pos_label='value') * 다중분류 (파라미터) f1=f1_score(y_true,y_pred,average='macro') f1=f1_score(y_true_str,y_pred_str,average='macro') |
|
회귀 모델 | LinearRegression from sklearn.linear_model import LinearRegression model=LinearRegression() model.fit(X_train, y_train) y_pred=model.predict(X_val) |
RandomForest from sklearn.ensemble import RandomForestRegressor model=RandomForestRegressor(random_state=2014) model.fit(X_train,y_train) y_pred=model.predict(X_val) |
|
LightGBM (random_state 있음) import lightgbm as lgb model=lgb.LGBMRegressor(random_state=2014, verbose=-1) model.fit(X_train,y_train) y_pred=model.fit(X_val) |
|
회귀 모델 평가 검증 |
MSE Mean Squared Error 실제값과 예측값의 차이를 제곱해 평균낸 값 from sklearn.metrics import mean_squared_error mse=mean_squared_error(y_true,y_pred) print('MSE :', mse) |
MAE Mean Absolute Error 실제값과 예측값의 차이의 절대값으로 계산하고 평균낸 값 from sklearn.metrics import mean_absolute_error mae=mean_absolute_error(y_true,y_pred) print('MAE :', mae) |
|
R squard 결정계수 결정계수 설명력은 1에 가까울수록 좋다. from sklearn.metrics import r2_score r2=r2_score(y_true,y_pred) print('결정계수 :', r2) |
|
RMSE Root Mean Squared Error 실제 값과 예측값의 차이를 제곱해 평균을 낸 MSE에 제곱근을 적용한 값 (큰 오차에 가중치) from sklearn.metrics import mean_squred_error mse=mean_squared_error(y_true,y_pred) rmse=mse**0.5 print("RMSE:",rmse) |
|
MSLE Mean Squared Log Error : 실제 값과 예측값의 로그를 취한 후 차이를 제곱해 평균한 값 (작은 오차에 큰 가중치) from sklearn.metrics import mean_squared_log_error msle=mean_squared_log_error(y_true,y_pred) print("MSLE :",msle) |
5. 테스트 셋 예측 결과 파일 생성
최적의 모델 선택후 | pred=model.predict(test) |
파일 제출 | submiit=pd.DataFrame({'pred' : pred}) #제출할 컬럼명 꼭 확인 할 것 submit.to_csv('result.csv', index=False) #제출할 파일 이름 꼭 확인 할 것, index=False 고정 |
Appendix.
정말 필수 내용만 암기하고 싶을때
https://youtu.be/06iKB3TwxjQ?si=PbaUuZ1B9ugthV30
https://blog.naver.com/waterhyacinth10/223049279984
빅분기 실기 작업형2 만점 방법 (빅데이터분석기사 실기 파이썬)
빅데이터분석기사(빅분기) 실기 작업형2 유형 백점 방법에 대해서 말씀드려보겠습니다. 저는 파이썬 기반으...
blog.naver.com
https://cafe.daum.net/oracleoracle/Smgg/7
빅데이터 분석 기사 실기 유형2 환경 만들기와 유형2번 답코드
# ▣ 빅데이터 분석 기사 실기 유형2번 코드 암기하기(분류 파트) # ■ 시험환경 만들기1. sklearn 에서 유방암 환자 데이터 불러오기 import pandas as pd from sklearn.datasets import load_breast
cafe.daum.net
'자격증 > 빅데이터분석기사-실기' 카테고리의 다른 글
빅데이터분석기사 실기 2유형 (마스터코드) (0) | 2024.11.16 |
---|---|
빅데이터분석기사 실기 3유형 - T검정 (0) | 2024.11.15 |
빅데이터분석기사 실기 참고자료 (0) | 2024.11.07 |
빅데이터분석기사 실기 공부 일지 (3) | 2024.11.04 |
빅데이터분석기사 실기 1유형 (0) | 2024.10.04 |