본문 바로가기
자격증/빅데이터분석기사-실기

빅데이터분석기사 실기 2유형 개념

by jinny-log 2024. 11. 11.

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