데이터의 출처와 학습 내용은 [박혜선 혼자 공부하는 머신러닝 + 딥러닝 ],한빛미디어 를 인용했습니다.
선형 회귀
선형 회귀는 두 변수 간의 선형 관계를 모델링하여 연속적인 값을 예측하는 통계적 기법입니다. 주로 독립 변수(input, XX)와 종속 변수(output, YY) 간의 관계를 직선으로 나타내는 방법입니다. 선형 회귀는 예측하고자 하는 변수(종속 변수)와 설명 변수(독립 변수) 간의 선형 관계를 가정합니다.
선형 회귀는 단어 조합 그대로 직선상의 숫자입니다. 이 회귀가 어떤 역할을 하는지 그리고 왜 필요한지 이 게시글에서 실습을 통해 알아보겠습니다. 이전 게시글에서 사용했던 코드들을 그대로 가져오시면 됩니다.
먼저 이전 학습된 모델에서 60cm인 농어를 예측해보겠습니다. 그렇다면 무게를 1,033g정도를 예측합니다. 하지만 실제 농어의 무게는 보다 더 나갑니다. 다음으로는 1000cm인 가상의 농어를 예측해보겠습니다. 또 1,033g 정도로 예측합니다. 오류 된 결과값을 도출하고 있다는 것을 이쯤에서 파악하실 수 있습니다.
주황색은 KNN이 선택한 점이고 초록색은 들어온 예측값입니다. 50을 넣을 때 입니다. 범위에 지정되지 않은 새로운 데이터들 즉 45cm보다 큰 데이터들은 무조건 주황색 3개의 점을 예측할 것 입니다.
이 때 이 제한을 벗어나 이 unknow data가 들어왔을 때 이전 경향들을 고려해 새로 예측하는 것이 linear Regression 입니다.
KNN regression은 이 문제에 적합하지 않은 알고리즘이였습니다. 선형이란 말에서 알 수 있듯이 변수가 하나인 즉 특성이 ㅏ나인 경우 어떤 직선을 학습하는 알고리즘입니다.
이러한 선들이 이 데이터를 잘 표현했다고 생각하시나요? 직접 모델링 해보겠습니다.
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(train_input,train_target)
print(lr.predict([[50]]))
결과값이 : 약 1,241g이 나온 것을 확인할 수 있습니다. 확실히 이전보다는 큰 무게로 예측했습니다. 추가로 직선을 판단할 때 기울기와 절편을 LinearRegression이 저장하고 있어 직접 파라메터를 확인하실 수 있습니다. 또한 추가로 절편에 대해 학습하는 기능을 off 하실 수도 있습니다.
print(lr.coef_, lr.intercept_)
coef_ 는 계수로 기울기를 뜻합니다. intercept_는 절편을 의미합니다. 저희의 목표는 이 파라메터를 가장 최적의 파라메터를 찾아서 모델을 잘 설명할 수 있어야 합니다. 이 값을 모델 파라미터라고 부르며 이전에 훈련 세트를 저장하는 것이 훈련의 전부였던 KNN은 사례 기반 학습이라고 합니다.
그렇다면 이 직선은 이 데이터를 잘표현한다고 생각하실 수 있습니다. 하지만 길이가 15cm 미만인 경우에는 무게가 -가 됩니다. 이는 현실세계에서 존재하지 않습니다. 또한 훈련세트와 테스트 세트의 정확도를 출력해보면, 0.93과 0.82로 매우 차이가 납니다. 오버피팅이 발생한 것 입니다. 이를 커버하기 위해 다항 회귀로 바꿀 수 있습니다. 최적의 직선을 찾기보다 최적의 곡선을 찾는 것 입니다. 하지만 하나의 변수로 다른 변수로 만들 시에는 다항회귀가 하나의 변수인것은 명백한 사실이기 때문에 이 또한 선형회귀에 해당하는 것입니다. 곡선도 선에 해당하기 때문입니다. 따라서 대표적인 방법으로 길이를 제곱하여 변수를 추가해주는 방식입니다.
제곱하는 것은 테스트 데이터에 해주는 것이 아닌 트레인 데이터에만 해당 됩니다.
train_poly = np.column_stack((train_input** 2, train_input))
test_poly = np.column_stack((test_input**2, test_input))
train_poly[1]
그렇다면 예측 데이터의 값을 넣을 때도 제곱한 형식의 데이터를 집어 넣는 것도 당연한 사실입니다. 학습 된 결과와 저장된 기울기, 절편을 확인해보겠습니다.
print(lr.coef_,lr.intercept_)
맨 앞에 값은 [ ] 들어옴을 확인할 수 있습니다. 즉 계수가 2개 입니다. 하지만 선형회귀 임에도 불구하고 이런 다항식이 들어올 것을 암시하고 리스트로 반환해줬습니다. 단일 값 경우에도 그렇습니다.
이 다항식의 식 y^= 1.01433211 x2 - 21.55792498 x1 + 116.0502107827827
lr = LinearRegression()
lr.fit(train_poly,train_target)
print(lr.predict([[50**2,50]]))
이전 보다 점점 무게가 커짐을 확인할 수 있습니다. 또한 정확도도 0.9706 과 0.977로 매우 비슷하게 나왔습니다. 트레인 데이터와 테스트 데이터가 별 차이가 없음은 오버핏팅도 언더핏팅도 아님은 위에서 정의한 사실입니다.
'Machine-Learning' 카테고리의 다른 글
K-NN Regression _ K-최근접 이웃 회귀 (0) | 2025.03.26 |
---|---|
Scaling ? Z-score (0) | 2025.03.19 |
데이터 전처리, 데이터셋 나누기 (0) | 2025.03.19 |
K-Nearest Neighbors, KNN (0) | 2025.03.13 |