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를 나눔.
Tags:
클라우드