← 모델 목록
수업 실습 2026-09-03 · tabular-regression
다층 퍼셉트론 계열 (완전연결 신경망)

RegressionModel (PyTorch, 직접 구현 4층 MLP)

MLP 배달 시간 예측 - PyTorch 딥러닝 전체 흐름 (수업 실습)
모델
완전연결층 4개와 ReLU로 만든 작은 회귀 신경망. 배달 거리·라이더 수·날씨·출퇴근 시간 4개 값으로 배달 시간(분)을 예측
사용 목적
데이터 로드 → 스케일링 → 텐서·DataLoader → 모델 정의 → 학습 루프 → 평가 → 모델·스케일러 저장까지 PyTorch 딥러닝 전체 흐름을 익히려고 사용
코드
mnmms/dl
가중치
Regressionmodel.pth 0.02MB · 로컬 보관
Regressionmodel.pth (노트북 폴더 기준)
r291.0%
mae2.628
mse10.436
학습 시간없음
추론 CPU / GPU측정 안 함

데이터

  • 수업 제공 1,000건 · 입력 4개
  • train 800 · test 200 (seed 42)
  • StandardScaler 후 텐서 변환

학습

  • 4 → 32 → 64 → 16 → 1 · ReLU
  • Adam lr 1e-3 · 배치 20 · 300 에폭
  • GPU(CUDA) · 학습 시간 [미확인]

결과

  • test R² 0.909 · MAE 2.63분
  • MSE 10.44

배운 점

  • 추론 때도 학습 때와 같은 스케일러를 써야 함
  • state_dict와 스케일러를 따로 저장
개요용도 의도한 용도: PyTorch로 회귀 모델을 처음부터 끝까지 만들어 보는 수업 실습 (노트북 "플로우 정리(복습)" 14단…

용도

  • 의도한 용도: PyTorch로 회귀 모델을 처음부터 끝까지 만들어 보는 수업 실습 (노트북 "플로우 정리(복습)" 14단계)
  • 대상 사용자: 해당 없음 (학습용)
  • 의도하지 않은 용도: 실제 배달 시간 예측 (수업용 데이터 1,000건)

모델 정보

항목 값
베이스 모델 직접 구현 (처음부터 학습)
크기 · 변형 파라미터 3,393개 [🚩AI 설명] (4×32+32 + 32×64+64 + 64×16+16 + 16×1+1로 계산)
리비전 torch 2.14.0+cu126 (uv.lock 기준)
아키텍처 Linear(4,32) → ReLU → Linear(32,64) → ReLU → Linear(64,16) → ReLU → Linear(16,1)
학습 방식 처음부터 학습
프롬프트 · 에이전트 구성 해당 없음
데이터확보 방식 공개 데이터셋 그대로 (수업 제공) 출처 수업 자료 data/rider_data.csv 직접 수집 내용 해당 없음 …
항목 값
확보 방식 공개 데이터셋 그대로 (수업 제공)
출처 수업 자료 data/rider_data.csv
직접 수집 내용 해당 없음
이용 조건 확인 해당 없음 (수업 자료)
규모 1,000건 × 5열 (Distance_km, Riders_Available, Weather_Index, Rush_Hour, Time_min)
분할 train 800 / test 200 (8:2, 시드 42). validation 없음
레이블·클래스 분포 배달 시간(분). 분포 [미확인]
전처리 StandardScaler (train으로 fit) → float32 텐서 → TensorDataset + DataLoader(batch_size=20, shuffle=True)
개인정보·민감정보 처리 해당 없음
학습하이퍼파라미터 손실 MSELoss , Adam(lr=1e-3) , 배치 20 (배치 40개) 에폭 / 스텝 300 에폭 (12…
항목 값
하이퍼파라미터 손실 MSELoss, Adam(lr=1e-3), 배치 20 (배치 40개)
에폭 / 스텝 300 에폭 (12,000 스텝)
학습 시간 [미확인] (노트북에 시간 측정이 없음)
하드웨어 GPU (device='cuda'). 장비는 이 컴퓨터의 NVIDIA GeForce RTX 4070 Laptop GPU 8GB로 보이나 노트북에서 직접 확인하지는 않음 [미확인]
프레임워크 torch 2.14.0+cu126, scikit-learn 1.9.0
시드 · 재현 방법 train_test_split(test_size=0.2, random_state=42). torch 시드는 지정하지 않음
결과학습 손실 곡선 test 200건 기준, 노트북 출력입니다. R² 0.909 test 200 없음 MAE 2.63분 test …
학습 손실 곡선
학습 손실 곡선

test 200건 기준, 노트북 출력입니다.

지표 값 테스트셋 비교 대상 (baseline 등)
R² 0.909 test 200 없음
MAE 2.63분 test 200
MSE 10.44 test 200
  • 새 입력 [4.7km, 라이더 26명, 날씨 2, 출퇴근 아님] → 배달 시간 18.77분 (노트북 출력)
  • [🚩AI 설명] 학습 루프 셀은 저장된 출력이 NameError(모델 정의 셀보다 먼저 실행된 기록)로 남아 있지만, 이후 셀의 손실 그래프·평가·저장은 정상 실행된 출력이 있습니다. 같은 노트북 아래쪽에 같은 흐름을 다시 쓴 "복습" 셀도 있습니다.

추론 성능 (CPU / GPU)

측정 안 함.

장비 장비 이름 배치 크기 지연 시간 (샘플당, p50 / p95) 처리량 (샘플/초) 메모리 사용
CPU [미확인] - 측정 안 함 측정 안 함 측정 안 함
GPU [미확인] - 측정 안 함 측정 안 함 측정 안 함
한계 · 배운 점한계 알려진 실패 유형: [미확인] (오차 분석을 하지 않음) 편향 / 공정성 이슈: 해당 없음 성능이 떨어지는 입력 조건: …

한계

  • 알려진 실패 유형: [미확인] (오차 분석을 하지 않음)
  • 편향 / 공정성 이슈: 해당 없음
  • 성능이 떨어지는 입력 조건: [미확인]
  • 노트북 주석: "정석은 Loss가 바로 앞에 있는 Loss보다 줄어들면 그때마다 바로바로 save" — 여기서는 마지막 에폭 모델을 저장

배운 점

  • .grad는 누적되므로 배치마다 optimizer.zero_grad()로 초기화 (노트북 주석)
  • loss.backward()는 기울기 계산만, optimizer.step()이 실제로 파라미터를 바꿈 (노트북 주석)
  • 추론도 학습 때와 같은 환경이어야 해서 스케일러도 함께 저장 (노트북 주석)
  • [🚩AI 설명] 같은 수업 흐름에서 LeNet-5 MNIST로 이어짐 (다음 날 CNN)
사용 방법코드 셀 4개
In [1]모델 정의
class RegressionModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(4, 32)
        self.fc2 = nn.Linear(32, 64)
        self.fc3 = nn.Linear(64, 16)
        self.fc4 = nn.Linear(16, 1)
        self.relu = nn.ReLU()

    def forward(self, x):
        x = self.relu(self.fc1(x))
        x = self.relu(self.fc2(x))
        x = self.relu(self.fc3(x))
        return self.fc4(x)

device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = RegressionModel().to(device)
In [2]학습 루프
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
epochs = 300
loss_list = []

for epoch in range(epochs):
    loss_sum = 0
    for X_data, y_data in train_loader:
        X_data, y_data = X_data.to(device), y_data.to(device)
        optimizer.zero_grad()
        pred = model(X_data)
        loss = criterion(pred, y_data)
        loss.backward()
        optimizer.step()
        loss_sum += loss.item()
    loss_list.append(loss_sum / len(train_loader))
In [3]평가
model.eval()
with torch.no_grad():
    pred = model((X_test_tensor).to(device))

print(mean_absolute_error(y_test, pred.cpu()))
print(mean_squared_error(y_test, pred.cpu()))
print(r2_score(y_test, pred.cpu()))
Out[3] 출력 보기
2.6276835272023527
10.43576535003113
0.909453024737761
In [4]새 데이터 예측·저장
new_data = scaler.transform([[4.7, 26, 2, 0]])
pred = model(torch.tensor(new_data, dtype=torch.float32).to(device))
print(f'배달시간: {pred.item()}')

torch.save(model.state_dict(), 'Regressionmodel.pth')
joblib.dump(scaler, 'Regressionmodel_scaler.pkl')
Out[4] 출력 보기
배달시간: 18.767852783203125

같은 과제·데이터셋 비교

같은 과제·데이터셋으로 학습한 모델이 생기면 여기에서 비교됩니다.