ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 전처리, 딥러닝 모델링 텐서플로우 콜백 tensorflow 파이썬 코드 짜기$
    KT 에이블스쿨 복습 2024. 4. 23. 18:00

    **셀프 복습용으로 작성한 것이라 실수가 있을 수 있습니다!

    혹시 실수를 발견하시면 댓글로 알려주시면 감사드리겠습니다 :)

     

    데이터 전처리 리뷰

    라이브러리 설치 코드 모음

    !pip install seaborn
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    import sklearn as sk

     

    기본 정보 확인

    • 데이터프레임 인덱스 확인: df.index
    • 데이터프레임 컬럼 확인: df.columns
    • 데이터프레임 값 확인: df.values
    • 데이터프레임 컬럼 타입 확인: df.dtypes
    • 데이터프레임 컬럼 타입 변환: df.astype(float)

    json 파일 불러오기

    df = pd.read_json('파일명.json', encoding='cp949')

     

    • 그래프 시각화 한글 깨짐 폰트 설정
    import matplotlib.font_manager as fm
    
    font_list = [font.name for font in fm.fontManager.ttflist]
    font_list
    plt.rcParams['font.family'] = 'Malgun Gothic'

     

    • 특정 열에서 '문자열'값이 차지하는 비율 확인하기 (normalize=True 옵션 활용)
    df['열 이름'].value_counts(normalize=True)['문자열']

     

    •  데이터프레임에 남아있는 문자열을 결측치로 변경하기
    df.replace({'문자열':np.nan}, inplace=True)  # numpy 라이브러리 불러오기 필수

     

    •  결측치 채우기
    # 최빈값으로 채우기, 인덱싱[0] 해줘야 최빈값 하나 추출
    df['열 이름'].fillna(df['열 이름'].mode()[0], inplace=True)  
    
    # 중앙값으로 채우기
    df['열 이름'].fillna(df['열 이름'].median(), inplace=True)

     

     

     

     라벨 인코딩: 카테고리형 피처를 코드형 숫자값으로 변환하는 것!
    ex) ['밥', '물', '커피', '면', '빵', '물' ]이 있다면 2, 1, 4, 0, 3, 1 로 변환(가나다 순)

    dumm_cols = ['열 이름1', '열 이름2', '열 이름3', '열 이름4']
    변수 = pd.get_dummies(data=df, columns=dumm_cols, drop_first=True, dtype=int)

     

     

     

    컬럼의 데이터 타입이 object인 컬럼들을 추출해 변수 저장

    변수 = df.select_dtypes('object').columns.values

     

     

     

    특정 행 조건 조회

    df.loc[df['열 이름'] >= 300, :]
    df.loc[df['열 이름'] >= 300, :].index    # 인덱스 넘버 추출

     

     

    원핫 인코딩(가변수화)

    from sklearn.preprocessing import LabelEncoder
    
    label_encoder = LabelEncoder()
    
    변수 = df.loc[:, df.dtypes == 'object']
    df['열 이름'] = label_encoder.fit_transform(변수['열 이름'])

     

    단변량 시각화

    df['열 이름'].value_counts().plot(kind='bar')

     

     

    이변량 시각화(jointplot: 각각의 산점도와 히스토그램 함께 출력)

    sns.jointplot(x='열 이름1', y='열 이름2', data=df)

     

     

    상관계수 시각화

    • 각 컬럼 간의 상관관계를 확인해 heatmap으로 시각화, 가장 높은 상관계수 값확인
    sns.heatmap(df[['열 이름1','열 이름2','열 이름3']].corr(), annot=True)

     

     

     

     

    머신러닝 & 딥러닝 리뷰

    x, y 데이터 분리

    • 데이터 분리 순서 헷갈리지 말기!!! 
    • stratify=y: y 클래스 비율에 맞게 분리하는 옵션
    target = 'y 열 이름'
    
    x = df.drop(target, axis=1)
    y = df.loc[:, target]
    
    from sklearn.model_selection import train_test_split
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=.2, stratify=y, random_state=42)

     

    데이터 정규분포화, 표준화

    • StandardScaler 사용
      • train data: fit_transform 사용,  fit과 transform을 한번에 실행시키는 메서드
      • test data: transform 사용, fit_transform 절대 사용 X,  이미 학습된 규칙에 사용
    from sklearn.preprocessing import StandardScaler
    
    # 훈련 데이터셋 정규화(fit_transform)
    scaler = StandardScaler()
    x_train_s = scaler.fit_transform(x_train)
    
    # 테스트 데이터셋 표준화(transform) -> 훈련 데이터셋에서 학습한 scaler를 사용해 표준화
    x_test_s = scaler.transform(x_test)

     

     

    머신러닝 모델링

    # 라이브러리 불러오기
    from sklearn.linear_model import LogisticRegression
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import RandomForestClassifier
    from xgboost import XGBClassifier
    from lightgbm import LGBMClassifier
    from sklearn.linear_model import LinearRegression
    
    from sklearn.model_selection import cross_val_score
    from sklearn.metrics import *

     

    model = LogisticRegression(C=10, max_iter=2000)
    model.fit(x_train_s, y_train)
    pred = model.predict(x_test_s)
    print(confusion_matrix(y_test, pred))
    sns.heatmap(confusion_matrix(y_test, pred),
               annot=True,
               cbar=False,
               cmap='Blues')
    print(classification_report(y_test, pred))

     

     

    모델 성능 시각화

    from sklearn.metrics import *
    y_pred = model.predict(X_valid)           
    cm = confusion_matrix(y_valid, y_pred)
    
    sns.heatmap(cm, annot=True)
    print(classification_report(y_valid, y_pred))

     

    딥러닝 모델링

    import tensorflow as tf
    from tensorflow import keras
    from tensorflow.keras.models import Sequential, load_model
    from tensorflow.keras.layers import Dense, Dropout
    from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

     

     

    콜백

    : 딥러닝에서 훈련 과정 중에 특정 시점에서 자동으로 호출되는 함수 또는 명령의 집합

    • EarlyStopping: 딥러닝에서 훈련 과정을 자동으로 중지시키는 콜백
      → 특정 조건이 충족되면 모델 훈련을 조기에 종료해 과적합 방지
      • 주요 파라미터 monitor='val_loss'(회귀모델), 'val_accuracy'(분류모델)
      • patience: 지정된 지표의 개선을 기다리는 에포크 수, patience=10이면 지표 개선 안되어도 10 에포크는 진행
      • verbose=1: 얼마나 자세한 정보를 출력할지!
      • mode: 'auto', 'min', 'max' 중 선택, 'monitor'하는 지표가 최소화되어야 하는지, 최대화되어야 하는지 결정
    • ModelCheckpoint: 훈련 중인 모델을 정기적으로 저장하는 콜백, 모델의 가중치를 디스크에 저장
      → 훈련 중 예기치 못한 중단이 발생해도 중간 상태에서부터 재개할 수 있음
      • filepath: 모델 파일 저장할 경로
      • monitor: 저장할 때 기준으로 삼을 성능 지표, 'val_loss'가 감소할 때만 모델 저장하도록 설정 가능
      • verbose: 정보 출력 여부 설정
      • save_best_only: 'True'로 설정하면 이전에 저장된 모델보다 더 나은 성능의 모델일 때만 저장
    model = Sequential([Dense(64, activation = 'relu', input_shape=(x_train.shape[1],)),
                        Dropout(0.2),
                        Dense(32, activation = 'relu'),
                        Dropout(0.2),
                        Dense(16, activation = 'relu'),
                        Dropout(0.2),
                        Dense(1, activation = 'sigmoid')])
                        
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    es = EarlyStopping(monitor='val_loss', patience=4, mode='min', verbose=1)
    mc = ModelCheckpoint('best_model.keras', monitor='val_loss', save_best_only=True, verbose=1)
    
    history = model.fit(x_train_s, y_train, 
                            batch_size=10, 
                            epochs=10, 
                            callbacks=[es, mc],
                            validation_data=(x_test_s, y_test), 
                            verbose=1)

     

    model = Sequential()
    model.add(Dense(64, activation='relu', input_shape=(X_train.shape[1],)))
    model.add(Dropout(0.2))
    model.add(Dense(32, activation='relu'))
    model.add(Dense(16, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    
    model.compile(optimizer='adam', 
                  loss='binary_crossentropy', 
                  metrics=['accuracy']) 
    
    es = EarlyStopping(monitor='val_loss', patience=5) 
    
    checkpoint_path = 'best_model.keras'
    mc = ModelCheckpoint(checkpoint_path, monitor='val_loss', verbose=1, save_best_only=True)
    
    history = model.fit(X_train, y_train, epochs=30, batch_size=16,
                       validation_data = (X_valid, y_valid),
                        callbacks=[es, mc]
                        )

     

     

     

    딥러닝 모델 시각화

    plt.plot(history.history['accuracy'])
    plt.plot(history.history['val_accuracy'])
    plt.title('Accuracy')
    plt.xlabel('Epochs')
    plt.ylabel('Acc')
    plt.legend(['acc', 'val_acc'])
    plt.show()

     

     

    케라스 사용해 가변수화 (원핫 인코딩)

    from keras.utils import to_categorical
    y_train_ohe = to_categorical(y_train)
    y_test_ohe = to_categorical(y_test)

     

     

    다중 분류 딥러닝 모델일 때 argmax 사용해 가장 높은 값의 인덱스 추출

    y_test = np.argmax(y_test, axis=1)
    y_test_pred = np.argmax(y_test_pred, axis=1)

     

     


    미프 4차 리뷰

    분명히 다 배웠던 건데.. 기억이 안 나는 경우가 꽤 많았다...;-;

    특히 딥러닝에서는 스케일링이 필수! 라는 것을 머리로는 알고 있으면서 실제로 문제 풀 때는 스케일링하지 않고 풀어서 성능이 정말 안 좋게 나오기도 했다.. 후후 그래도 ASSO 대비 시간을 통해 지금까지 배웠던 다양한 데이터 전처리 코드와 머신러닝, 딥러닝 모델 만들기, 시각화 파트를 복습할 수 있어서 너무 좋았다! 

    모델 오차 그래프는 마치 내 망각곡선

    아무래도 인간의 기억력에는 한계가 있음을 알고 있었지만,, 그래도 이렇게나 초면일 수가 있을까?

    분명히 매일 복습도 놓치지 않고 해왔는데 기억이 안 나는 건 내 기억력의 문제겠지 ㅠㅠ

    교육 외에도 이것저것 챙길 게 많은 요즘이지만, 그래도 교육을 성실하고 꼼꼼히 따라가는 것을 최우선 순위로 둬야겠다!

    교육이 꽉 채워 두 달이 지난 만큼 지금까지 배웠던 것을 이렇게나 자세히 리뷰할 수 있어서 오히려 다행이었던 시간!

    오차가 팍 줄어드는 것처럼 내 기억력도 망각곡선이 되지 않길 바라며 ^~^ 남은 4개월도 파이팅 ! 복습 블로그 !

Designed by Tistory.