CS Repository/기초 통계학

[개발자를 위한 필수 수학] 선형회귀

조금씩 차근차근 2025. 7. 31. 23:47

본 내용은 “개발자를 위한 필수 수학” 도서를 참고하여 작성되었습니다.

 

개발자를 위한 필수 수학 - 예스24

개발자를 구원하는 실용 수학 안내서기초 수학부터 회귀 모델, 신경망 그리고 진로 조언까지 데이터 과학, 머신러닝, 통계학에서 탁월한 능력을 발휘하는 데 필요한 수학을 이해하고 여러분의

www.yes24.com

 

머신러닝의 분류

머신러닝은 크게 분류하면 다음과 같이 정리할 수 있다.

  • 지도 학습
    • 정해진 목표가 존재하는 레이블을 보고 학습하는 계열의 학습을 의미한다.
    • 주로 회귀 작업, 분류 작업을 지도 학습으로 만들어낸다.
  • 비지도/준지도 학습
    • 정답/정해진 목표가 없는 데이터로부터 숨겨진 구조/분포/표현을 스스로 찾아내는 학습 방식이다.
    • 주로 군집화(clustering), 이상치 탐지(anomaly detection)에 활용되며, 외부 도메인 전문가의 평가/샘플링의 검토가 동반되어야 한다.
  • 강화 학습
    • 정적인 보상이 주어지는 상황에서 장기적인 관점에서의 최적의 정책을 직접 구성하는 학습을 의미한다.
    • 주로 합성 데이터를 빠르게 생성하는 시뮬레이션을 지도 학습과 결합하여 구성한다.

주로 이렇게 분류되곤 하지만, 신경망/역전파/경사 하강법/훈련-테스트 분할 등 모두가 사용하는 도구는 어느정도 공유되는 경향이 강하다.
그러므로 지금부터는 “선형 회귀”를 학습하며 머신러닝의 기본 원리를 차근차근 이해해보자.

회귀와 선형 회귀

회귀란, 관측 데이터에서 어떤 함수를 훈련한 다음 새로운 데이터에 대한 예측을 만드는 방법을 의미한다.

지도학습은 크게 회귀 모델과 분류 모델로 구분되며, 다음과 같이 정의할 수 있다.

  • 회귀
    • 임의의 실숫값을 예측하는 것
  • 분류
    • 범주 중 하나를 예측하는 것

선형 회귀란, 관측 데이터에 맞는 선형 함수를 구성하는 직선을 추론하는 것을 의미한다.
달리 말하면, 관측 데이터에 맞는 직선을 훈련하는 것을 의미한다.

참고) 회귀가 머신러닝인가?

이에 대해서는 통계학자와 데이터 과학자 간의 관점의 차이가 존재한다.

  • 통계학자 관점
    • 이들은 회귀 모델을 통계적 학습이라 부른다.
    • 이들은 “통계적 유의성”에 집중한다.
      • 예측 구간(prediction interval)
      • 상관관계(correlation)
  • 데이터 과학자/머신러닝 전문가 관점
    • 이들은 회귀 모델도 머신러닝이라고 본다.
    • 이들은 “모델 검증”에 집중한다.
      • 훈련 세트와 테스트 세트 분할
      • 모델 검증 방식

기본 선형 회귀

직접 학습해보기

“강아지의 나이와 동물병원 방문 횟수 사이의 관계 연구”데이터를 이용해,

  1. 직선을 만들고
  2. 해당 직선을 평가한 뒤,
  3. 이전에 본 적 없는 데이터를 예측

하는 형태의 선형 회귀를 시도해보자.

  • 데이터

  • 학습 결과

다음과 같이 주어진 데이터에 맞는 직선을 구할 수 있었다.

하지만, 위 그래프에서 보이듯 직선과 실제 데이터 간에는 약간의 오차가 존재하고 있다.
또한, 선형 회귀로 가지고 있는 데이터셋의 범위를 벗어나서 예측을 수행할 경우, 이는 올바른 예측을 보장하지 않는다.

그렇기에 선형 회귀의 신뢰도를 아래 도구를 이용해 수학적으로 다뤄야 한다.

  • p값
  • 통계적 유의성
  • 예측 구간

아무튼, 선형 회귀를 구현한 라이브러리를 이용해 적절한 기울기와 상수를 학습했다.
이 잘 맞는 직선은 어떻게 결정된걸까?


잔차와 제곱 오차

최적을 정의하는 기준은 무엇인가?

머신러닝에서 최적은 “손실 함수(loss function, 비용 함수 - cost function 이라고도 불림)” 의 최솟값을 최적의 값으로 정의한다.

선형회귀에서는 "잔차(residual)의 제곱 합”이라는 잘 정의된 손실 함수가 존재하니, 이를 최소화하는 방식으로 최적의 직선을 찾아보자.

잔차란?

  • y축 기준 직선과 포인트 사이의 차이
  • 데이터를 예측하는 데 직선이 얼마나 틀렸는지를 나타낸다
  • 오차라고도 불린다.

최적에 도달하려면 어떻게 해야 하는가?

위에서 설명했듯이, 잔차를 최소화 해보자. 그렇다면 총 잔차는 어떻게 정의할 것인가?
다음과 같은 세가지 방식을 고려할 수 있겠다.

  • 단순 더하기
    • 음수와 양수가 함께 더해져, 올바른 최솟값을 찾기 어렵다.
  • 절댓값 씌우기
    • 경사 하강법에서 미분을 사용하는데, 절댓값을 사용하면 미분 불가능 지점이 발생하게 된다.
    • 경사 하강법과 잘 맞지 않는다.
  • 제곱 오차 합 사용하기
    • 잔차를 제곱하고, 그 제곱의 합을 더하자.
    • 미분과도 잘 맞고, 최솟값을 찾을 수도 있다.

최적의 직선 찾기

최소 제곱 합을 찾는 m과 b를 찾는 방법으로는 뭐가 좋을까? 단순 브루트 포스로 하기에는 시간복잡도가 너무 크다.

그래서 수학자, 통계학자, 머신러닝 전문가들은 다음 네가지 방법을 정의했다.

  • 닫힌 형식 방정식
  • 역행렬 기법
  • 행렬 분해 기법
  • 경사 하강법

각각이 어떤 것인지 알아보자.

닫힌 형식 방정식

  • 정확한 계산으로 선형 회귀를 풀 수 있는 방법
  • 단, 입력 변수가 하나인 단순 선형 회귀의 경우에만 가능하다.
    • 시간복잡도가 x가 많아질수록 기하급수적으로 커진다.
  • 공식

  • 적용

역행렬 기법

  • 주어진 식을 역행렬을 이용해 푸는 방법
    • 선형 회귀가 일차 결합을 만족시킬 수 있기 때문에 수행하는 방법이다.
  • 적용

행렬 분해 기법

  • 위에서 설명한 역행렬 기법을 그대로 적용하면, 다양한 소수점 연산이 연쇄되어 부동소수점 오차가 증폭될 가능성이 있다.
  • 부동소수점 오차의 영향을 줄이기 위해 QR 분해를 사용하는 방식이다.

 


경사 하강법

이제 머신 러닝에서 가장 많이, 그리고 자주 사용되는 경사 하강법에 대해 알아보자.

경사 하강법이란?

미분과 반복을 사용해 목적 함수에 대한 파라미터 집합을 최소화/최대화하는 최적화 기법

y=x^2 손실함수 그래프에서 최솟값을 찾는 사고 실험을 통해 상상해보자.

  • 방향 관점
    • 기울기가 양수라면, 양수만큼 빼면(뺄셈) 최솟값을 찾아갈 수 있다.
    • 기울기가 음수라면, 음수만큼 빼면(덧셈) 최솟값을 찾아갈 수 있다.
  • 거리 관점
    • 이때, 기울기가 높을 수록 더 많이 이동해야 하고
    • 기울기가 낮을수록(최솟값에 가까울 수록) 조금만 이동해야 할 것이다.

즉, 경사 하강법은 적절한 방향과, 적절한 보폭을 찾는 최적화 방법이다.

그래프를 보며 최솟값을 찾는다고 생각해보자.

예시 - y=(x-3)^2 + 4의 최솟값 찾기

현재 기울기가 3이라고 생각해보자. 3만큼 빼서, 좀 더 최솟값에 가까워질 수 있을 것이다.

x의 이동 후, 해당 지점의 기울기는 1이 되었다고 가정해보자. 최솟값에 가까워진 만큼, 더욱 조금 이동할 것이다.

마침내 최솟값에 도달한 순간, 기울기는 0이 되고 더이상 x는 이동하지 않을 것이다.

코드로 표현하면 다음과 같다.

선형 회귀에서의 경사 하강법(gradient descent)

위에서 x에 적용하던걸 m과 b로 만든 손실 함수 e(x)에 적용하면, 선형 회귀에서 경사 하강법을 사용할 수 있게 된다.

위에서 설명했듯이, 제곱 합 함수를 손실함수로 사용하고 만들어보자.

손실 함수와 그라디언트의 정의
심파이를 이용해 선형 회귀 풀기
선형회귀의 손실 함수를 그래프로 표현하면 다음과 같다. m과 b 2개의 매개변수를 통해 3차원 평면을 그리는 것을 확인할 수 있다.

과대적합 및 분산

여기서 드는 의문점이 하나 들 수 있다.
선형 회귀 모델을 그릴 때, 왜 이렇게 곡선을 그리지 않는걸까?

이 문제를 이해하기 위해선 오버피팅 개념이 필요하다.

오버피팅 - 머신러닝 모델에 편향을 추가하는 이유

“오버피팅(overfitting, 과대적합)”이란 훈련 데이터에 대해서만 정답을 제시하고, 새로운 데이터에 대해선 오히려 안좋은 예측값을 내놓는 문제를 의미한다.

  • 비유하자면, 모델이 학습 데이터를 “암기”했다고 이해하는 것이 좋다.

이 문제를 해결하기 위해, 머신러닝에선 의도적인 편향을 주어 일관된 예측을 수행하도록 만든다.

  • 머신러닝의 편향이란?
    • 여기서 말하는 편향은 데이터의 편향과는 다르다.
    • 데이터의 내용을 정확히 맞추는 대신, 특정 방법(예: 직선 유지)에 우선순위를 두는 것

훈련 데이터의 손실을 최소화하는 것보다, 약간의 여지를 남겨 새로운 데이터에서의 손실을 최소화하는 것이 좀 더 양질의 예측 결과를 가져올 수 있다는 판단 하에 오버피팅을 막는 것이다.

확률적 경사 하강법(stochastic gradient descent)

실제로는 모든 데이터를 전부 경사 하강법에 사용하지는 않는다.

모든 데이터를 전부 경사 하강법에 사용하는 것을 batch gradient descent라고 한다.

 

실제로는 각 반복마다 데이터셋에 있는 표본 하나만 사용해 훈련한다.
이를 확률적 경사 하강법 (stochastic gradient descent) 라고 한다.

 

대표적인 stochastic gradient descent의 예시로는 미니-배치 경사 하강법이 있다.

  • mini-batch gradient descent
    • 10개~100개의 표본을 사용하여 경사 하강법 학습을 수행하는 것

stochastic gradient descent의 장점

  • 계산량의 감소
    • 각 반복이 전체 훈련 데이터셋을 처리할 필요가 없어진다.
  • 과대적합 감소
    • 손실 지형이 계속 바뀌므로 최솟값에 안주하지 않게 된다.

예제

  • 학습률(L): 경사 하강법 시 사용되는 그라디언트와 곱해지는 배수. x가 이동하는 거리를 결정하며, 적절한 학습률을 찾아야 지역 최솟값에 빠지지 않을 수 있다.
    • 학습률이 지나치게 커지면 보폭이 지나치게 커져 정확한 최솟값을 찾기 어려워진다.
    • 학습률이 지나치게 작아지면 보폭이 지나치게 작아저 계산하는데 필요한 연산량이 많아진다.
  • epoch: 학습을 반복할 횟수.
    • 에포크가 지나치게 크면 학습 데이터에 지나치게 맞추는 오버피팅 문제가 발생할 수 있다.
    • 에포크가 지나치게 낮으면 충분한 학습이 이루어지지 않아 예측의 품질이 떨어지는 언더피팅 문제가 발생할 수 있다.

지금부턴 수학/통계학 관점에서의 선형회귀를 해석하기 위한 방식에 대해 이해해보자.

상관 계수

데이터의 분산이 크면, 예측의 정확도와 유용성이 떨어질 정도로 잔차가 증가한다.

이 문제를 선형회귀와 같은 (머신러닝에서의)편향이 많은 모델에 적용 시, 분산이 크면 과소적합(underfitting) 문제가 발생한다.

주어진 데이터가 선형회귀에 잘 어울리는지 판단하는 방법은 뭐가 있을까?
이 역할을 수행하는 것이 “상관계수”이다.

상관 계수(correlation coefficient)란?

상관계수는 두 변수 사이의 관계 강도를 [-1, 1] 내의 값으로 측정한 것이다.

  • 1에 가까울수록 비례 관계
  • 1에 가까울수록 반비례 관계
  • 0에 가까울수록 관계 없음

상관계수의 절댓값이 클수록 선형 회귀가 잘 맞는다.

상관계수 계산 방법

  • 판다스의 corr() 함수 - 상관 행렬

  • 실제 수식

통계적 유의성

선형 회귀에서 고려해야 할 또 다른 측면으로는 “데이터에 있는 상관관계가 우연인가?” 라는 질문을 들 수 있다.

상관관계의 절댓값이 1에 가까이 나왔어도, 해당 데이터가 우연히 샘플링 편향으로 인해 발생하지 않았다는 증명이 필요하지 않겠는가?

이를 p-value를 이용해서 증명해보자.

참고

  • 일반적인 머신러닝 라이브러리는 통계적 유의성 및 신뢰 구간을 위한 도구를 제공하지 않는다.
  • 통계적 유의성을 적용하고 싶다면 statsmodel 라이브러리를 기억해두자.

 

두 변수 간의 상관관계가 우연이 아니라 유의미하다고 어떻게 확신해야 하나? 95%정도 확신한다고 하면, 가설 검정 문제가 된다.

먼저 현재 주어진 데이터를 이해해보자.

  • 현재 주어진 데이터
    • 표본이 10개
      • t 분포 사용하기
    • 상관계수 0.957586
      • 위에서 구함
    • 자유도 10 - 1 = 9

테스트 값을 t-분포로 치환했을 때, 이 범위를 벗어나면 귀무가설 거부가 가능하다.

테스트 값을 t-분포 값으로 바꾸는 공식은 다음과 같다.

  • r=상관계수
  • n=표본 크기

상관관계가 있음을 입증 가능하다.

결정 계수

결정 계수는 한 변수의 변동이 다른 변수의 변동으로 얼마나 설명 가능한지를 측정하는 지표로, 상관 계수의 제곱으로 구한다.

상관 계수의 절댓값이 1에 가까워질수록, 결정 계수가 1에 가까워진다.

  • x의 변동 중 91.6971%가 y에 의해 설명된다.
  • 나머지 8.3029%는 포착되지 않은 다른 변수로 인한 노이즈로 해석한다.

주의 - 상관관계는 인과관계가 아니다!

머신러닝은 인과관계를 유추하지 못한다. 인과관계를 유추하기 위해 사람이 필요한 것이다.

  • 컴퓨터 비전 시스템에서 소의 사진을 이용해 소를 인식하도록 하면 소가 아닌 들판과 쉽게 상관관계가 만들어진다.
  • 따라서 빈 들판의 사진을 보여주면 풀을 소로 인식할수도 있다.

추정 표준 오차

우리는 선형 회귀의 손실 함수로 제곱 오차 합(Sum of Squared Error, SSE)를 사용했다.

표기되는 방식만 다를 뿐, 위에서 설명한 선형 회귀용 제곱 오차 합의 일반화된 형식이다

추정 표준 오차란?

추정 표준 오차란 제곱 오차 합이 제곱되어 직관적으로 이해하기 어려운 부분을 해결하기 위해 사용하는 값으로, 선형 회귀에 대한 표준 편차를 나타낸다.

단순 선형 회귀에서는 변수가 하나가 아니라 두 개이기 때문에, 자유도에서 불확실성을 하나 더 증가시켜야 한다.

  • 예제의 추정 표준 편차를 구하는 코드

예측 구간

통계학적 관점으로 선형 회귀를 확장헤보자.

  1. 선형 회귀의 데이터는 모집단의 한 표본이다.
  2. 따라서 회귀 분석은 딱 표본만큼만 정확하다.
  3. 또한 선형회귀에는 이를 따르는 정규분포가 있다.
  4. 따라서 예측된 각 Y값은 평균과 마찬가지로 표본통계가 된다.

실제로도, 평균은 직선을 따라 이동한다.

위와 같이, 회귀 직선은 종 곡선의 변화하는 '평균'역할을 수행한다.

 

예측 구간이란?

위에서 설명했듯이, 각각의 y 예측 주위에 신뢰 구간이 있다. 선형 회귀 직선을 따르는 정규 분포가 있는 경우, 하나의 변수뿐만 아니라 분포를 조정하는 두 번째 변수도 있다.

이를 '예측 구간(prediction interval)'이라고 한다.

식의 유도과정을 완벽히 이해하지 못해, 관련 링크를 첨부합니다.


훈련/테스트 분할

안타깝게도 머신러닝 실무자가 항상 상관 계수, 통계적 유의성과 결정 계수를 사용해 분석하기에는 힘들다.
때때로 다루어야 할 데이터가 너무 많기 때문에 시간이나 자원이 부족하다.
그래서 많은 데이터 과학자들은 통계 지표들을 잘 배우지 않는 경우가 많다.

  • 머신러닝에는 통계적 접근 방법이 잘 적용되지 않는다.
    • 고차원 데이터에 대해서 신뢰구간과 p값이 잘 적용되지 않는 문제가 있다.
    • 따라서 사이킷런과 같은 머신러닝 라이브러리에는 p값과 신뢰구간 개념을 적용하지 않는 경우가 많다.

흡사, 통계적 회귀 방법은 섬세한 수술용 메스이고, 머신러닝은 전기톱과 같다.

  • 방대한 양의 데이터와 변수로 작업할 때는, 메스보단 전기톱이 낫다.
  • 소수의 데이터로 정확한 답을 내야 할 땐, 메스로 작업하는게 좋다.

그렇다면, 전기톱(머신러닝)을 위한 검증 수단은 무엇이 있는가?

이것이 바로 훈련/테스트 분할 기법이다.

정의

훈련/테스트 분할이란, 훈련용 데이터와 테스트용 데이터를 분리하여 사용하는 것을 의미한다.

k-fold 교차 검증

  • 데이터셋을 k개로 나누고, 순서대로 테스트 데이터셋으로 사용하는 방식
  • 교차 검증에서 각 분할을 fold라고 부른다.

결론 - 다변수 선형 회귀로의 확장

모델이 변수로 넘쳐나 설명력을 잃기 시작하면 불안정해진다.
이때부터 머신러닝 관행에 따라 모델을 블랙박스로 취급하기 시작한다.

  • 통계적 우려는 사라지지 않고, 변수를 추가할수록 데이터는 점점 더 sparse해진다.

그래도 상관 행렬로 각 변수 간의 관계를 분석하고 어떻게 상호작용하는지 이해한다면, 생산적인 머신러닝 모델을 만들 수 있다.