본문 바로가기

머신러닝/혼자 공부하는 머신러닝

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

이 글은 https://www.youtube.com/watch?v=0mrLRkgbjA0 보고 공부한 글 입니다.

 

지난시간에 

수상한 도미의 최근접 이웃을 찾아봤다

 

스케일을 맞춰서 그래프를 그려보니 최근접이 달라졌다.

 

 

이제부터 회귀를 배워보자 

분류는 도미와 빙어를 구분하는 것이다.

회귀는 임의의 숫자를 예측하는 것이다.

 

결과는 임의의 실수 이다.

 

회귀(regression) 

이진 분류에서 타깃을 0, 1로 만들었었다.

 

예측하는 것이 임의의 숫자이니 타깃은 숫자가 된다.

 

3장에서는 높이, 두께를 고려하지 않고 길이만 가지고 예측해본다.

 

 

 

k-최근접 이웃 회귀

 

분류할 때 사각형이 2개 있으니 사각형이라 예측한다.

 

회귀는 주변에 가까운걸 찾는다.

각각 타겟값을 가지고 있을 탠데 평균값으로 결과를 낸다.

 

 

농어의 길이만 사용 

처음 시작할 때 회귀문제를 다룰 때 특성 1개만 사용한다.

length 특성 1개만 사용해본다.

 

 

 

 

훈련 세트 준비 

stratify 를 넣어주지 않았다. 

 

stratify에 원래 타겟값을 넣어 줬었다.

타겟값에 따라 골고루 클래스에 나누라고 설정한 것이다.

 

임의의 숫자가 타겟이기 때문에 stratify를 사용하지 않고 랜덤하게 섞는다.

 

stratify의 default는 false다.

 

여기서 perch_length는 1차원 배열이기 때문에 결과인 훈련세트, 테스트세트 다 1차원 배열이다.

 

 

 

하지만 사이킷런은 위 그림과 같은 2차원 배열을 기대하고 있다.

 

그래서 numpy의 기능중에 1차원 배열을 2차원으로 늘려주는 것이 reshape()메서드 이다.

 

reshape(-1, 1 ) 첫 번째 차원을 -1로 지정하고 (= 나머지 차원이 결정되고 나머지 차원으로 할당하겠다)

두 번째 차원을 1로 설정한다. = 하나의 열이 있는 2차원 배열이 생성된다.

 

 

열이 1개밖에 없으니 원래 있던 1,2,3을 행으로 넣어둔다.

 

이렇게 되면 -1이 -> 3이 되고 행의 크기는 3이 된다.

 

 

회귀모델 훈련  

 

~~~~kascsifier = 분류

~~~~Regressor = 회귀

 

분류에서 score는 정확도(몇개를 맞췄는지)

회귀에서 score는 R^2(결정계수) 가 출력된다.

 

결정계수

 

타깃 =  테스트 타겟이다.

 

예측 = 이 모델이 test_input으로 예측한 값

 

평균 = test_tartget의 평균

 

 

예측과 평균이 비슷하면 1이되니 R^2값이 0이 된다.

좋지 않게 된 것이다.

 

예측이 타깃을 정확하게 맞춘다면 분자가 0이 되니 1에 가까운 값이 된다.

 

 

 

 

R^2말고 다른 지표를 사용해서 모델의 성능을 파악 할 수 있다.

 

평균 절대값 오차를 사용해서 모델 성능을 파악할 수 있다.

 

test_input으로 예측한 값을 prediction에 넣는다.

 

target과 prediction의 차이 절대값을 구해서 

 

대략 19정도 오차가 난다.

 

 

과대적합과 과소적합 

훈련 점수가 더 낮게 나왔다!

 

보통 훈련 점수가 더 높게 나온다.

 

 

이런 현상을 훈련세트를 적절히 훈련하지 못했다 = 과소적합 했다(underfitting)

반대 현상을 훈련세트에만 맞아서 실전에서 형편없는 모델을  = 과대적합 했다(overfitting)

 

 

 

위 현상을 해결하는 방법

이웃 개수 줄이기 

이웃의 개수를 줄이면 과대적합

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

 

이웃을 3으로 줄이고 훈련하니 훈련, 테스트 세트의 군형을 맞췄다.

 

 

 

 

 

728x90