본문 바로가기

기타

[Sklearn] 알고리즘 학습/예측 기본

1. 데이터 전처리

  • info(), head() 등으로 데이터의 타입/종류 등을 확인한다.
titanic_df = pd.read_csv(r"C:\Users\jain5\Data_Handling\titanic_train.csv")
titanic_df.head(3)
print('\n ### train 데이터 정보 ###  \n')
print(titanic_df.info())
  • drop, 스키일링, 레이블 인코딩 등을 실시해 데이터를 가공한다.
    • drop : 필요없는 컬럼 제거, 이때 특정 열 제거 및 적용을 위해 axis=1, inplace=True를 추가한다.
    • 수치형 데이터 : 데이터 분석 및 오버/언더플로우 방지를 위해 스케일링(Standard, MinMax 등)
    • 범주형 데이터 : 문자열을 숫자로 변환(get_dummies, LabelEncoder 등), 트리계열 ML 알고리즘에만 적용
    • null 값 처리하기 : fillna 혹은 drop
    • 필요하다면 컬럼명은 적절하게 수정하기 : columns = [리스트] 로 변경
from sklearn.preprocessing import LabelEncoder

# Null 처리 함수
def fillna(df):
    df['Age'].fillna(df['Age'].mean(), inplace=True)
    df['Cabin'].fillna('N', inplace=True)
    df['Embarked'].fillna('N', inplace=True)
    df['Fare'].fillna(0, inplace=True)
    return df

# 머신러닝 알고리즘에 불필요한 피처 제거
def drop_features(df):
    df.drop(['PassengerId', 'Name', 'Ticket'], axis=1, inplace=True)
    return df

# 레이블 인코딩 수행.
def format_features(df):
    df['Cabin'] = df['Cabin'].str[:1]
    features = ['Cabin', 'Sex', 'Embarked']
    for feature in features:
        le = LabelEncoder()
        le = le.fit(df[feature])
        df[feature] = le.transform(df[feature])
    return df

# 앞에서 설정한 데이터 전처리 함수 호출
def transform_features(df):
    df = fillna(df)
    df = drop_features(df)
    df = format_features(df)
    return df
  • 학습용/테스트용 데이터 분리
    • train_test_split(Feature, Traget(Label, test_size, random_state)
    • 학습용 feature, 테스트용 feature, 학습용 label, 테스트용 label return
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test=train_test_split(X_titanic_df, y_titanic_df, \
                                                  test_size=0.2, random_state=11)

 

2. fit & predict

  • 원하는 알고리즘 클래스 생성(알고리즘마다 적절한 파라미터 값 넣기)
  • 알고리즘에 대해 fit & predict
    • fit(학습용 feature, 학습용 label), predict(테스트용 feature)
dt_clf = DecisionTreeClassifier(random_state=11)
dt_clf.fit(X_train , y_train)
dt_pred = dt_clf.predict(X_test)

 

3. 평가(정확도)

  • 평가하기(기준: 정확도)
    • accuracy_score(테스트용 레이블, predict 결과)
print('DecisionTreeClassifier 정확도: {0:.4f}'.format(accuracy_score(y_test, dt_pred)))
  • 정확도는 불균형한 레이블에 적합하지 않다.
  • 따라서 정확도 이외에 ROC 곡선, AUC 스코어 F1 스코어 등을 적절하게 이용하자.

[Week1] 03. 평가 (tistory.com)

 

[Week1] 03. 평가

머신러닝은 데이터 가공/변환, 모델 학습/예측, 그리고 평가(Evaluation)의 프로세스로 구성된다. 회귀의 성능 평가 지표는 주로 실제값과 예측값의 오차 평균값에 기반한다. 분류의 성능 평가 지표

jain5379.tistory.com

 

+ 최적 하이퍼 파라미터 찾기

  • ML 알고리즘 모델의 주어진 파라미터에서 가장 좋은 성능을 보이는 조합을 찾는다.
  • GridSearchCV : 데이터의 편중을 막기 위한 교차검증까지 제공
  • 주요 파라미터 : 알고리즘, 조합할 알고리즘의 주요 파라미터(튜플 형태), cv(교차검증을 위해 분할되는 데이터 세트 개수), scoring(평가방법), refit(재학습 여부)
  • fit() 수행 시 학습/평가 결과와 최고 성능의 하이퍼 파라미터 값과 그 결과값이 기록된다.
    • cv_results_, best_params_, best_score_, best_estimator 등 함수 내장
from sklearn.model_selection import GridSearchCV

parameters = {'max_depth':[2,3,5,10],
             'min_samples_split':[2,3,5], 'min_samples_leaf':[1,5,8]}

grid_dclf = GridSearchCV(dt_clf , param_grid=parameters , scoring='accuracy' , cv=5)
grid_dclf.fit(X_train , y_train)

print('GridSearchCV 최적 하이퍼 파라미터 :',grid_dclf.best_params_)
print('GridSearchCV 최고 정확도: {0:.4f}'.format(grid_dclf.best_score_))
best_dclf = grid_dclf.best_estimator_

# GridSearchCV의 최적 하이퍼 파라미터로 학습된 Estimator로 예측 및 평가 수행. 
dpredictions = best_dclf.predict(X_test)
accuracy = accuracy_score(y_test , dpredictions)
print('테스트 세트에서의 DecisionTreeClassifier 정확도 : {0:.4f}'.format(accuracy))

 

  • HyperOpt : 하이퍼 파라미터 수가 많은 경우 효율적
    • 목적 함수 식을 제대로 알지 못할 때, 최대/최소 함수 반환 값을 만드는 최적 하이퍼 파라미터값을 빠르게 찾는다.
    • 입력 변수명과 입력값의 검색공간(Search Space) 설정, 목적함수(Objective Function)을 설정 후 최적 입력값을 유푸한다.
    • 검색공간은 데이터 타입과 설정에 따라 quniform, uniform 등 다양함
    • 주요 파라미터 : fn(목적함수), space(검색공간, 딕셔너리 형태), algo(베이지안 최적화 적용 알고리즘), max_evals(입력값 시도 횟수), trials(입력값 및 반환값 결과 저장 공간, Trials() 객체 로드 필요), rstate(랜덤 seed 값)
from hyperopt import fmin, tpe, Trials
from sklearn.model_selection import cross_val_score
from xgboost import XGBClassifier
from hyperopt import STATUS_OK
from hyperopt import hp

# max_depth는 5에서 20까지 1간격으로, min_child_weight는 1에서 2까지 1간격으로
# colsample_bytree는 0.5에서 1사이, learning_rate는 0.01에서 0.2 사이 정규 분포된 값으로 검색.
xgb_search_space = {'max_depth': hp.quniform('max_depth', 5, 20, 1), 
                    'min_child_weight': hp.quniform('min_child_weight', 1, 2, 1),
                    'learning_rate': hp.uniform('learning_rate', 0.01, 0.2),
                    'colsample_bytree': hp.uniform('colsample_bytree', 0.5, 1),
                   }

# fmin()에서 입력된 search_space 값으로 입력된 모든 값은 실수형임.
# XGBClassifier의 정수형 하이퍼 파라미터는 정수형 변환을 해줘야 함.
# 정확도는 높을수록 더 좋은 수치임. -1 * 정확도를 곱해서 큰 정확도 값일수록 최소가 되도록 변환
def objective_func(search_space):
    # 수행 시간 절약을 위해 nestimators는 100으로 축소
    xgb_clf = XGBClassifier(n_estimators=100, max_depth=int(search_space['max_depth']),
                            min_child_weight=int(search_space['min_child_weight']),
                            learning_rate=search_space['learning_rate'],
                            colsample_bytree=search_space['colsample_bytree'],
                            eval_metric='logloss')
    accuracy = cross_val_score(xgb_clf, X_train, y_train, scoring='accuracy', cv=3)
    
    # accuracy는 cv=3 개수만큼 roc-auc 결과를 리스트로 가짐. 이를 평균해서 반환하되 -1을 곱함.
    return {'loss':-1 * np.mean(accuracy), 'status': STATUS_OK}

trial_val = Trials()
best = fmin(fn=objective_func,
            space=xgb_search_space,
            algo=tpe.suggest,
            max_evals=50, # 최대 반복 횟수를 지정합니다.
            trials=trial_val, rstate=np.random.default_rng(seed=9))
print('best:', best)

# 회고

 

책만 따라가느라 헷갈리기도 하고, 복습과제를 하면서 알고리즘 학습 및 예측, 평가의 전체적인 순서에 대해 정리했다.

아직 많이 알지는 못하지만 거의 이 순서를 따라가는 듯.

이제 중요한 건 어떠한 상황에서 무슨 알고리즘을 사용하느냐이다.

 

그리고 이번에 목차를 한 번에 볼 수 있도록 html모드로 목차를 작성해봤다 ㅎㅎ

내가 센스가 좋았다면 목차를 더 이쁘게 꾸밀 수 있지 않았을까...

티스토리 블로그 목차 링크 만드는 방법과 필요성 (tistory.com)

 

티스토리 블로그 목차 링크 만드는 방법과 필요성

티스토리 블로그 글을 쓸 때 사용하면 좋은 목차의 필요성과 만드는 방법에 대해 알려드릴게요. 글을 보다 구조화하고 독자들이 내용을 쉽게 찾아볼 수 있도록 목차에 내부 링크를 넣으면 가독

sunnydong.tistory.com

여기를 참고해서 작성함.

'기타' 카테고리의 다른 글

[Sklearn] 회귀 알고리즘 정리  (1) 2023.10.31
[Sklearn] 분류 알고리즘 정리  (0) 2023.09.25
[AWS] EC2 docker container exited 이유  (0) 2023.09.16
[AWS] RDS 접속하기&DB 초기화  (0) 2023.09.06
[AWS] EC2 서버 로그 확인하기  (0) 2023.07.29