본문 바로가기
IT&게임/빅데이터분석기사(빅분기)

빅데이터분석기사 제2유형 : ④ 머신러닝 (분류)

by 푸루루 2024. 6. 6.
728x90
반응형

머신러닝의 기본 프로세스 

  • 문제정의, 라이브러리/데이터 불러오기
  • 탐색적 데이터 분석 (EDA)
  • 데이터 전처리
  • 피처엔지니어링
  • (Train/Validation 나누기)
  • 모델 선택/훈련/평가/최적화
  • 예측
  • (csv 생성)

 

이번에 코딩 할 베이스라인1

  • 문제정의, 라이브러리 및 데이터 불러오기
  • 데이터 전처리 (단순 일괄 처리)
  • 모델 선택(, 훈련
  • 평가

이번에 코딩 할 베이스라인2

  • 훈련/검증용 데이터 분리
  • 모델 선택, 훈련
    • 의사결정나무
    • 랜덤포레스트
    • XGBoost
  • 평가

문제1

  • "<= 50K -> 0"
  • "> 50K -> 1"
  • 평가: 정확도

- 성인 인구 조사 소득 예측(분류)

- 50K보다 상위 모델은 1 (상위소득) 이하는 0(하위소득) 으로 측정하라

 

데이터 불러오기, 샘플 체크, 크기 확인하기 

# 라이브러리 및 데이터 불러오기

import pandas as pd
X_train=pd.read_csv("X_train.csv")
X_test=pd.read_csv("X_test.csv")
y_train=pd.read_csv("y_train.csv")

# 데이터 크기
print(X_train.shape,X_test.shape,y_train.shape)

# 데이터 샘플
X_train.head(2)

 

타겟 수 확인하기 

y_train에서 확인할 수 있음 

# 타겟 수 확인

# y_train.head() 을 찍어보고 나서 아 타겟인 income 이구나 를 알 수 있음 
y_train["income"].value_counts()

 

수치형데이터를 머신러닝에 활용하기

# type확인 수치형 데이터가 무엇인가 
X_train.info()

# 수치형 데이터 만 사용하겠음 
cols =[
       'age',
       'fnlwgt',
       'education.num',
       'capital.gain',
       'capital.loss',
       'hours.per.week'
]

# 수치형 데이처 통계
X_train[cols].describe()

 

- 결측값 체크 후 빠르게 0으로 처리하기 

- 주의사항은 테스트 데이터도 항상 같이 처리해 줘야함

# 결측값
X_train[cols].isnull().sum()

# 간단한 결측치 처리
X_train = X_train.fillna(0)
# 만약에 결측치를 처리했음 잊어먹지 말고 테스트 데이터도 해줘야함
X_test=X_test.fillna(0)

# 결측치 확인
X_train.isnull().sum()

# 베이스 라인에서는 그외 전처리 및 피처 엔지니어링 생략

 

타겟 값이 문자로 되어 있으므로 target의 값을 0101 값으로 변경

 

# 문자로 되어 있기 때문에 target값 변경
# <=50K -> 0
# >50K -> 1
y= (y_train['income'] =='>50K').astype(int)

 

머신러닝 모델 

- 머신러닝 모델은 

- 분류기(Classifier) 호출 ➡️ fit() ➡️ predict() - 평가  

# 0또는 1을 선택해야하는 분류모델 
# 랜덤포레스트
from sklearn.ensemble import RandomForestClassifier

rf= RandomForestClassifier()
rf.fit(X_train[cols],y) 
pred = rf.predict(X_test[cols]) # 평가한다 

# 데이터 크기 확인
len(X_test)

# 예측 및 csv 파일 생성
#0은 하위 소득 1은 상위소득 
pred[:10]
submit = pd.DataFrame(
    {'id': X_test['id'],
     'income':pred
     })

submit.to_csv("1011039.csv",index=False)

# 평가 (수험자는 알 수 없는 부분임) accuracy
from sklearn.metrics import accuracy_score
y_test = pd.read_csv("y_test.csv")
ans = (y_test['income'] == '>50K').astype(int)
accuracy_score(ans, pred)
# ans 는 실제 값이고 pred는 예측값 (내가 작성한 값)
# 80%의 모델 성능이 나옴 !

 

문제2

  • 수험자가 만든 부분을 검증할 수 없어서 검증용 데이터를 구분함
  • "<= 50K -> 0"
  • "> 50K -> 1"
  • 평가: roc_auc 예측 해야할 값은 : 확률

검증용 데이터 분리

# 학습용 데이터와 검증용 데이터로 구분
from sklearn.model_selection import train_test_split
# 테스트 비중은 0.1정도 랜덤스테이트는 그냥 아무거나 좋아하는 숫자 넣어주세요
y = (y_train['income'] == '>50K').astype(int)
X_tr, X_val, y_tr, y_val = train_test_split(X_train, y, test_size=0.1, random_state=2022)

# 데이터 크기
print(X_tr.shape, X_val.shape, y_tr.shape, y_val.shape)

 

의사결정나무

 

# 의사결정나무
from sklearn.tree import DecisionTreeClassifier 
dt = DecisionTreeClassifier()
dt.fit(X_tr[cols], y_tr) # 학습할 데이터와 타겟
# 문제에서 제시된게 확률 값을 예측해야한다면 proba
pred_dt = dt.predict_proba(X_val[cols])
pred_dt[:10]
# 1은 100%

 

랜덤포레스트

# 의사결정나무
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
dt.fit(X_tr[cols], y_tr)
pred=dt.predict_proba(X_val[cols])
roc_auc_score(y_val,pred[:,1])

 

XGBoost

# XGBoost
from xgboost import XGBClassifier
xgb = XGBClassifier()
xgb.fit(X_tr[cols], y_tr)
pred=xgb.predict_proba(X_val[cols])
pred[:,1]

 

CSV 파일 생성

# 평가 데이터로 예측 및 csv파일 생성
from sklearn.metrics import roc_auc_score
roc_auc_score(y_val,pred[:,1])

pred=xgb.predict_proba(X_test[cols])
submit = pd.DataFrame(
            {
                'id':X_test['id'],
                'income':pred[:,1]
            }
        )
submit.to_csv("22222.csv", index=False)

 

평가

  • 수험자는 알 수 없는 영역임
from sklearn.metrics import roc_auc_score
y_test = pd.read_csv("y_test.csv")
ans = (y_test['income'] != '<=50K').astype(int)
roc_auc_score(ans, pred[:,1])
728x90

댓글