ML | DL/혼자공부하는머신러닝딥러닝

6강. 회귀 문제를 이해하고 k-최근접 이웃 알고리즘으로 풀어 보기

묘걍 2023. 11. 15. 20:10

03-1. k- 최근접 이웃 회귀

* 25cm, 150g짜리 생선 = 도미인데 빙어로 분류됨

* kneighbors()를 통해 이상한 도미의 최근접 이웃을 찾아봄 → 하나만 도미, 나머지는 빙어

* 이유는 x축과 y축의 스케일이 달라서!!!

* 조정후 살펴보니 x축으로는 데이터가 퍼지지 않고 y축을 따라서 데이터가 분포되어 있다 → 무게 특성이 영향을 많이 준다는 것

* 특성의 스케일을 맞춰줘야 특정 특성에 알고리즘이 좌지우지 되지 않는다

* 데이터전처리 - 스케일 조정 中 표준점수 (z점수)

* 테스트할 데이터도 훈련세트의 평균과 표준편차를 이용해 표준 점수를 구해야 한다

* 거리에 민감한 알고리즘: k-최근접 이웃, 회귀 알고리즘들, 딥러닝 알고리즘들 / 전처리 필수!!!

* 트리기반 알고리즘은 거리에 상관 없이 사용할 수 있다.


👉🏻 농어의 무게를 예측하라

출처: 혼공머딥 유튜브

🧩 회귀 (regression)

더보기

1. 회귀의 기본 아이디어:

  • 목표: 주어진 입력 데이터에 대해 연속적인 값을 예측하는 것.
  • 예시: 집 크기, 날씨, 시간 등과 같은 여러 입력 특징을 사용하여 주택 가격을 예측하는 것.

2. 주요 용어:

  • 입력 데이터 (Features 또는 X): 예측을 위해 사용되는 정보. 집 크기, 방의 수, 위치 등.
  • 타겟 변수 (Target 또는 Y): 예측하려는 실제 값. 주택 가격 등.
  • 가중치 (Weights) 및 편향 (Bias): 모델이 학습하는 매개변수. 입력과 결과 사이의 관계를 나타냄.

3. 모델의 형태:

  • 선형 회귀: 입력 특징과 가중치의 선형 조합으로 예측을 수행.
    • 예시:
  • 비선형 회귀: 선형이 아닌 모델을 사용하여 더 복잡한 관계를 모델링.

 

4. 학습 과정:

  • 손실 함수 (Loss Function): 예측값과 실제값의 차이를 측정하는 함수.
  • 경사 하강법 (Gradient Descent): 손실을 최소화하기 위해 가중치 및 편향을 조정하는 최적화 알고리즘.
  • 에포크 (Epoch): 전체 데이터셋에 대한 한 번의 학습 주기.
  • 배치 (Batch): 각 에포크에서 사용되는 데이터 그룹.

5. 평가:

  • 평가 지표: 회귀 모델의 성능을 측정하기 위한 지표.
    • 예시: 평균 제곱 오차 (Mean Squared Error), 평균 절대 오차 (Mean Absolute Error).

간단한 예시:

  • 입력 데이터: 주택 크기, 방의 수.
  • 타겟 변수: 주택 가격.
  • 모델: 
  • 학습: 경사 하강법을 사용하여 손실을 최소화하는 가중치와 편향을 찾음.

결론:

회귀는 입력과 출력 간의 관계를 모델링하여 주어진 입력에 대한 연속적인 값을 예측하는 머신 러닝의 기법입니다. 이는 주로 수치적인 예측 문제에서 활용되며, 선형 또는 비선형 모델을 사용하여 학습됩니다. 학습은 주어진 데이터에서 손실을 최소화하도록 모델의 매개변수를 조정하는 과정을 포함합니다.

- 임의의 숫자를 예측 (종류 구분X)

- 여기서는 무게 (임의의 '실수')

- target = 임의의 숫자

     - 0이나 1로 표현되는 값이 아닌, 실제 어떤 값

- target을 따로 만들 필요가 없음

- 훈련데이터 중 하나가 타깃 값이 되는 경우가 많다

더보기

일반적으로 회귀 문제에서는 행이 샘플을 나타내고, 각 샘플의 특징(feature)들이 열로 표현됩니다. 타겟값(target)은 각 샘플에 대한 실제 예측하려는 출력값을 나타내는 것이므로, 보통 행이 아닌 열 중에 위치합니다. 즉, 훈련 데이터는 특징들과 그에 해당하는 타겟값으로 이루어진 열로 구성되어 있습니다.

이진 분류 문제에서도 마찬가지로 행이 샘플을 나타내고, 각 샘플의 특징들이 열로 나타납니다. 하지만 이진 분류에서는 각 샘플의 타겟값이 두 가지 클래스 중 하나를 나타내므로, 타겟값은 하나의 열로 표현됩니다. 이 경우에도 행은 샘플을, 열은 특징 및 타겟값을 나타냅니다.

따라서 회귀와 이진 분류 문제에서 모두 행은 샘플을 나타내고, 열은 특징 및 타겟값을 나타냅니다.

⏪이진 분류

- 양성 target: 1

- 음성 target: 0

- (가상으로) target 값을 만들어둠

✅ 프랜시스 골턴

- 키가 큰 사람의 아이가 평균 키로 회귀한다고 밝힌 논문에서부터 시작

더보기

프랜시스 갈턴(Francis Galton)은 19세기 말에 살았던 영국의 과학자로, 통계학자, 지질학자, 생물학자, 인류학자 등 다양한 분야에서 활동한 다재다능한 인물입니다. 그는 유전학 분야에서의 기여로도 잘 알려져 있습니다.

갈턴은 1886년에 "Regression towards Mediocrity in Hereditary Stature"라는 논문에서 회귀(Regression)라는 용어를 처음 도입했습니다. 이 논문에서 그는 부모의 키와 자식의 키 간의 관계를 연구하면서 특정 현상이 평균으로 되돌아가려는 경향을 발견했고, 이러한 경향을 회귀라는 용어로 명명했습니다.

회귀(Regression)의 기본 아이디어:

회귀는 통계학과 머신 러닝에서 사용되는 중요한 개념 중 하나로, 입력 변수와 출력 변수 간의 관계를 모델링하는 데 사용됩니다. 갈턴의 연구는 특히 한 변수의 값이 다른 변수와의 관계에서 어떻게 변하는지를 이해하려는 시도에서 출발했습니다.

회귀의 주요 특징:

  1. 평균으로의 회귀: 갈턴은 부모의 키와 자식의 키를 조사하면서, 특이적으로 크거나 작은 부모의 자식이 더 평균적인 키를 가질 가능성이 높다는 경향을 발견했습니다. 이를 "평균으로의 회귀"라고 부릅니다.
  2. 통계적 회귀 모델: 회귀는 이후 통계학에서 발전하여 다양한 회귀 모델이 등장했습니다. 선형 회귀부터 비선형 회귀까지 다양한 모델이 사용되며, 회귀 분석은 데이터의 패턴을 파악하고 예측하는 데에 중요한 역할을 합니다.
  3. 머신 러닝에서의 활용: 회귀는 머신 러닝에서도 많이 사용됩니다. 입력 변수와 출력 변수 간의 관계를 학습하여 새로운 데이터에 대한 예측을 수행하는 모델을 만들기 위해 사용됩니다.

프랜시스 갈턴의 회귀 연구는 현대 통계학과 머신 러닝에서 사용되는 회귀 분석의 출발점 중 하나이며, 입력과 출력 간의 관계를 이해하고 모델링하는 데에 큰 영향을 미쳤습니다.

- Regression toward the mean

✅ 지도학습

  1. 분류
  2. 회귀

👉🏻 k - 최근접 이웃 회귀

출처: 혼공머딥 유튜브

🧩 k - 최근접 이웃 분류

- x 데이터 주위에 ■ 2개 ● 1개

- 그러므로 x의 클래스는 ■

- 이웃한 클래스의 다수 클래스 사용

🧩 k - 최근접 이웃 회귀

- 가까운 이웃을 찾는 것 까지는 동일

- 이웃한 샘플의 target값을 평균낸다

- x 샘플의 target값은 평균인 80이 된다

- 이웃한 클래스의 target의 평균

👉🏻 농어 길이만 사용

https://gist.github.com/rickiepark/2cd82455e985001542047d7d55d50630

 

농어의 길이와 무게 데이터

농어의 길이와 무게 데이터. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

- length와 weight를 x, y축에

- perch_weight가 target 데이터 (우리가 예측하고자 하는 대상값)

✅ 분류

- 2개의 특성을 활용

     - 각각 x축과 y축에

- 클래스 활용

✅ 회귀

- 클래스 표현 불가

- 타겟이 임의의 숫자

- 임의의 숫자는 어떤 축에 표현을 해야 한다

- 특성을 두 개 사용해버리면 3차원 그래프를 그려야해서 복잡

     - 교육 단계에서는 특성을 하나만 활용

     - 특성 여러 개 해도 됨

- length가 증가함에 따라 weight가 증가하고 있다

👉🏻 훈련 세트 준비

✅ stratify 매개변수

  • 클래스별로 골고루 train set과 test set을 나누기 위해 여기에 target값을 넣어줫었다
  • 회귀 문제라서 사용하지 않음
  • 임의의 숫자가 target이 되기 때문에 이 매개변수를 사용하지 않고 그냥 랜덤하게 섞음
  • 기본 값이 false이기 때문에 따로 지정하지 않으면 적용되지 않는다

🧩 reshape()

더보기

numpyreshape() 메서드는 배열의 모양을 변경하는 데 사용되는 함수입니다. 이 메서드를 사용하면 기존 배열의 요소 수는 동일하지만 배열의 차원이나 모양을 다르게 조정할 수 있습니다. 예를 들어, 1차원 배열을 2차원 배열로 변경하거나, 행과 열의 수를 조정할 수 있습니다.

- perch_length이 길이 특성 하나만 사용하는 1차원 배열

- 이 것을 train_test_split에 넣으면 결과로 나온 train_input과 test_input도 1차원 배열이 된다

- 사이킷 런의 모델들은 입력 데이터가 2차원 데이터일 것이라고 기대

출처: 혼공머딥 유튜브

- train_input고 test_input이 1차원이기 때문에 이것을 2차원으로 만드는 과정이 필요

출처: 혼공머딥 유튜브

- 이 때 사용하는 것이 reshape() 메서드

  • 첫 번째 행 차원을 -1로 지정
    • 나머지 차원이 다 결정되고 남은 차원을 사용하겠다
    • 남은건 나에게 다 할당해라
더보기
  1. reshape(-1, 1)에서 -1은 해당 차원의 크기를 자동으로 계산하라는 의미입니다. 여기서는 행 차원을 -1로 두었으므로 NumPy는 나머지 차원을 자동으로 계산하여 원래 배열의 총 요소 수를 유지하도록 합니다.
  2. 1은 두 번째 차원을 1로 만든다는 것을 의미합니다. 즉, 각 행이 하나의 열 값을 갖는 2차원 배열을 생성하게 됩니다.

reshape(-1, 1): 이는 입력 데이터를 2D 배열로 변경하는데 사용됩니다. -1은 해당 차원의 크기를 자동으로 계산하라는 의미입니다. 여기서는 행 차원을 -1로 두어 나머지 차원을 자동으로 설정하게 됩니다. 각각의 원소가 하나의 열 값을 갖는 2D 배열을 생성하게 됩니다.


예시로 `[8.4, 13.7, 15.0, 16.2, 17.4]`와 같은 1차원 배열을 가정해 봅시다. 이 배열을 2차원 배열로 변경하고자 할 때 `reshape(-1, 1)`을 사용하면, 행의 크기를 1로 설정하고 열의 크기를 자동으로 계산합니다. 결과적으로 각 원소가 하나의 열 값을 갖는 2차원 배열이 생성됩니다.

perch_length = np.array([8.4, 13.7, 15.0, 16.2, 17.4])
perch_length_reshaped = perch_length.reshape(-1, 1)



여기서 `-1`은 남은 차원의 크기를 자동으로 계산하라는 의미입니다. 원래 배열의 크기가 5이므로, NumPy는 행의 크기를 1로, 열의 크기를 5로 설정하여 2차원 배열을 생성합니다. 결과적으로 2차원 배열은 다음과 같습니다:

[[ 8.4]
 [13.7]
 [15.0]
 [16.2]
 [17.4]]



즉, "남은 차원을 자동으로 계산하라"는 것은 해당 차원의 크기를 다른 차원의 크기를 기반으로 자동으로 설정하라는 의미입니다. 배열의 총 요소 수는 변하지 않고, 단지 배열의 구조를 변경하는 것입니다. 

  • 두 번째 차원을 1로 지정
    • 하나의 열이 있는 2차원 배열이 만들어짐

- 두 번째 차원이 1이라서 전체 샘플 길이를 그대로 첫 번째 차원에 사용하기 때문에 원소 갯수는 변하지 않고 형태만 바꿀 수 있다

출처: 혼공머딥 유튜브

- 크기가 3인 1차원 배열

- 열이 하나이고 행방향은 남은 차원계수(=원소 개수)를? 다 사용하겠다

 

- 일반적으로 사이킷 런에서 target 데이터는 1차원 배열 (2차원으로 바꾸지 않음)

- 훈련 데이터만 특성이 열 방향으로 있어야 하기 때문에 2차원으로 만듬

👉🏻 회귀 모델 훈련

- 사이킷 런의 neighbors 모듈 밑에 KNeighborsRegressor 클래스에 구현되어 있다

     - 분류: Classifier / 회귀: Regressor

- 클래스 객체 생성

- train_input과 train_target을 전달해서 훈련함

- test_input과 test_target을 전달해서 평가함

🧩 결정계수 (R²)

출처: 혼공머딥 유튜브

  • 각 샘플마다 test_target에서 test_input으로 예측한 값을 빼주고, 제곱해서 더함
  • 각 샘플마다 test_target에서 test_target의 평균 값을 빼주고, 제곱해서 더함
  • 위 결과를 나눔
  • 1에서 나눈 값을 뺀 것이 결정 계수

👎🏻 0에 가까울 수록 좋지 않은 회귀 모델

- 예측이 타깃의 평균 정도라면 (예측이 타깃의 평균 정도만 예측한다면)

- 분모와 분자가 비슷해짐

- 우측 항이 1에 가까워짐

- R²는 0에 가까워짐

👍🏻 1에 가까울 수록 좋은 회귀 모델

- 예측이 타깃을 정확히 맞춘다면

- 분자가 0에 가까워져

- 우측 항이 0에 가까워지고

- R²가 1에 가까워짐

더보기

머신러닝에서의 결정계수(R-squared 또는 R²)는 모델이 주어진 데이터를 얼마나 잘 설명하는지를 나타내는 지표 중 하나입니다. 결정계수는 0에서 1 사이의 값을 가지며, 1에 가까울수록 모델이 데이터를 더 잘 설명한다고 볼 수 있습니다.

간단하게 설명하면, 결정계수는 종속 변수(예측하려는 값)의 총 변동 중 모델로 설명할 수 있는 비율을 나타냅니다. 총 변동은 데이터 포인트들이 평균 주변에 흩어진 정도를 나타냅니다. 모델이 데이터를 완벽하게 설명한다면 결정계수는 1이 되고, 모델이 아무런 설명력이 없다면 0이 됩니다.

수식적으로는 다음과 같이 표현됩니다:

여기서,

  • 잔차 제곱의 합은 모델이 예측한 값과 실제 값의 차이를 제곱한 것들의 합이며,
  • 총 변동의 합은 실제 값들이 평균 주변에 흩어진 정도를 나타내는 것입니다.

결정계수는 1에서 잔차 제곱의 합을 총 변동의 합으로 나눈 값의 차이를 빼서 계산됩니다.

간단하게 말하면, 결정계수는 모델이 데이터를 얼마나 잘 예측하는지를 나타내는 지표로, 1에 가까울수록 좋은 모델을 의미합니다.

- 평균 절댓값 오차에 넣을 값을 만들기 위해 predict 메서드에 test_input을 넣어 예측값을 만든다

🧩 평균 절댓값 오차

- 또 다른 성능 판단 지표: 평균 제곱근 오차, 평균 절댓값 오차 ... 등

     - 이런 지표들은 sklearn의 metrics 아래 많이 있다

더보기

평균 절대값 오차(Mean Absolute Error, MAE)는 회귀 모델의 성능을 평가하는 지표 중 하나입니다. MAE는 모델이 예측한 값과 실제 값 사이의 차이를 측정합니다.

간단하게 설명하면, MAE는 모델이 각각의 데이터 포인트에 대해 예측한 값과 실제 값의 차이를 모두 절댓값으로 변환하고, 이 차이들의 평균을 계산한 것입니다.

수식적으로 표현하면 다음과 같습니다:

여기서,

간단한 예시를 통해 설명하겠습니다. 가상의 데이터셋이 다음과 같다고 가정해봅시다:

결과적으로 MAE가 2.6이 나옵니다. MAE는 예측 값과 실제 값의 차이를 평균화한 지표로, 값이 작을수록 모델의 예측이 정확하다고 평가됩니다.

  • target값과 test_input으로 예측한 값을 넣어준다
  • 그러면 이 메서드는 두 값의 차이 절댓값 (부호는 상관 X)을 평균 내서 반환해준다

- 농어의 무게를 예측했는데, 19g정도의 오차가 있다 (+19g인지 -19g인지는 중요하지 않음)

 

- 지금까지는 train 세트로 훈련하고 test세트로 평가했음

- 훈련세트도 함께 활용해서 평가하며 인사이트 얻어보기

👉🏻 과대적합과 과소 적합

🧩 과소 적합 (underfitting)

더보기

과소 적합(Underfitting):

  • 설명: 모델이 너무 간단하거나 훈련 데이터를 충분히 학습하지 못해서 새로운 데이터에 대한 예측 성능이 제대로 나오지 않는 상태입니다.
  • 특징:
    • 훈련 데이터와 테스트 데이터 모두에서 성능이 낮음.
    • 모델이 데이터의 복잡성을 충분히 이해하지 못하고 간단한 패턴만 학습한 경우 발생할 수 있음.
  • 해결 방법:
    • 모델의 복잡성을 높이거나, 더 많은 특성을 추가하거나, 더 많은 데이터를 수집하는 등의 방법으로 모델을 더 복잡하게 만들어줌.

학생이 시험 공부를 거의 안 하고 시험에 나가서 낮은 점수를 받는 상황.

- train set을 넣어봄

 

 

- test set을 넣어봄

- 일반적으로는 훈련 점수가 더 높게 나오고 테스트 점수가 더 낮게 나옴

(시험 보기 전에 연습문제 풀었을 때, 연습문제 성적 > 시험성적)

- 잘 준비를 했다면 훈련 세트 점수가 더 높아야하는데 지금 위의 경우는 반대

- 훈련 세트를 적절히 학습하지 못했다

 

🧩 과대 적합 (overfitting)

더보기

과대 적합(Overfitting):

  • 설명: 모델이 훈련 데이터에 너무 맞춰져서 새로운 데이터에 대한 일반화가 어려워지는 상태입니다.
  • 특징:
    • 훈련 데이터에서는 성능이 좋지만, 테스트 데이터에서는 성능이 낮아짐.
    • 모델이 훈련 데이터의 노이즈까지 학습하여 새로운 데이터에 대한 일반화 능력이 감소함.
  • 해결 방법:
    • 더 많은 훈련 데이터를 수집하거나, 모델의 복잡성을 줄이는 등의 방법으로 일반화 성능을 향상시킴.

학생이 과거 시험 문제들만 외우고 실제 시험에 나가서 새로운 유형의 문제를 풀지 못하는 상황.

- 예를 들어 훈련 세트 점수는 0.99정도 되고, 테스트세트 점수는 0.6 정도 되는 경우

- 너무 훈련 세트에만 잘 맞아서 실전에 투입했을 때 형편 없는 모델

- 과적합으로 부르기도 한다

 

- 현재는 과소적합 되어있기 때문에 해결 방법 찾아보기

👉🏻 이웃 개수 줄이기

출처: 혼공머딥 유튜브

- k-최근접 이웃 알고리즘에서

✅ 과소 적합

- 이웃의 개수를 줄이면 과소적합

- 이웃을 전체로 하면 하나의 값만 예측한다?

더보기

이웃 수를 전체 데이터의 수로 설정할 때 (가 전체 데이터의 수일 때):

  • 하나의 값만 예측: 이웃의 수를 전체 데이터의 수로 설정하면 모든 데이터 포인트가 하나의 이웃이 되어, 새로운 데이터에 대한 예측은 훈련 데이터 중에서 가장 많은 클래스나 평균 등으로 이루어집니다. 즉, 모든 예측이 전체 데이터의 평균이나 다수결 투표의 결과로 수렴하게 됩니다.

✅ 과대적합

- 이웃의 개수를  늘리면 과대적합

- 만약 k = 1로 하면 전체 흐름을 따라가지 못하고 가까운 이웃 하나만 따라감

- 기본값 : 5

- 3으로 바꿔 훈련

- 훈련 세트

- 테스트 세트

- 두 값이 너무 동떨어지지 않으면서도 (둘 다 꽤 높은 값을 유지) 훈련 세트가 좀 더 높은 값을 가짐

- 적절한 균형점을 찾았다고 볼 수 있다

🎮 확인 문제 2

강사님 ver(색상 차이)

- 1보다는 3이 좀 덜 들쭉날쭉하고 부드러운 그래프이다

- 극단적으로 42(총 샘플 개수)로 설정해보면 딱 하나의 값만 예측하기 때문에 학습하지 못한 결과가 나온다

 

👉🏻 머신러닝의 알고리즘

🧩 분류

- 정해진 클래스를 예측하는 문제

- 몇 개의 종류를 구분하는 문제

🧩 회귀

- 임의의 숫자를 예측하는 문제

- 타겟값이 수치가 된다

 

 

 

 

 

출처: https://youtu.be/0mrLRkgbjA0?si=VxF1Jujs1GrzRpyd