MLP(다층퍼셉트론) 코드 복습

MLP 학습 및 평가 모델

1. 데이터

  • 데이터 불러오기
    • data = pd.read_csv('wine.csv')

2. 변수 선택 X? y?

  • input과 output의 갯수를 확인
    • data.columns

  • input, output 변수화
    • X = data[['fixed acidity', 'volatile acidity', 'citric acid', 'residual sugar',
                      'chlorides', 'free sulfur dioxide', 'total sulfur dioxide', 'density',
                      'pH', 'sulphates', 'alcohol', 'quality']]
    • y = data[['class']]


3. train, valid

  • 훈련용, 검증용 데이터셋 분류
    • from sklearn.model_selection import train_test_split
    • X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size = 0.2, shuffle = True)

4. 리스케일링

  • 리스케일링 방법 선정
  • minMAX, Robust, zero-centered 등이 있음
    • # minMAX 0~1 : 컬럼간에 스케일러는 어느정도 조정하지만, 아웃라이어(이상치) 제거 안됨
    • # Robust 4분위: 아웃라이어 제거
    • # zero-centered: 표준화, 0이 평균값이 되도록

  • 코드
    • from sklearn.preprocessing import StandardScaler
    • ss = StandardScaler()
    • X_train_scaled = ss.fit_transform(X_train)
      • fit_transform: 평균과 표준편차를 구하고 변환
    • X_valid_scaled = ss.transform(X_valid)
      • transform: fit된 평균과 표준편차로 변환만 함

5. 데이터 변환

  • 타입 맞추기 (numpy -> PyTorch tensor)
    • X_train_scaled = torch.FloatTensor(X_train_scaled)
    • X_valid_scaled = torch.FloatTensor(X_valid_scaled)
    • y_train2 = torch.FloatTensor(y_train.values)
    • y_valid2 = torch.FloatTensor(y_valid.values)
      • 1 x n 으로 되어 있는 경우, .values 사용

6. 모델 정의

class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.linear1 = nn.Linear(4, 2)
        self.linear2 = nn.Linear(2, 1)
        self.relu = nn.ReLU()
   
    def forward(self, x):
        x = self.linear1(x)
        x = self.relu(x)
        output = self.linear2(x)
        return output

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = MLP().to(device)


7. loss와 옵티마이저

loss = nn.BCEWithLogitsLoss()
optimizer = optim.AdamW(model.parameters(), lr=0.01)

# 문제        / 활성화 함수   / 비용함수 (활성화함수 -> 값 비교)

# 이진분류  / 없음             / nn.BCELoss()

# 이진분류  / 시그모이드   / nn.BCEWithLogitsLoss()

# 다중분류  / 소프트맥스   / nn.CrossEntropyLoss()

# 회귀        / 없음              / MSE


8. 모델 학습

epochs = 1

for epoch in range(epochs):
    loss_sum = 0

    for idx, (X, y) in enumerate(train_loader):
        X, y = X.to(device), y.to(device)
        pred = model(X) # 1개 배치에는 4개 데이터(각 12개피처)가 있음.
                        # 모델은 4개 아웃풋을 pred변수에 리턴 한다.
        cost = loss(pred, y) # loss 함수는 pred의 값을 시그모이드를 거친 후 y 값이랑 비교를 함.
        # print(cost)

        optimizer.zero_grad() # 파이토치 고질병, 미분값이 누적됨. 그래서 매번 0으로 초기화해야함.
        cost.backward() # loss에 대한 미분 계산
        optimizer.step() # cost.backward의 미분 값을 내부적으로 인지하여 역전파 함.
       
        loss_sum += cost

        # break
    print(loss_sum/len(train_loader))


9. 모델 평가

model.eval() # 모델 평가 모드

predict_temp = []
real_temp = []

with torch.no_grad(): # 기울기 함수 계산 안할 것임.
    for idx, (X, y) in enumerate(valid_loader):
        X = X.to(device)
        pred = model(X)
       
        pred = torch.sigmoid(pred) # 확률 추출
        predict_class = (pred >= 0.5).float() # 이진화. 결과가 2차원임 [ [0], [1], [1] ]
        predict_temp += predict_class.flatten().cpu() # 미니배치 x 예측 차원에서 1차원으로 만듦 또한. GPU에서 cpu로 내림
        real_temp += y.flatten() # 정답값도 미니배치 x 정답 차원에서 1차원으로 만듦

from sklearn.metrics import accuracy_score, f1_score
print(accuracy_score(predict_temp, real_temp))
print(f1_score(predict_temp, real_temp))


10. import를 사용해 용도별로 py를 나눔.




댓글 쓰기

다음 이전