본문 바로가기

카테고리 없음

빅데이터 분석기사 - 작업형 2유형 끝내기 [데이터 분석 전반]

데이터 분석은 크게 분류와 회귀로 나뉘고,

분류는 이진분류(Binary classification) 다중분류(Multi classification)

회귀는 그 외 어떤 실수값을 예측하면 된다.

 

내가 작년에 4회차때 기억으론 Price를 예측하는 회귀문제가 나왔던 걸로 기억하는데,

올해는 뭔가 다중분류가 나올거 같은 느낌적인 느낌이다 . . .

 

빅데이터 분석기사 실기에서는 

전처리 / 간단한 EDA / TRVD 스필릿 / 모델링 / 결과제출

정도만 하면 100점 만점이 나오는 것 같다.

HP 튜닝도 안해도 되는거 같고 (굳이 한다면 GridSearch 정도?)

CrossValidation 같은 경우도 필요는 없는듯.

 

캐글이나 데이콘에 절여지면 모형성능을 올리려고 죽어라 이것저것 하는데 기사에서는 그런게 필요없어 보이고..

오히려 정확히 import 하는 라이브러리를 알고 활용할 줄 만 알면 OK.

 

[EDA]

DataFrame에 데이터 타입과 널을 뜯기에는 info가 강력하고,

피쳐별로 분포와 통계량 뜯는 걸로는 describe가 강력하다.

우리가 data를 load하고 head찍는게 기본이듯이, info와 describe는 필수다.

describe는 그냥 찍으면 numeric feature에 대해서만 계산되므로,

include = 'O' 파라미터를 추가해서 object에 대한 카운트도 확인하자.

특히 데이터량이 방대하면 이런 기본 메소드로 푸는게 시간이 오래걸리거나 어떠한 데이터의 결함때문에 에러가 나겠지만, 기사시험같이 깔끔한 준데이터가 있으면 가장 강력할듯.

 

그 다음이 당연히 taget label에 대해 이것저것 뜯어보는 작업인데,

먼저 가장 기본이 분류문제면 target의 비율을 보거나, 회귀문제면 target의 분포를 보는 작업이다.

분류문제에서는 타겟비율이 적은 imbalence 문제를 잡아내는것이 중요하고,

회귀문제에서 분포가 들쑥날쑥하면 log를 씌워주는 등의 작업이 필요할 것이다.

 

 

[인코딩]

 

* 수치형 변수 인코딩

Tree계열 모형을 쓴다고 하면 수치형은 딱히 인코딩할 필요가 없지만, 경우에 따라서 StandardScaler 정도 써주면 나쁘지 않을 것 같다.

from sklearn.preprocessing import StandardScaler

# cols = ["", "", "", ...] # 수치형 칼럼명 직접 지정
# con_cols = train.select_dtypes(exclude = "object").copy

con_df = train.select_dtypes(include=['float64', 'int64']).copy() # 수치형 칼럼명 가져오기
con_cols = con_df.columns


display("train 스케일링 전", train.head()) # 스케일링 전 확인
display("test 스케일링 전", test.head()) # 스케일링 전 확인

scaler = StandardScaler()

train[con_cols] = scaler.fit_transform(train[con_cols])
test[con_cols] = scaler.transform(test[con_cols])

display("train 스케일링 후", train.head()) # 스케일링 후 확인
display("test 스케일링 후", test.head()) # 스케일링 후 확인

 

* 범주형 변수 인코딩

범주형 변수는 진짜 문자열로 이루어져있거나 그 문자열을 단순 라벨(코드명 등)로 바꾼 경우

여러가지 방법이 있지만, 기사시험 수준에서는

1. 원핫더미를 이용하거나,

train = pd.get_dummies(train)
test = pd.get_dummies(test)

2. 사이킷런에 있는 라벨인코더 정도 이용하면 좋을 것 같다.

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
le_fit = le.fit(train)

train_encode = le_fit.fit_transform(train)
test_encode = le_fit.fit_transform(test)

 

*** 모든 인코딩 과정에서 인코더는 train으로만 학습하는 걸 늘 명심하자.

 

[학습/테스트 데이터 분리]

 

학습과 테스트를 나누는 것은 물론이고,

사실 요즘엔 모델 성능을 올리기 위해 검증셋까지 나누는 것이 필수적인것 같다.

만약 Cross-validation 을 한다고 하면 아래 코드를 루프를 돌리면서 Objective까지 추가해서 HP튜닝을 하던 해야겠찌? 

 

개인적으로 이 사이킷런 모듈에 있는 split 함수의 stratify 옵션을 무조건적으로 사용하는걸 추천한다.

StratifiedKFold is a variation of k-fold which returns stratified folds: each set contains approximately the same percentage of samples of each target class as the complete set.

이렇게 하면 학습/검증/테스트에 같은 퍼센트의 타겟비율을 구성할 수 있고,이것이 그렇지 않을때보다 모델 일반화에 유리하다고 생각한다.

from sklearn.model_selection import train_test_split

X_train, X_val, y_train, y_val = train_test_split(train, y, test_size = 0.2, random_state = 228, stratify = y)

 

[Metrics]

sklearn에 사실 다 들어가 있어서, 함수를 외우기만 하면 될 노릇이다.

이진분류 : f1-score, roc-auc curve값, recall, precision, accuracy

멀티분류 : macro-f1-score

회귀 : mse, rmse

 

from sklearn import metrics

f1_score = metrics.f1_score(y_ture, preds)
roc = metrics.roc_auc_score(y_ture, preds)


def rmse(y_true, preds):
	mse = metrics.mean_square_error(y_true, preds)
    return mse**0.5
metrics.mean_square_error()

 

Precision과 recall은 볼때마다 헷갈리는데,

Precision : 모델이 True라고 예측한 것중에서 진짜 레이블이 True : TP / TP+FP

Recall : 정답이 True인 것중에서 모델이 True라고 예측 : TP / TP+ FN

https://sumniya.tistory.com/26

 

분류성능평가지표 - Precision(정밀도), Recall(재현율) and Accuracy(정확도)

기계학습에서 모델이나 패턴의 분류 성능 평가에 사용되는 지표들을 다루겠습니다. 어느 모델이든 간에 발전을 위한 feedback은 현재 모델의 performance를 올바르게 평가하는 것에서부터 시작합니

sumniya.tistory.com

 

 

[모델링]

그냥 다른거 필요없고 트리계열 앙상블인 RandomForest랑 Xgboost or Lightgbm 쓰면 될거 같다.

둘 다 분류/회귀용 라이브러리가 장착되어 있으면서.. 크게 데이터 전처리에 구애받지 않고 성능이 잘 나오니까 마구마구 가져다 쓰면 될듯!

 

[pandas 통계 함수 참고]

https://www.kaggle.com/code/agileteam/pandas-statistical-function/notebook

 

Pandas Statistical Function

Explore and run machine learning code with Kaggle Notebooks | Using data from Big Data Certification KR

www.kaggle.com

 

  • 최대값 .max
  • 최소값 .min
  • 평균값 .mean
  • 중앙값 .median
  • 최빈값 .mode
  • 합계 .sum
  • 데이터 수 .count (결측값 제외됨)

 

  • 분위수 .quantile
  • 분산 .var
  • 표준편차 .std
  • 왜도 .skew
  • 첨도 .kurt
  • 누적합 .cumsum
  • 누적곱 .cumprod
  • 누적 최대값 .cummax
  • 누적 최소값 .cummin
  • 평균의 표준오차 .sem
  • 평균 절대편차 .mad
  • 절대값 .abs
  • 곱 .prod