오늘은 미니프로젝트 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)
해당 코드는 원-핫 인코딩을 진행해주는 코드입니다.
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 셋을 나누어 주었습니다.
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)
해당 코드는 이제 딥러닝으로 학습된 데이터의 결과값을 확인하는 방법입니다.
오랜만에 머신러닝으로 돌아와서 매우 즐겁고 재밌는 하루였습니다.
※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.