Situation

스크린샷, 2026-07-29 00.00.21.png

'소비학습'에 지출 예측 기능을 넣기로 했습니다. 사용자가 이번 달 지출을 미리 가늠해 볼 수 있도록, 날짜별로 얼마나 쓸지와 카테고리별로 얼마나 쓸지를 보여주는 화면을 만들 계획이었습니다.

이 예측 기능을 처음 설계할 때 떠올린 방법은 CreateML의 회귀(Regressor) 모델이었습니다. 결국 필요한 건 “1일엔 얼마, 2일엔 얼마”처럼 날짜별 숫자, “이 카테고리엔 얼마”처럼 카테고리별 숫자를 예측하는 것이었고, 이건 과거 지출 데이터를 학습시켜 새로운 숫자를 예측하는 전형적인 회귀 문제로 보였기 때문입니다.

Task

정리하면 목표는 다음과 같았습니다.

Action

image.png

CreateML의 Tabular Regression은 표(테이블) 형태의 데이터를 학습해 숫자를 예측하는 회귀 모델입니다. 학습시킬 때는 입력 컬럼들(feature, 예측의 근거가 되는 값 — 여기선 날짜나 요일)과 정답 컬럼(target, 실제로 맞혀야 하는 값 — 여기선 그날의 지출 금액)을 나눠서 데이터를 줍니다. 모델은 이 둘의 관계를 학습해서, 이후 새로운 날짜를 입력하면 그에 맞는 지출 금액을 출력합니다.

image.png

이 방식을 지출 예측에 적용해보려니, 지속 학습 문제부터 걸렸습니다. Tabular Regression에서 고를 수 있는 알고리즘은 Automatic, Random Forest, Boosted Tree, Decision Tree, Linear Regression 뿐이었습니다. 이 중 CoreML이 온디바이스에서 업데이트 가능한 모델로 지원하는 타입(신경망, 파이프라인 모델, kNN(Nearest Neighbor Classifier))에 해당하는건 하나도 없었습니다. 처음엔 표본이 적어 엉성한 예측이 나오더라도, 사용자의 지출이 쌓일 때마다 모델이 다시 학습해 점점 정확해지는 구조를 염두에 뒀는데, 애초에 그 재학습이라는 전제 자체가 이 모델 타입으로는 지원되지 않았습니다.

또한, 일별 예측에서 정말 필요했던 건 "패턴을 학습하는 모델"이 아니라 "패턴이 있는지 판단하는 기준"이었습니다. 예를 들어 "매달 15일에 구독료가 나간다"는 패턴은, 과거 15일들의 지출 금액을 모아 평균과 표준편차만 계산해도 확인할 수 있었습니다. 값이 매번 비슷하면(표준편차가 작으면) 패턴으로 인정하고, 들쭉날쭉하면(표준편차가 크면) 패턴이 아니라고 판단하면 됐습니다. 이 판단은 회귀 모델 없이도, 기기 안에서 지출이 기록되는 즉시 계산할 수 있었습니다.

카테고리별 예측은 이보다도 단순했습니다. "과거 몇 달간 이 카테고리에 쓴 돈의 평균" 만으로도 사용자가 원하는 감을 충분히 줄 수 있었고, 굳이 패턴 판단 없이 나눗셈 하나로 같은 결론에 도달할 수 있었습니다.

그래서 방향을 통계 기반 예측으로 결정했습니다. 일별 예측은 "값들이 서로 크게 벗어나지 않을 때만 그 평균을 신뢰한다"와 같은 기준(최소 표본 개수, 변동 계수)으로 패턴 여부를 직접 판단하게 했고, 카테고리별 예측은 그런 판단 없이 단순히 "과거 월 평균"만 계산하는 것으로 정리했습니다.

Result