오늘의 일지]
딥러닝 녹화 강의 - MLP 회귀, 분류 실습
[상세 내용]
MLP 회귀, 분류 실습
실습 순서
- 이번 강의는 MLP 딥러닝 모델을 활용해서 현업이나 프로젝트 과정에서 전체적으로 어떻게 작업을 수행하면 좋을지에 대한 내용이었습니다. 강의의 내용을 바탕으로 큰 틀을 잡고 앞으로 하게 될 프로젝트에서 적용하면 좋을 거 같다고 생각했습니다. 사실 전체적인 틀은 지금까지 해온 머신러닝의 틀과 크게 다르지 않기 때문에 강의를 보는데 어려움은 없었습니다. 다만 머신러닝과의 차이점은 EDA 과정에서 더 세심하게 스케일링을 해줘야 한다는 점과 파이토치를 사용해서 모델의 코드를 짜는 것이 좀 더 해야 될 일이 많다는 점을 알게 되었습니다. 우선 전체적인 순서를 보여드리겠습니다.
- 문제상황 및 데이터 살펴보기
- 문제해결 프로세스 정의
- Data 전처리 및 EDA
- 가설 수립 및 검증
- MLP 활용 연봉 예측
문제상황 및 데이터 살펴보기(실습코드 예시는 회귀문제 기준입니다.)
# ▶ pd.set option
import pandas as pd
pd.set_option('display.max_columns',100)
pd.set_option('display.max_rows',100)
# ▶ Data read
df = pd.read_csv("ds_salaries.csv")
df.head()
문제해결 프로세스 정의
문제정의
▶ 데이터 직군 직원 채용 시 연봉 산정 어려움
기대효과
▶ 채용 시 연봉 산정 베이스 라인 활용으로 원활한 채용 진행
해결방안
▶ 지원자의 정보를 통해 데이터 직군 연봉 추정(예측)
▶ Session 1
- Data 전처리 및 EDA
▶ Session 2
- 가설을 수립하고 데이터를 통해 검증
▶ Session 3
- MLP 활용 연봉 에측 모델링 수행
성과측정
▶ 모델 활용 전/후 채용 프로세스 진행 속도 비교
현업적용
▶ 지원자 채용 시 모델 활용 협상 진행
주요 코드 미리 살펴보기
▶ Session 1 → df.isnull().sum(), value_counts(), .append()
▶ Session 2 → .reset_index(), .isin(), .astype()
▶ Session 3 → OneHotEncoder(), .unsqueeze(1), TensorDataset, DataLoader
Data 전처리 및 EDA
Data 전처리
수집된 데이터의 기본 정보들을 확인
(1) Data shape(형태) 확인
(2) Data type 확인
(3) Null값 확인 (※ 빈 값의 Data)
(4) Outlier 확인 (※ 정상적인 범주를 벗어난 Data)
가설 수립 및 검증
- 문제해결 프로세스(Problem Solving Process)에서 가장 핵심적인 부분
- 가설은 문제해결을 위한 '핵심 아이디어'
- 현재 우리가 보유하고 있는 데이터로 문제를 해결할 수 있는지 사전 검증하는 작업
MLP 활용 연봉 예측
# 모델링을 위한 데이터 준비
# 모델링을 수행하기 위해 Feature와 예측하고자하는 값인 Y로 데이터를 나눔
# 학습과 예측을 위한 Train / Test set 분할
# 범주형 변수를 모델이 이해하기 위한 숫자현 데이터로 변환(OneHotEncoder)
# 범주형 변수의 Level이 예제와 같이 많다고 하면, 다른 인코딩 방법을 고려해 볼 수 도 있음 ex) Binary encoding, Hash encoding 등
# 완벽한 정답은 없음, 모든 방법을 테스트해 보고 성능을 고려하는 것이 Best
from sklearn.preprocessing import OneHotEncoder
for col in categorical_list :
encoder = OneHotEncoder()
onehot = pd.DataFrame(encoder.fit_transform(df[[col]]).toarray(), columns = encoder.get_feature_names())
# 기존 Col은 삭제
df = pd.concat([df,onehot], axis = 1).drop(columns = [col])
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler
# Pytorch libraries import
import torch
import torch.nn as nn
from torch.utils.data import TensorDataset
from torch.utils.data import DataLoader
X=df.drop(['work_year', 'salary_in_usd'], axis=1)
Y=df['salary_in_usd']
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=123)
# Tensor 변환
# 데이터 셋을 Pytorch Tensor 데이터 셋으로 변환
# Tensor : 다차원의 배열을 통칭
# torch.from_numpy 함수를 통해 데이터를 torch에서 인식할 수 있는 tesnor 형태로 변환
# ravel() : 다차원 배열을 1차원에 배열로 평탄화
x_tensor = torch.from_numpy(x_train).float()
y_tensor = torch.from_numpy(y_train.values.ravel()).float()
xtest_tensor = torch.from_numpy(x_test).float()
ytest_tensor = torch.from_numpy(y_test.values.ravel()).float()
print("[Train set Tensors] \n")
print(x_tensor)
print(y_tensor)
print("\n[Test set Tensors] \n")
print(xtest_tensor)
print(ytest_tensor)
# Dataset 및 DataLoader 생성
# DL을 위한 PyTorch Dataset 및 DataLoader 생성
# 배치 사이즈 선정 (batch, iteration, epoch 개념 숙지)
# 1) batch : 한 번에 학습시킬 데이터의 양
# 2) epoch : 전체 학습 셋이 신경망을 통과한 횟수
# 3) iteration : 1-epoch를 마치는데 필요한 batch 개수
bs = 10
# unsqueeze(1) : 평탄화 tensor에 1차원을 추가, 차원이 없는 Tensor에 1차원이 추가됨
y_tensor = y_tensor.unsqueeze(1)
train_ds = TensorDataset(x_tensor, y_tensor)
# DataLoader : batch_size 만큼 데이터를 이동시켜주는 기능, iteration을 효율적으로 빠르게 하기 위함
train_dl = DataLoader(train_ds, batch_size=bs)
# Test set에도 동일하게 적용
ytest_tensor = ytest_tensor.unsqueeze(1)
test_ds = TensorDataset(xtest_tensor, ytest_tensor)
test_loader = DataLoader(test_ds, batch_size=bs)
# NN(Neural Network, 신경망) 설계
# 딥러닝 모델 학습을 위한 신경망 설계
# MLP(Multi Layer Perceptron) 구성
n_input_dim = x_train.shape[1]
class Regressor(nn.Module):
# 사용하기 위한 기본 함수들을 사전의 정의(self)
def __init__(self):
super(Regressor,self).__init__()
self.fc1 = nn.Linear(n_input_dim, 300, bias=True) # 첫 번째 레이어
self.fc2 = nn.Linear(300, 100, bias=True) # 두 번째 레이어
self.fc3 = nn.Linear(100, 1, bias=True) # 출력 레이어
self.relu = nn.ReLU() # 활성화 함수 ( 0보다 작은 값이 나온 경우 0을 반환하고, 0보다 큰 값이 나온 경우 그 값을 그대로 반환함.)
self.dropout = nn.Dropout(0.5) #연산 마다 50%의 노드를 랜덤하게 없앤다
# 순전파(forward network) 구성, forward process만 구성하면 backword는 자동을 구성됨(autograd, 자동미분)
def forward(self, x):
x = self.relu(self.fc1(x)) # 활성화 함수 적용
x = self.dropout(self.relu(self.fc2(x))) # 은닉층에서 전달할 때, 50% 를 dropout(Connection을 무작위 drop, overfitting 방지)
x = self.relu(self.fc3(x))
return x
model = Regressor()
print(model)
# 모델 학습 및 평가
# 딥러닝 모델 학습 및 평가
model.train()
train_loss = []
# n = len(train_dl)
for epoch in range(epochs): # 100번 반복 학습
running_loss =0.0 # 매 에폭의 평균 loss 구하기 위해서 초기값 0으로
for data in train_dl: # 각 배치를 불러온다
inputs, values = data # x, y data split
optimizer.zero_grad() # 한번에 학습이 끄탄면 gradients를 항상 0으로 만들어줘야 함
outputs = model(inputs) # 예측값 산출
loss = loss_func(outputs, values) # 손실함수 계산 및 최적화
loss.backward()
optimizer.step()
running_loss += loss.item()
epoch_loss = running_loss/len(train_dl) # 1-epoch 내에 모든 iteration의 Loss의 평균값을 구함
print("Loss in epoch :"+str(epoch)+" is: "+str(epoch_loss))
train_loss.append(epoch_loss)
print('Last iteration loss value: '+ str(loss.item()))
[마무리]
오늘은 딥러닝 모델을 통한 프로젝트를 해결하는 과정에 대해서 배워보는 수업을 들었습니다. 강의를 듣고 난 뒤 복습해야겠다고 생각한 부분은 우선 EDA과정 철저하게 해 보는 것과 파이토치로 직접 모델 코드를 짜보는 것이었습니다. 시간을 내서 연습을 한 뒤에 프로젝트 과정을 거치면 어느 정도 손에 익을 거 같습니다.
반응형
'AI > 딥러닝' 카테고리의 다른 글
[AI 부트캠프] DAY 87 - 트랙학습 CV 1 (0) | 2023.11.23 |
---|---|
[AI 부트캠프] DAY 75 - 딥러닝 11 (0) | 2023.11.07 |
[AI 부트캠프] DAY 73 - 딥러닝 9 (0) | 2023.11.03 |
[AI 부트캠프] DAY 72 - 딥러닝 8 (0) | 2023.11.02 |
[AI 부트캠프] DAY 71 - 딥러닝 7 (0) | 2023.11.01 |
댓글