본문 바로가기
AI/딥러닝

[AI 부트캠프] DAY 74 - 딥러닝 10

by HOHHOH 2023. 11. 4.

오늘의 일지]

딥러닝 녹화 강의 - 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과정 철저하게 해 보는 것과 파이토치로 직접 모델 코드를 짜보는 것이었습니다. 시간을 내서 연습을 한 뒤에 프로젝트 과정을 거치면 어느 정도 손에 익을 거 같습니다. 

반응형

댓글