KT 에이블스쿨 49일차(1)

박기범·2023년 4월 10일
0

에이블스쿨

목록 보기
55/95
post-custom-banner

오늘은 미니프로젝트 5차로 오랜만에 머신러닝으로 돌아갔습니다



실습 내용

오늘은 오랜만에 머신러닝을 사용한 날이었습니다. 전처리부터 머신러닝까지 다뤘고 오랜만에 전처리 코드를 포스팅하겠습니다.



전처리 시작

데이터 전처리부터 정리하겠습니다.

▶필요 패키지 불러오기

    import pandas as pd
    import numpy as np

    import matplotlib.pyplot as plt
    import seaborn as sns
    %matplotlib inline

물론 모델링과 전처리 과정에서 더 많은 패키지를 불러와야하지만 단계별로 좀 나눠서 패키지를 불러오도록 하겠습니다.

▶데이터 불러오기

	df = pd.read_csv('데이터경로')

pd.read를 통해서 항상 데이터를 불러옵니다.

▶데이터 파악

	df.head(3)

데이터프레임의 상위 행 3개를 보여줍니다.

	df.tail(3)

데이터프레임의 하위 행 3개를 보여줍니다.

	df.index

데이터프레임의 인덱스를 보여줍니다.

	df.columns

데이터프레임의 컬럼을 보여줍니다.

	df.values

데이터프레임의 값을 보여줍니다.

	df.describe()

계산 가능한 데이터프레임의 값들에 대한 통계치를 보여줍니다.

	df.isnull().sum()

데이터프레임의 컬럼별 null값의 합을 확인할 수 있습니다. (info()로도 확인 가능함)

	df['컬럼명1'].value_counts()

데이터프레임의 해당 컬럼에 대한 건수를 알 수 있습니다.

	df.info()

데이터프레임의 정보를 보여줍니다.

▶결측치 제거

	df.drop('컬럼명2', axis=1, inplace=True)

결측치가 너무 많은 컬럼명2의 컬럼 자체를 제거해줍니다. inplace=True를 통해 결과 값을 원본에 반영해줍니다.

	df['컬럼명3'] == '*'

컬럼명3 에 대해서 *인 행에 대해서는 True값을 반환해줍니다.

	df.replace('\*', np.nan, inplace=True)

*를 가진 데이터들을 모두 null 값으로 대체해줍니다.

	df.dtypes

데이터프레임의 각 컬럼별로 어떤 데이터타입인지 알 수 있습니다.

	df['컬럼명3'] = df['컬럼명3'].fillna(df['컬럼명3'].mean())

df['컬럼명3']의 평균값으로 df['컬럼명3']의 결측치 값을 채워 넣는 것을 의미합니다.
다른 값들로 대체가 가능하면 mode()는 최빈값을 의미합니다. 물론 df[컬럼명3].value_counts()을 사용하면 최빈값을 알 수 있습니다. 중앙값은 median()을 사용해주면 됩니다.

	df['컬럼명4'] = df['컬럼명4'].astype(int)

df['컬럼명4']의 데이터타입을 int로 바꾸어줍니다.

▶라벨링 인코더 & 원-핫 인코딩

모델링을 하기에 앞서 모든 데이터가 숫자형이여야 하기 때문에 문자형인 컬럼을 대상으로 진행하는 단계입니다.

	from sklearn.preprocessing import LabelEncoder

    # LabelEncoder
    le = LabelEncoder()
    
    df['컬럼명5'] = le.fit_transform(df['컬럼명5'])

위 방법은 라벨링 방법입니다.

col_dumm=['컬럼명6', '컬럼명7']

df = pd.get_dummies(df, columns = col_dumm, drop_frist=True)

해당 코드는 원-핫 인코딩을 진행해주는 코드입니다.

▶x, y 값 분리

from sklearn.model_selection import train_test_split

x = df.drop(columns='타겟컬럼명', axis=1)
y = df['타겟컬럼명']

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, stratify=y, random_state=42)

해당 코드를 사용하여 타겟컬러명을 기준으로 x와 y값을 만들어주고 y클레스 비율에 맞게 8:2 비율로 train과 test 셋을 나누어 주었습니다.

▶StandardScaler

	from sklearn.preprocessing import StandardScaler
    
    sc = StandardScaler()
    x_train = sc.fit_transform(x_train)
    x_test = sc.transform(x_test)

해당 코드를 통해 스케일링을 진행해줍니다.



모델링 시작

이제 전처리가 끝난 데이터를 가지고 모델링을 시작합니다!

▶모델 생성

	from sklearn.linear_model import LogisticRegression
    
    model = LogisticRegression(C=10, max_iter=2000)
    model.fit(x_train, y_train)

LogisticRegression의 모델을 만들어주었습니다.

▶모델 평가

	from sklearn.metrics import confusion_matrix, classification_report
    
    y_pred = model.predict(x_test)
    sns.heatmap(confusion_matrix(y_test, y_pred))
    
    print(classification_report(y_test, y_pred))

위 코드를 통해 분류문제에 대한 모델 평가가 가능합니다.

▶딥러닝 모델 생성

    import tensorflow as tf
    from tensorflow import keras

    keras.backend.clearsession()

    model = Sequential()

    model.add(keras.layers.Dense(64, activation='relu', input_shape(17,)))
    model.add(Dropout(0.2))
    model.add(Dense(32, activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(16, activation='relu'))
    model.add(Dropout(0.2))

    model.add(Dense(1, activation='sigmoid'))

    model.compile(loss=keras.losses.binary_crossentropy, metrics=['acc'], optimizer='adam')

딥러닝 모델을 생성해주었습니다.

    from keras.callbacks import EarlyStopping, ModelCheckpoint

    es = EarlyStopping(monitor='val_loss', patience=4, mode='min', verbose=1)
    mc = ModelCheackpoint('best_model.h5', save_best_only=True, monitor='val_loss'm verbose=1)

▶딥러닝 모델 훈련

history = model.fit(X_train, y_train, 
                    batch_size=32, 
                    epochs=10, 
                    callbacks=[es, mc],
                    validation_data=(x_test, y_test), 
                    verbose=1)

이제 생성한 모델을 훈련해줍니다.

▶딥러닝 다중 분류 모델 생성

다음으로는 다중 분류 모델을 만들겠습니다.

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

다중분류 문제를 위해서는 원-핫 인코딩을 진행해줍니다.

	model = Sequential()
    model.add(Dense(64,activation='relu',input_shape=(17,)))
    model.add(Dropout(0.2))
    model.add(Dense(32,activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(16,activation='relu'))
    model.add(Dropout(0.2))
    model.add(Dense(2,activation='softmax'))

    model.compile(loss=keras.losses.categorical_crossentropy, metrics=['acc'], optimizer='adam')

이렇게 다중분류 모델을 생성해주었습니다.

▶딥러닝 모델 훈련

    history = model.fit(X_train, y_train, 
                        batch_size=32, 
                        epochs=10, 
                        callbacks=[es, mc],
                        validation_data=(x_test, y_test), 
                        verbose=1)

▶딥러닝 모델 저장

	model.save('voc_model.h5')



모델 결과 시각화

이제 모델링과 학습까지 모두 끝났으면 결과를 시각화합니다.

	plt.figure(figsize=(12,6))
    plt.plot(history.history['acc'])
    ptl.plot(history.history['val_acc'])
    plt.title('모델 결과 확인')
    plt.xlabel('Epochs')
    plt.ylaber('Accuracy')
    plt.legend(['Train', 'Validation'], loc = 'lower right')
    

해당 코드는 성능에 대해서 그래프화 해준 것입니다.

    plt.figure(figsize(12,6))
    plt.plot(history.history['loss'], label='Train Loss')
    plt.plot(history.history['val_loss'], label='validaton Loss')
    plt.xlabel('Epochs')
    plt.ylabel('Loss')
    plt.legend()

해당 코드는 학습손실과 검증손실에 대한 그래프입니다.

y_pred = model.predict(x_test)

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

from sklearn.metrics import accuracy_score
accuracy_score(y_test, y_test_pred)

해당 코드는 이제 딥러닝으로 학습된 데이터의 결과값을 확인하는 방법입니다.







오랜만에 머신러닝으로 돌아와서 매우 즐겁고 재밌는 하루였습니다.




※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.

profile
개발자가 되기 위한 한걸음
post-custom-banner

0개의 댓글