← 모델 목록
수업 실습 2026-08-28 · tabular-regression
선형 모델 계열 (최소제곱 선형 회귀)

LinearRegression (scikit-learn Pipeline)

선형 회귀 중고차 가격 예측 (ML 미니대회 회귀 트랙)
모델
표준화·원-핫 인코딩 전처리와 선형 회귀를 하나의 Pipeline으로 묶은 모델. 가격에 log1p를 씌워 학습
사용 목적
수업 ML 미니대회 회귀 트랙(중고차 재판매 가격)에 낼 베이스라인을 만들고, 결측 처리·시간 순 검증·Pipeline 저장 흐름을 익히려고 사용
코드
mnmms/mldl
가중치
linear_baseline_model.joblib 0.01MB · 로컬 보관
linear_baseline_model.joblib (노트북 폴더 기준)
rmsle6.0%
r298.9%
mae1158777
학습 시간없음
추론 CPU / GPU측정 안 함

데이터

  • 대회 제공 train 75,000 · test 20,000
  • 입력 31개 · 결측 6개 열
  • 시간 순 분할: 과거 85% fit · 최근 15% valid

학습

  • log1p 타깃 · StandardScaler + OneHot
  • train 전체로 재학습 후 joblib 저장
  • CPU · 학습 시간 [미확인]

결과

  • valid RMSLE 0.0603 · R² 0.9885
  • MAE 1,158,777원 · RMSE 1,721,547원
  • 리더보드 점수 [미확인]

배운 점

  • 결측 통계는 train 기준으로만 계산 (누수 방지)
  • 검증용과 제출용 전처리기를 따로 만듦
개요용도 의도한 용도: 대회 제출용 베이스라인 (제출 파일 submission_linear.csv ) 대상 사용자: 해당 없음 (…

용도

  • 의도한 용도: 대회 제출용 베이스라인 (제출 파일 submission_linear.csv)
  • 대상 사용자: 해당 없음 (학습용)
  • 의도하지 않은 용도: 실제 중고차 시세 산정 (합성 데이터)

모델 정보

항목 값
베이스 모델 직접 구현 (처음부터 학습)
크기 · 변형 Pipeline([ColumnTransformer(StandardScaler(숫자), OneHotEncoder(handle_unknown='ignore', 범주 9열)), LinearRegression()])
리비전 scikit-learn 1.9.0 (uv.lock 기준)
아키텍처 전처리 → 선형 회귀. 타깃은 log1p(resale_price_krw), 예측은 expm1로 되돌리고 0 미만은 0으로 자름
학습 방식 처음부터 학습
프롬프트 · 에이전트 구성 해당 없음
데이터확보 방식 공개 데이터셋 그대로 (수업 대회 제공 합성 데이터) 출처 mini-competition/participant/re…
항목 값
확보 방식 공개 데이터셋 그대로 (수업 대회 제공 합성 데이터)
출처 mini-competition/participant/regression/train.csv, test.csv (README: 결측치, 비선형 감가, 지역 수요/공급 상호작용, 시간 분포 이동, test에만 있는 희귀 범주를 일부러 넣은 합성 데이터)
직접 수집 내용 해당 없음
이용 조건 확인 해당 없음 (수업 자료)
규모 train 75,000 (2023-01-01 ~ 2025-12-31) / test 20,000 (2026-01-01 ~ 06-30, 정답 비공개)
분할 날짜 기준: listing_date 85% 분위(2025-07-19) 이전 fit 63,681 / 이후 valid 11,319 (비율 0.849 / 0.151). 경계일이 한쪽에만 들어가게 날짜로 자름
레이블·클래스 분포 타깃 resale_price_krw (원). 분포 [미확인]
전처리 dealer_rating: 결측 여부 플래그 has_dealer_rating 추가 후 중앙값. mileage_km·service_history_score·days_since_inspection: model_year별 중앙값. engine_cc: fuel_type별 중앙값. color: 'missing' 범주. listing_date → 연·월. 모든 통계는 train 기준
개인정보·민감정보 처리 해당 없음 (합성 데이터)
  • [🚩AI 설명] fit/valid 개수(63,681 / 11,319)는 출력된 비율 0.84908 / 0.15092에 75,000을 곱해 계산한 값입니다.
학습하이퍼파라미터 없음 (기본값) 에폭 / 스텝 해당 없음 학습 시간 [미확인] (노트북에 시간 측정이 없음) 하드웨어 CPU (…
항목 값
하이퍼파라미터 없음 (기본값)
에폭 / 스텝 해당 없음
학습 시간 [미확인] (노트북에 시간 측정이 없음)
하드웨어 CPU (scikit-learn). 장비 이름 [미확인]
프레임워크 scikit-learn 1.9.0, pandas 3.0.5, joblib
시드 · 재현 방법 무작위 요소 없음 (날짜 기준 분할)
결과검증셋(최근 15%) 기준, 노트북 출력입니다. RMSLE 0.0603 valid (2025-07-19 이후) 없음 R² 0.…

검증셋(최근 15%) 기준, 노트북 출력입니다.

지표 값 테스트셋 비교 대상 (baseline 등)
RMSLE 0.0603 valid (2025-07-19 이후) 없음
R² 0.9885 valid
MAE 1,158,777원 valid
RMSE 1,721,547원 valid
리더보드 RMSE [미확인] test 20,000 대회 결과 기록이 레포에 없음

추론 성능 (CPU / GPU)

측정 안 함.

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

한계

  • 알려진 실패 유형: [미확인] (오차 분석을 하지 않음)
  • 편향 / 공정성 이슈: 해당 없음 (합성 데이터)
  • 성능이 떨어지는 입력 조건: test에만 있는 희귀 범주는 원-핫에서 모두 0으로 처리됨 (handle_unknown='ignore')
  • [🚩AI 설명] README가 말한 "비선형 감가"와 "지역 상호작용"은 선형 모델이 직접 표현하지 못함

배운 점

  • 검증용 Pipeline의 전처리기 객체를 재사용하면 fit()이 내부 상태를 덮어써 검증용 모델까지 바뀜 → 제출용 ColumnTransformer를 새로 만듦 (노트북 주석)
  • 전처리기와 모델은 한 세트라 Pipeline 전체를 저장해야 원본 데이터를 그대로 넣을 수 있음 (노트북 주석)
  • 타깃에 log1p를 씌우면 MSE 최소화가 곧 RMSLE 최소화가 됨 (노트북 주석)
  • test가 train보다 미래라서 검증도 무작위가 아니라 최근 기간으로 나눔 (노트북 주석)
사용 방법코드 셀 2개
In [1]검증용 학습·평가
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

drop_cols = ['vehicle_id', 'listing_date', 'resale_price_krw']
cat_cols = ['manufacturer', 'model_family', 'trim_level', 'fuel_type',
            'transmission', 'body_type', 'region', 'seller_type', 'color']
feature_cols = [c for c in train_proc.columns if c not in drop_cols]
num_cols = [c for c in feature_cols if c not in cat_cols]

preprocessor = ColumnTransformer([
    ('num', StandardScaler(), num_cols),
    ('cat', OneHotEncoder(handle_unknown='ignore'), cat_cols),
])
model = Pipeline([('prep', preprocessor), ('lr', LinearRegression())])

X_fit, y_fit = fit_df[feature_cols], np.log1p(fit_df['resale_price_krw'])
X_valid, y_valid = valid_df[feature_cols], np.log1p(valid_df['resale_price_krw'])

model.fit(X_fit, y_fit)
pred_log = np.clip(model.predict(X_valid), 0, None)
print('Validation RMSLE:', round(np.sqrt(mean_squared_error(y_valid, pred_log)), 4))

pred_price = np.expm1(pred_log)
true_price = valid_df['resale_price_krw']
print('Validation MAE :', round(mean_absolute_error(true_price, pred_price)))
print('Validation RMSE:', round(np.sqrt(mean_squared_error(true_price, pred_price))))
print('Validation R2  :', round(r2_score(true_price, pred_price), 4))
Out[1] 출력 보기
Validation RMSLE: 0.0603
Validation MAE : 1158777
Validation RMSE: 1721547
Validation R2  : 0.9885
In [2]저장한 모델로 제출 파일 만들기
import joblib

model_path = './mini-competition/participant/regression/linear_baseline_model.joblib'
loaded_model = joblib.load(model_path)

test_pred_log = np.clip(loaded_model.predict(test_proc[feature_cols]), 0, None)
test_pred_price = np.clip(np.expm1(test_pred_log), 0, None)

submission = pd.DataFrame({
    'vehicle_id': test_proc['vehicle_id'],
    'resale_price_krw': test_pred_price.round().astype(int),
})
submission.head()
Out[2] 출력 보기
  vehicle_id  resale_price_krw
0  VT0000000          14326097
1  VT0000001          18696372
2  VT0000002          40453322
3  VT0000003          23687201
4  VT0000004          36939126

같은 과제·데이터셋 비교

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