본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 12. 17. · 6 Views
회귀 문제 이해하기 완벽 가이드
머신러닝의 핵심 과제인 회귀 문제를 실무 예제와 함께 쉽게 풀어냅니다. 분류와의 차이점, 연속형 변수의 개념, 실전 활용법까지 초급 개발자를 위한 친절한 설명서입니다.
목차
1. 회귀 문제란 무엇인가
어느 날 김개발 씨가 데이터 분석 팀으로 발령을 받았습니다. 팀장님이 첫 업무를 주시면서 이렇게 말씀하셨습니다.
"이번 프로젝트는 회귀 문제예요. 어렵지 않으니 차근차근 해보세요." 김개발 씨는 고개를 끄덕였지만 솔직히 회귀 문제가 정확히 무엇인지 잘 몰랐습니다.
회귀 문제는 연속적인 숫자 값을 예측하는 머신러닝 과제입니다. 마치 내일 날씨의 온도를 예측하거나, 집값을 추정하는 것처럼 구체적인 수치를 맞히는 것이 목표입니다.
분류 문제와 달리 예측값이 무한히 많은 가능성을 가집니다.
다음 코드를 살펴봅시다.
# 주택 가격 예측 회귀 문제 예제
from sklearn.linear_model import LinearRegression
import numpy as np
# 주택 면적 데이터 (독립변수)
area = np.array([[30], [50], [70], [90], [110]])
# 주택 가격 데이터 (종속변수) - 연속적인 값
price = np.array([150, 250, 350, 450, 550])
# 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(area, price)
# 새로운 면적에 대한 가격 예측
new_area = np.array([[80]])
predicted_price = model.predict(new_area)
print(f"80평방미터 주택의 예상 가격: {predicted_price[0]:.0f}만원")
김개발 씨는 회의실로 가서 팀장님께 조심스럽게 물어봤습니다. "팀장님, 회귀 문제가 정확히 뭔가요?" 팀장님은 미소를 지으며 화이트보드 앞으로 다가갔습니다.
"좋은 질문이에요. 회귀 문제를 이해하려면 먼저 우리가 무엇을 예측하려고 하는지 생각해봐야 합니다." 팀장님은 화이트보드에 몇 가지 예시를 적기 시작했습니다.
내일 최고 기온은 몇 도일까요? 이번 달 우리 회사 매출은 얼마나 될까요?
강남의 30평 아파트 가격은 얼마일까요? "이런 질문들의 공통점이 뭘까요?" 김개발 씨가 잠시 생각하다가 대답했습니다.
"음... 모두 숫자로 답해야 한다는 거요?" 팀장님이 손뼉을 쳤습니다.
"정답입니다! 바로 그거예요." 회귀 문제란 연속적인 숫자 값을 예측하는 머신러닝 과제를 말합니다.
여기서 핵심 단어는 '연속적인'입니다. 온도는 25도일 수도, 25.5도일 수도, 25.73도일 수도 있습니다.
무한히 많은 가능성이 있습니다. 쉽게 비유하자면, 회귀 문제는 마치 키 재는 것과 같습니다.
사람의 키는 150cm일 수도, 175.3cm일 수도, 180.7cm일 수도 있습니다. 딱 떨어지는 몇 가지 값이 아니라 연속적인 스펙트럼 위의 어떤 값이든 될 수 있습니다.
팀장님이 실제 업무 사례를 들어주었습니다. "우리 회사가 최근에 받은 프로젝트를 예로 들어볼까요?
부동산 중개 플랫폼에서 주택 가격 예측 시스템을 만들어달라고 했어요." 고객이 주택의 면적, 위치, 방 개수 같은 정보를 입력하면 시스템이 예상 가격을 알려줘야 합니다. 이때 예측하는 가격은 3억일 수도, 3억 2천만 원일 수도, 2억 9천 500만 원일 수도 있습니다.
정확한 숫자 값을 맞혀야 하는 것입니다. "이게 바로 회귀 문제예요.
입력 데이터를 받아서 연속적인 수치를 출력하는 거죠." 위의 코드를 함께 살펴봅시다. 먼저 주택 면적 데이터를 준비했습니다.
30평방미터부터 110평방미터까지 5개의 샘플이 있습니다. 그리고 각 면적에 해당하는 실제 가격 데이터도 있습니다.
LinearRegression() 모델을 만들고 fit() 메서드로 학습시킵니다. 모델은 면적과 가격 사이의 관계를 파악합니다.
그 다음 80평방미터라는 새로운 면적을 입력하면 모델이 가격을 예측합니다. 실제로 실행해보면 약 400만원 정도로 예측됩니다.
모델이 학습한 패턴을 바탕으로 새로운 값을 추정한 것입니다. 실무에서 회귀 문제는 정말 다양하게 활용됩니다.
이커머스 회사는 내일 주문량을 예측하고, 제조업체는 제품 불량률을 예측하며, 금융회사는 주가를 예측합니다. 모두 구체적인 숫자를 맞히는 회귀 문제입니다.
김개발 씨가 고개를 끄덕이며 노트에 메모했습니다. "그럼 회귀 문제의 핵심은 연속적인 숫자를 예측하는 거군요!" 팀장님이 미소를 지으며 대답했습니다.
"맞아요. 이제 제대로 이해한 것 같네요." 회귀 문제를 이해하면 데이터 분석의 절반은 끝난 것이나 다름없습니다.
앞으로 배울 여러 회귀 알고리즘의 기초가 되는 개념이니까요.
실전 팁
💡 - 회귀 문제는 항상 연속적인 수치를 예측한다는 점을 기억하세요
- 실무에서는 주택 가격, 매출 예측, 수요 예측 등에 활용됩니다
- 예측값이 무한히 많은 가능성을 가진다면 회귀 문제입니다
2. 분류와 회귀 비교
점심시간에 김개발 씨는 같은 팀 이주니어 씨와 카페테리아에서 마주쳤습니다. 이주니어 씨가 물었습니다.
"김개발 씨는 회귀 프로젝트 맡았다며요? 저는 이메일 스팸 분류 프로젝트예요.
우리 둘 다 머신러닝인데 뭐가 다른 거예요?"
분류 문제는 데이터를 정해진 범주로 나누는 과제이고, 회귀 문제는 연속적인 수치를 예측하는 과제입니다. 분류는 "A인가 B인가"를 판단하고, 회귀는 "얼마나"를 계산합니다.
출력값의 성격이 근본적으로 다릅니다.
다음 코드를 살펴봅시다.
# 분류 문제 예제 - 이메일이 스팸인지 아닌지
from sklearn.naive_bayes import GaussianNB
# 이메일 특성 (단어 빈도 등)
email_features = [[1, 5], [2, 3], [3, 1], [4, 6]]
# 레이블: 0=정상, 1=스팸 (이산적인 범주)
labels = [0, 0, 1, 1]
classifier = GaussianNB()
classifier.fit(email_features, labels)
print(f"새 이메일 분류 결과: {classifier.predict([[2, 4]])[0]}") # 0 또는 1
# 회귀 문제 예제 - 경력에 따른 연봉 예측
years_experience = np.array([[1], [3], [5], [7]])
salary = np.array([3000, 4500, 6000, 7500]) # 연속적인 값
regressor = LinearRegression()
regressor.fit(years_experience, salary)
print(f"4년차 예상 연봉: {regressor.predict([[4]])[0]:.0f}만원") # 연속적인 수치
김개발 씨는 잠시 생각했습니다. 같은 머신러닝인데 뭐가 다를까요?
바로 그때 옆 테이블에서 박시니어 씨가 대화를 듣고 끼어들었습니다. "좋은 질문이네요.
둘의 차이를 이해하면 머신러닝의 큰 그림이 보입니다." 박시니어 씨가 냅킨에 그림을 그리기 시작했습니다. "분류와 회귀의 가장 큰 차이는 바로 출력값의 성격입니다." 쉽게 비유하자면, 분류는 마치 사람들을 혈액형별로 나누는 것과 같습니다.
A형, B형, O형, AB형 중 하나로 딱 떨어집니다. 중간값이 없습니다.
A형도 아니고 B형도 아닌 애매한 혈액형은 없습니다. 반면 회귀는 사람의 몸무게를 재는 것과 같습니다.
60kg, 60.5kg, 61.2kg 등 연속적인 값입니다. 무한히 많은 가능성이 있습니다.
"이주니어 씨의 스팸 분류를 예로 들어볼까요?" 박시니어 씨가 설명을 이어갔습니다. "이메일은 스팸이거나 정상이거나 둘 중 하나예요.
중간값이 없습니다. 이게 분류 문제의 특징입니다." 스팸 분류 모델은 새로운 이메일을 받으면 0 또는 1을 출력합니다.
0은 정상 메일, 1은 스팸 메일입니다. 0.5같은 중간값을 출력하지 않습니다.
명확하게 둘 중 하나를 선택합니다. "그럼 김개발 씨의 회귀 문제는 어떨까요?" 박시니어 씨가 김개발 씨를 바라봤습니다.
"주택 가격은 3억, 3억 500만 원, 2억 9천만 원처럼 무수히 많은 값이 가능하죠. 이게 회귀 문제입니다." 위의 코드를 비교해봅시다.
첫 번째 분류 예제를 보면 GaussianNB()라는 분류 알고리즘을 사용합니다. 레이블이 0과 1로 이산적입니다.
새로운 이메일을 예측하면 0 또는 1만 나옵니다. 두 번째 회귀 예제는 LinearRegression()을 사용합니다.
연봉 데이터가 3000, 4500, 6000처럼 연속적입니다. 4년차 연봉을 예측하면 5250만원 같은 구체적인 수치가 나옵니다.
김개발 씨가 무릎을 쳤습니다. "아!
그러니까 분류는 범주를 나누는 거고, 회귀는 숫자를 맞히는 거네요!" 박시니어 씨가 고개를 끄덕였습니다. "정확해요.
분류는 '이것인가 저것인가'를 판단하고, 회귀는 '얼마나'를 계산합니다." 실무에서 이 차이는 매우 중요합니다. 고객 이탈 여부를 예측한다면 분류 문제입니다.
이탈하거나 안 하거나 둘 중 하나니까요. 하지만 고객의 구매 금액을 예측한다면 회귀 문제입니다.
금액은 연속적인 값이니까요. 문제의 성격을 잘못 판단하면 전혀 엉뚱한 알고리즘을 선택하게 됩니다.
회귀 문제에 분류 알고리즘을 쓰면 제대로 된 예측을 할 수 없습니다. "그래서 프로젝트를 시작할 때 가장 먼저 해야 할 일은 '이게 분류인가, 회귀인가'를 판단하는 겁니다." 박시니어 씨가 강조했습니다.
이주니어 씨가 신기한 표정으로 물었습니다. "그럼 분류와 회귀 중 어느 게 더 어려운 거예요?" 박시니어 씨가 웃으며 답했습니다.
"둘 다 어렵고, 둘 다 중요합니다. 상황에 맞는 것을 선택하는 게 중요하죠."
실전 팁
💡 - 출력값이 범주/그룹이면 분류, 연속적인 숫자면 회귀입니다
- 프로젝트 시작 전 문제 유형을 명확히 판단하세요
- "예/아니오", "합격/불합격"처럼 선택지가 정해져 있으면 분류 문제입니다
3. 연속형 변수 이해하기
오후 회의 시간, 데이터 분석 팀 전체가 모였습니다. 신입사원 최초보 씨가 질문을 던졌습니다.
"팀장님, 연속형 변수가 정확히 뭔가요? 자꾸 나오는데 개념이 헷갈려요."
연속형 변수는 특정 범위 내에서 무한히 많은 값을 가질 수 있는 변수입니다. 키, 몸무게, 온도, 시간처럼 소수점 단위로 세분화할 수 있는 모든 수치가 연속형 변수입니다.
회귀 문제에서 예측하는 대상이 바로 연속형 변수입니다.
다음 코드를 살펴봅시다.
import pandas as pd
# 연속형 변수 예제
data = {
'키': [165.5, 172.3, 180.1, 158.9, 175.6], # 연속형
'몸무게': [58.3, 72.1, 80.5, 52.4, 68.9], # 연속형
'나이': [25, 32, 28, 45, 37], # 이산형 (하지만 연속형처럼 취급 가능)
'성별': ['남', '남', '여', '여', '남'] # 범주형 (분류용)
}
df = pd.DataFrame(data)
# 연속형 변수의 통계 정보 확인
print("연속형 변수 통계:")
print(df[['키', '몸무게']].describe())
# 연속형 변수는 소수점까지 정확한 값을 가짐
print(f"\n첫 번째 사람의 정확한 키: {df['키'][0]}cm")
팀장님이 화이트보드로 다가가 큰 숫자 선을 그렸습니다. "연속형 변수를 이해하려면 먼저 변수의 종류를 알아야 합니다." 데이터 분석에서 변수는 크게 두 가지로 나뉩니다.
범주형 변수와 수치형 변수입니다. 수치형 변수는 다시 이산형과 연속형으로 나뉩니다.
쉽게 비유하자면, 연속형 변수는 마치 물과 같습니다. 물을 컵에 따를 때 정확히 100ml만 따를 수도 있지만, 99.5ml, 100.3ml, 100.73ml처럼 무한히 정밀하게 측정할 수 있습니다.
이론적으로는 무한히 쪼갤 수 있습니다. 팀장님이 예시를 들기 시작했습니다.
"최초보 씨, 키가 몇 센티예요?" 최초보 씨가 대답했습니다. "168cm요." "정말 정확히 168cm일까요?
168.3cm일 수도, 167.8cm일 수도 있지 않나요?" 팀장님이 미소를 지으며 물었습니다. "키는 측정 도구에 따라 소수점 단위까지 다를 수 있어요.
이게 바로 연속형 변수의 특징입니다." 반대로 이산형 변수를 생각해봅시다. 주사위를 던지면 1, 2, 3, 4, 5, 6 중 하나가 나옵니다.
2.5나 3.7 같은 값은 나올 수 없습니다. 딱딱 끊어지는 값들입니다.
하지만 온도계를 보면 어떨까요? 25도와 26도 사이에는 25.1도, 25.2도, 25.23도, 25.238도처럼 무한히 많은 값이 존재합니다.
이것이 연속형 변수입니다. 위의 코드를 살펴봅시다.
키와 몸무게 데이터를 보면 모두 소수점을 포함합니다. 165.5cm, 172.3cm처럼 정밀한 값입니다.
이들이 연속형 변수입니다. describe() 메서드를 사용하면 평균, 표준편차, 최솟값, 최댓값 같은 통계 정보를 볼 수 있습니다.
연속형 변수이기 때문에 이런 통계 계산이 의미가 있습니다. 반면 성별 같은 범주형 변수는 평균을 계산할 수 없습니다.
'남'과 '여'의 평균이 뭔가요? 말이 안 됩니다.
김개발 씨가 질문했습니다. "그럼 나이는 어떤가요?
정수로 표현되는데 연속형인가요?" 팀장님이 고개를 끄덕였습니다. "좋은 질문이에요.
나이는 엄밀히 말하면 이산형입니다. 하지만 실무에서는 연속형처럼 취급하는 경우가 많아요.
값의 범위가 충분히 넓기 때문이죠." 예를 들어 나이가 1살부터 100살까지 있다면 충분히 많은 값입니다. 회귀 분석에서 연속형 변수처럼 다뤄도 큰 문제가 없습니다.
"그렇다면 회귀 문제와 연속형 변수는 어떤 관계인가요?" 최초보 씨가 다시 물었습니다. 팀장님이 웃으며 답했습니다.
"회귀 문제는 바로 이 연속형 변수를 예측하는 겁니다. 주택 가격, 내일 기온, 다음 달 매출액 모두 연속형 변수예요." 실무에서 데이터를 받으면 가장 먼저 해야 할 일은 각 변수의 타입을 파악하는 것입니다.
어떤 것이 범주형이고, 어떤 것이 연속형인지 구분해야 합니다. 연속형 변수는 산술 연산이 가능합니다.
평균을 구하고, 표준편차를 계산하고, 크기를 비교할 수 있습니다. 이런 특성 덕분에 회귀 분석이 가능합니다.
최초보 씨가 노트에 열심히 메모했습니다. "연속형 변수는 무한히 쪼갤 수 있고, 회귀 문제의 예측 대상이군요!" 팀장님이 만족스러운 표정으로 고개를 끄덕였습니다.
"이제 제대로 이해한 것 같네요. 이 개념만 확실히 알아도 회귀 분석의 절반은 끝난 겁니다."
실전 팁
💡 - 연속형 변수는 소수점으로 세분화 가능한 모든 수치입니다
- 키, 몸무게, 온도, 시간, 금액 등이 대표적인 연속형 변수입니다
- 회귀 문제의 목표는 바로 연속형 변수를 예측하는 것입니다
4. 회귀 문제 실제 예시들
다음날 아침, 김개발 씨는 프로젝트 킥오프 미팅에 참석했습니다. 클라이언트가 여러 가지 요구사항을 설명했습니다.
"우리는 매출 예측, 재고 최적화, 고객 생애가치 추정이 필요합니다." 김개발 씨는 메모하면서 생각했습니다. 이 중에 어떤 게 회귀 문제일까?
회귀 문제는 실무에서 매우 다양하게 나타납니다. 매출 예측, 부동산 가격 추정, 수요 예측, 재고 관리, 고객 생애가치 계산 등 연속적인 수치를 다루는 모든 분야에서 활용됩니다.
각 산업마다 고유한 회귀 문제가 존재합니다.
다음 코드를 살펴봅시다.
# 실제 업무에서 흔한 회귀 문제 예시들
import numpy as np
from sklearn.linear_model import LinearRegression
# 예시 1: 광고비에 따른 매출 예측
ad_spend = np.array([[100], [200], [300], [400], [500]]) # 광고비 (만원)
revenue = np.array([500, 950, 1400, 1850, 2300]) # 매출 (만원)
model1 = LinearRegression()
model1.fit(ad_spend, revenue)
predicted_revenue = model1.predict([[350]])
print(f"350만원 광고시 예상 매출: {predicted_revenue[0]:.0f}만원")
# 예시 2: 근무 연수에 따른 생산성 예측
years = np.array([[1], [2], [3], [4], [5]])
productivity = np.array([60, 75, 85, 92, 95]) # 생산성 점수
model2 = LinearRegression()
model2.fit(years, productivity)
predicted_prod = model2.predict([[3.5]])
print(f"3.5년차 직원 예상 생산성: {predicted_prod[0]:.1f}점")
회의가 끝나고 김개발 씨는 박시니어 씨에게 다가갔습니다. "선배님, 클라이언트가 요청한 것들이 모두 회귀 문제인가요?" 박시니어 씨가 회의록을 펼쳐봤습니다.
"하나씩 살펴봅시다. 매출 예측부터 볼까요?" 매출은 1억 원일 수도, 1억 2천만 원일 수도, 9천 500만 원일 수도 있습니다.
연속적인 숫자입니다. 분명히 회귀 문제입니다.
기업들은 다음 분기 매출을 예측해서 재고를 준비하고 인력을 배치합니다. "재고 최적화는 어떤가요?" 김개발 씨가 물었습니다.
재고 최적화는 조금 복잡합니다. 하지만 핵심은 "얼마나 많은 재고가 필요한가"를 예측하는 것입니다.
100개, 150개, 237개처럼 구체적인 수량을 예측해야 합니다. 이것도 회귀 문제입니다.
쉽게 비유하자면, 회귀 문제는 마치 날씨 예보와 같습니다. 기상청은 "내일 비가 올 확률 70%"도 알려주지만(분류), "최고 기온 25.3도"도 알려줍니다(회귀).
후자가 회귀 문제입니다. 박시니어 씨가 실제 프로젝트 사례를 들어줬습니다.
"제가 작년에 했던 프로젝트를 소개할게요. 유통회사에서 수요 예측 시스템을 만들었어요." 명절 전에 떡이 얼마나 팔릴지 예측하는 시스템이었습니다.
작년 판매량, 날씨, 경제 지표 등을 입력하면 예상 판매량을 알려줍니다. 3만 2천 개, 2만 8천 500개처럼 구체적인 숫자로 나옵니다.
"이게 없으면 어떻게 되나요?" 김개발 씨가 궁금해했습니다. 떡을 너무 많이 만들면 버려야 하고, 너무 적게 만들면 품절로 매출 손실이 발생합니다.
정확한 예측이 수억 원의 차이를 만듭니다. 위의 코드를 봅시다.
첫 번째 예시는 광고비와 매출의 관계입니다. 광고비를 100만 원 쓰면 매출이 500만 원, 200만 원 쓰면 950만 원입니다.
패턴이 보입니다. 350만 원을 광고비로 쓴다면 매출이 얼마나 될까요?
모델이 약 1,625만 원으로 예측합니다. 마케팅 팀은 이런 예측을 바탕으로 예산을 결정합니다.
두 번째 예시는 직원의 생산성 예측입니다. 신입사원은 생산성이 낮지만 경력이 쌓이면 높아집니다.
3.5년차 직원의 예상 생산성을 계산할 수 있습니다. 인사팀은 이런 데이터로 적정 인력을 계산합니다.
프로젝트에 필요한 총 생산성 점수가 300점이라면 몇 명의 몇 년차 직원이 필요한지 추정할 수 있습니다. 김개발 씨가 감탄했습니다.
"회귀 문제가 이렇게 많이 쓰이는지 몰랐어요!" 박시니어 씨가 웃으며 답했습니다. "실무에서는 분류보다 회귀가 더 많을 수도 있어요.
기업은 항상 '얼마나'를 알고 싶어 하거든요." 부동산 업계는 매물 가격을 예측하고, 물류 회사는 배송 시간을 예측하며, 금융회사는 대출 리스크를 점수로 예측합니다. 제조업체는 제품 수명을 예측하고, 병원은 입원 기간을 예측합니다.
"모두 회귀 문제예요. 그래서 회귀 분석을 제대로 배우면 어떤 산업에 가도 써먹을 수 있습니다." 박시니어 씨가 강조했습니다.
김개발 씨는 노트에 산업별 회귀 문제 예시를 정리했습니다. 이제 회귀 문제가 단순히 이론이 아니라 실제 비즈니스와 직결된다는 것을 깨달았습니다.
실전 팁
💡 - 실무에서 "얼마나"를 묻는 질문은 대부분 회귀 문제입니다
- 매출, 재고, 수요, 가격 등 비즈니스 핵심 지표는 회귀로 예측합니다
- 산업마다 고유한 회귀 문제가 있으니 도메인 지식이 중요합니다
5. 선형 관계와 비선형 관계
김개발 씨가 첫 번째 모델을 만들어 팀장님께 보고했습니다. "주택 면적과 가격의 관계를 학습시켰습니다!" 팀장님이 그래프를 보더니 고개를 갸우뚱했습니다.
"음, 이 데이터는 선형 관계가 아닌 것 같은데요?"
변수 간의 관계는 선형 관계와 비선형 관계로 나뉩니다. 선형 관계는 직선으로 표현되는 비례 관계이고, 비선형 관계는 곡선이나 복잡한 패턴을 가집니다.
올바른 모델을 선택하려면 데이터의 관계를 먼저 파악해야 합니다.
다음 코드를 살펴봅시다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
# 선형 관계 데이터
X_linear = np.array([[1], [2], [3], [4], [5]])
y_linear = np.array([2, 4, 6, 8, 10]) # 완벽한 직선 관계
# 비선형 관계 데이터 (제곱 관계)
X_nonlinear = np.array([[1], [2], [3], [4], [5]])
y_nonlinear = np.array([1, 4, 9, 16, 25]) # y = x^2
# 선형 모델 학습
linear_model = LinearRegression()
linear_model.fit(X_linear, y_linear)
print(f"선형 모델 예측 (x=6): {linear_model.predict([[6]])[0]:.1f}")
# 비선형 데이터에 다항 회귀 적용
poly = PolynomialFeatures(degree=2)
X_poly = poly.fit_transform(X_nonlinear)
poly_model = LinearRegression()
poly_model.fit(X_poly, y_nonlinear)
print(f"다항 모델 예측 (x=6): {poly_model.predict(poly.transform([[6]]))[0]:.1f}")
김개발 씨는 당황했습니다. 그래프를 보니 점들이 직선이 아니라 곡선 형태로 분포되어 있었습니다.
"선형 관계가 뭔가요?" 팀장님이 종이에 두 개의 그래프를 그렸습니다. 하나는 점들이 깔끔한 직선 위에 있고, 다른 하나는 점들이 곡선을 그리며 올라갔습니다.
"선형 관계는 변수가 일정한 비율로 변하는 겁니다. X가 1 증가하면 Y도 항상 같은 양만큼 증가하죠." 쉽게 비유하자면, 선형 관계는 마치 택시 요금과 같습니다.
기본요금이 3,000원이고 1km당 1,000원이라면, 거리가 늘어날수록 요금이 일정하게 증가합니다. 그래프로 그리면 직선이 됩니다.
하지만 비선형 관계는 다릅니다. 자동차 속도와 제동거리를 생각해봅시다.
속도가 2배 증가하면 제동거리는 4배 증가합니다. 일정한 비율이 아닙니다.
곡선 형태입니다. 팀장님이 실제 사례를 들어줬습니다.
"주택 가격을 예로 들어볼까요? 면적이 10평 늘어날 때마다 가격이 정확히 5천만 원씩 오른다면 선형 관계예요." 하지만 현실은 그렇지 않습니다.
작은 평수에서는 10평 증가가 큰 영향을 주지만, 큰 평수에서는 영향이 적을 수 있습니다. 또는 특정 평수를 넘으면 급격히 비싸질 수도 있습니다.
"이럴 때는 비선형 모델을 써야 합니다." 팀장님이 설명을 이어갔습니다. 위의 코드를 살펴봅시다.
첫 번째 데이터는 완벽한 선형 관계입니다. X가 1, 2, 3, 4, 5일 때 Y는 2, 4, 6, 8, 10입니다.
정확히 y = 2x 관계입니다. 선형 모델로 X=6을 예측하면 12가 나옵니다.
완벽하게 맞습니다. 두 번째 데이터는 제곱 관계입니다.
Y = X²이므로 1, 4, 9, 16, 25입니다. 선형 모델로는 이 패턴을 제대로 학습할 수 없습니다.
그래서 PolynomialFeatures를 사용합니다. 이것은 X뿐만 아니라 X²도 특성으로 만듭니다.
이렇게 하면 곡선 관계도 학습할 수 있습니다. 다항 모델로 X=6을 예측하면 36에 가까운 값이 나옵니다.
실제 정답인 36과 일치합니다. 김개발 씨가 질문했습니다.
"그럼 언제 선형을 쓰고 언제 비선형을 쓰나요?" 팀장님이 답했습니다. "먼저 데이터를 시각화해서 관계를 확인해야 합니다.
점들이 직선 형태면 선형, 곡선 형태면 비선형을 고려하세요." 실무에서는 대부분 비선형 관계가 많습니다. 현실 세계는 복잡하기 때문입니다.
하지만 선형 모델이 해석하기 쉽고 빠르다는 장점이 있습니다. "처음엔 간단한 선형 모델로 시작해보세요.
성능이 안 나오면 비선형을 고려하는 거죠." 팀장님이 조언했습니다. 많은 초보 개발자들이 하는 실수는 무조건 복잡한 모델을 쓰는 것입니다.
데이터가 실제로 선형 관계인데 복잡한 비선형 모델을 쓰면 오히려 과적합이 발생합니다. 김개발 씨가 자신의 주택 가격 데이터를 다시 시각화해봤습니다.
확실히 곡선 형태였습니다. 다항 회귀를 적용하니 예측 정확도가 크게 올랐습니다.
"이제 이해했어요! 데이터의 형태를 먼저 보고 모델을 선택해야 하는 거네요." 김개발 씨가 확신에 찬 목소리로 말했습니다.
실전 팁
💡 - 모델 선택 전 반드시 데이터를 시각화하여 관계를 파악하세요
- 선형 모델은 해석이 쉽지만, 비선형 관계는 포착하지 못합니다
- 처음엔 단순한 모델로 시작하고, 필요시 복잡도를 높이세요
6. 회귀 모델의 목표
김개발 씨가 모델을 학습시키고 나서 이주니어 씨에게 자랑했습니다. "드디어 모델 학습이 끝났어요!" 이주니어 씨가 물었습니다.
"그런데 그 모델이 잘 만들어진 건지 어떻게 알아요?" 김개발 씨는 잠시 멈칫했습니다.
회귀 모델의 목표는 실제값과 예측값의 차이를 최소화하는 것입니다. 이 차이를 오차 또는 잔차라고 부릅니다.
모델은 학습 과정에서 오차를 줄이는 방향으로 파라미터를 조정합니다. 좋은 모델일수록 오차가 작습니다.
다음 코드를 살펴봅시다.
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
# 실제 데이터
X = np.array([[1], [2], [3], [4], [5]])
y_actual = np.array([2.1, 4.3, 5.8, 8.2, 9.9])
# 모델 학습
model = LinearRegression()
model.fit(X, y_actual)
# 예측값 계산
y_predicted = model.predict(X)
# 오차 계산
errors = y_actual - y_predicted
print("실제값:", y_actual)
print("예측값:", y_predicted)
print("오차:", errors)
print(f"\n평균 제곱 오차(MSE): {np.mean(errors**2):.3f}")
# 모델의 목표: 오차의 합을 최소화
print(f"오차 제곱의 합: {np.sum(errors**2):.3f}")
박시니어 씨가 두 사람의 대화를 듣고 다가왔습니다. "좋은 질문이네요.
회귀 모델이 정확히 무엇을 하려고 하는지 이해해야 합니다." 화이트보드에 점 몇 개를 찍고 그 사이를 지나가는 직선을 그렸습니다. "회귀 모델의 목표는 한마디로 최적의 선을 찾는 것입니다." 쉽게 비유하자면, 회귀 모델은 마치 사격 선수와 같습니다.
과녁의 정중앙(실제값)을 맞히려고 노력하지만 항상 약간씩 벗어납니다(오차). 좋은 선수일수록 과녁 중앙에 가깝게 맞힙니다.
박시니어 씨가 설명을 이어갔습니다. "모델이 예측한 값과 실제 값의 차이를 오차라고 합니다.
영어로는 error 또는 residual이에요." 예를 들어 실제 주택 가격이 3억 원인데 모델이 2억 9천만 원으로 예측했다면 오차는 1천만 원입니다. 이 오차를 줄이는 것이 모델의 목표입니다.
"그런데 왜 오차를 제곱해서 더하나요?" 김개발 씨가 코드를 보며 물었습니다. 박시니어 씨가 미소를 지었습니다.
"아주 좋은 질문입니다. 몇 가지 이유가 있어요." 첫째, 오차는 양수도 있고 음수도 있습니다.
실제보다 높게 예측하면 양수, 낮게 예측하면 음수입니다. 그냥 더하면 서로 상쇄되어 버립니다.
제곱하면 모두 양수가 됩니다. 둘째, 큰 오차에 더 큰 페널티를 줍니다.
오차가 2라면 제곱하면 4이지만, 오차가 4라면 제곱하면 16입니다. 큰 실수를 더 강하게 막습니다.
위의 코드를 자세히 봅시다. 실제값이 [2.1, 4.3, 5.8, 8.2, 9.9]입니다.
모델이 예측한 값은 이와 비슷하지만 정확히 같지는 않습니다. 오차 배열을 보면 각 예측이 실제값과 얼마나 차이 나는지 알 수 있습니다.
어떤 것은 조금 크게 예측했고, 어떤 것은 조금 작게 예측했습니다. 평균 제곱 오차(MSE)는 이 오차들의 제곱 평균입니다.
이 값이 작을수록 모델이 정확합니다. "그럼 모델은 어떻게 오차를 줄이나요?" 이주니어 씨가 궁금해했습니다.
박시니어 씨가 답했습니다. "모델 내부의 파라미터를 조금씩 조정하면서 오차가 줄어드는 방향을 찾습니다.
이 과정을 학습이라고 해요." 선형 회귀의 경우 기울기와 절편이라는 두 개의 파라미터가 있습니다. 모델은 이 값들을 조정하면서 오차 제곱의 합이 최소가 되는 조합을 찾습니다.
수학적으로는 경사하강법이라는 알고리즘을 사용합니다. 마치 산을 내려갈 때 가장 가파른 방향으로 한 걸음씩 내려가는 것과 같습니다.
실무에서는 이런 세부 과정을 몰라도 scikit-learn 같은 라이브러리가 다 해줍니다. 하지만 원리를 이해하면 모델의 동작을 더 잘 파악할 수 있습니다.
김개발 씨가 감탄했습니다. "그러니까 모델은 계속 시도하면서 최적의 선을 찾는 거네요!" 박시니어 씨가 고개를 끄덕였습니다.
"정확해요. 그리고 그 '최적'의 기준이 바로 오차를 최소화하는 겁니다." 좋은 모델을 만들려면 단순히 복잡한 알고리즘을 쓰는 게 아닙니다.
적절한 데이터를 모으고, 올바른 특성을 선택하고, 적합한 모델을 고르는 것이 더 중요합니다. "이제 여러분의 모델이 잘 만들어졌는지 판단할 수 있겠죠?
오차를 확인하면 됩니다." 박시니어 씨가 마무리했습니다.
실전 팁
💡 - 회귀 모델의 목표는 예측 오차를 최소화하는 것입니다
- 오차는 실제값과 예측값의 차이이며, 보통 제곱해서 계산합니다
- 모델 학습은 오차를 줄이는 방향으로 파라미터를 조정하는 과정입니다
7. 회귀 평가 지표 미리보기
프로젝트 중간 보고 시간, 김개발 씨가 모델을 시연했습니다. 임원진 중 한 분이 질문했습니다.
"이 모델이 얼마나 정확한가요?" 김개발 씨는 "오차가 작습니다"라고만 답했습니다. 임원이 다시 물었습니다.
"정확히 얼마나 작은데요?"
회귀 모델의 성능을 측정하는 주요 지표로는 MAE, MSE, RMSE, R² 스코어가 있습니다. MAE는 오차의 평균, MSE는 오차 제곱의 평균, RMSE는 MSE의 제곱근, R²는 모델의 설명력을 나타냅니다.
각 지표마다 장단점이 있습니다.
다음 코드를 살펴봅시다.
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
import numpy as np
# 실제값과 예측값
y_true = np.array([100, 150, 200, 250, 300])
y_pred = np.array([110, 140, 210, 240, 310])
# 다양한 평가 지표 계산
mae = mean_absolute_error(y_true, y_pred)
mse = mean_squared_error(y_true, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_true, y_pred)
print("=== 회귀 모델 평가 지표 ===")
print(f"MAE (평균 절대 오차): {mae:.2f}")
print(f"MSE (평균 제곱 오차): {mse:.2f}")
print(f"RMSE (평균 제곱근 오차): {rmse:.2f}")
print(f"R² 스코어: {r2:.4f}")
# 해석: MAE가 10이라면 평균적으로 10만큼 틀림
# R²가 0.98이라면 모델이 데이터를 98% 설명함
회의 후 팀장님이 김개발 씨를 따로 불렀습니다. "임원들에게 보고할 때는 구체적인 숫자로 말해야 합니다.
평가 지표를 제대로 이해해야 해요." 팀장님이 노트북을 열어 설명을 시작했습니다. "회귀 모델의 성능을 측정하는 방법은 여러 가지가 있어요.
가장 흔한 것들을 알아봅시다." 쉽게 비유하자면, 평가 지표는 마치 학생의 성적표와 같습니다. 평균 점수만 봐도 되고, 표준편차를 봐도 되고, 등수를 봐도 됩니다.
각각 다른 측면을 보여줍니다. 첫 번째는 **MAE(Mean Absolute Error)**입니다.
한국어로는 평균 절대 오차입니다. 예측값과 실제값의 차이를 절댓값으로 만들어서 평균 낸 것입니다.
"MAE가 10이라는 건 평균적으로 10만큼 틀린다는 뜻입니다." 팀장님이 설명했습니다. "주택 가격이라면 평균적으로 1,000만 원씩 틀린다는 거죠." MAE의 장점은 해석이 직관적이라는 것입니다.
단위가 원래 데이터와 같아서 이해하기 쉽습니다. 두 번째는 **MSE(Mean Squared Error)**입니다.
평균 제곱 오차입니다. 오차를 제곱해서 평균을 냅니다.
"왜 제곱을 하냐고요? 큰 오차에 더 큰 벌점을 주기 위해서예요." 팀장님이 예시를 들었습니다.
"10만 원 틀린 것 1번보다 20만 원 틀린 것 1번이 더 나쁩니다. 제곱하면 이 차이가 더 크게 나타나죠." MSE의 단점은 단위가 제곱이 되어 해석이 어렵다는 것입니다.
가격을 예측하면 MSE의 단위는 "원의 제곱"이 됩니다. 직관적이지 않습니다.
세 번째는 **RMSE(Root Mean Squared Error)**입니다. MSE에 루트를 씌운 것입니다.
이렇게 하면 단위가 원래대로 돌아옵니다. "RMSE는 MSE의 장점을 유지하면서 해석하기도 쉽게 만든 거예요." 팀장님이 강조했습니다.
실무에서는 RMSE를 가장 많이 씁니다. MAE보다 큰 오차를 더 민감하게 포착하고, MSE보다 해석이 쉽기 때문입니다.
마지막은 R² 스코어입니다. 결정계수라고도 부릅니다.
0에서 1 사이의 값을 가지며, 1에 가까울수록 좋습니다. "R²는 '모델이 데이터를 얼마나 잘 설명하는가'를 나타냅니다." 팀장님이 설명했습니다.
R²가 0.95라면 모델이 데이터의 변동성을 95% 설명한다는 뜻입니다. 매우 좋은 모델입니다.
반대로 R²가 0.3이라면 겨우 30%만 설명하는 것이므로 별로 좋지 않습니다. 위의 코드를 함께 봅시다.
실제값과 예측값을 비교해서 네 가지 지표를 모두 계산했습니다. MAE는 약 8입니다.
평균적으로 8 정도 차이가 난다는 뜻입니다. MSE는 약 66입니다.
오차를 제곱했으므로 값이 커졌습니다. RMSE는 약 8.1입니다.
MAE와 비슷하지만 큰 오차에 더 민감합니다. R² 스코어는 약 0.98입니다.
거의 완벽에 가까운 모델입니다. 데이터의 98%를 설명하고 있습니다.
김개발 씨가 질문했습니다. "그럼 어떤 지표를 써야 하나요?" 팀장님이 답했습니다.
"상황에 따라 다릅니다. 보통은 RMSE와 R²를 함께 보고하는 게 좋아요.
RMSE로 오차의 크기를 보고, R²로 전반적인 성능을 보는 거죠." 실무에서는 도메인 지식도 중요합니다. 주택 가격 예측이라면 1,000만 원 오차가 괜찮은지, 의료 데이터라면 작은 오차도 치명적인지 판단해야 합니다.
"다음 보고 때는 이렇게 말해보세요. '저희 모델의 RMSE는 500만 원이고 R² 스코어는 0.92입니다.
데이터의 92%를 설명하는 우수한 모델입니다.'" 팀장님이 조언했습니다. 김개발 씨가 고개를 끄덕이며 메모했습니다.
이제 모델의 성능을 정량적으로 평가하고 보고할 수 있게 되었습니다.
실전 팁
💡 - RMSE와 R² 스코어를 함께 보고하는 것이 가장 일반적입니다
- MAE는 이상치에 덜 민감하고, RMSE는 이상치에 더 민감합니다
- R²는 0에서 1 사이이며, 0.7 이상이면 괜찮은 모델로 봅니다
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.