본문 바로가기
SW 교육

[2024.08.01] K-최근접 이웃 회귀, 선형 회귀, 다항 회귀, 다중 회귀

by 하루한번토스트 2024. 8. 1.

객체생성-> 훈련 Fit -> 평가scroe ->predict   반복중

K-최근접 이웃 회귀

 

*주의 2개의 특성을 이용할때는 자연스럽게 열이 2개인 2차원 배열을 이용했으나, 특성이 1개일때는 수동으로 2차원 배열로 변경해주어야한다.

 

특성이 1개라 1차원인 상태

 

 reshape() 메서드를 이용하여 2차원 배열로 변경해주었다

 

 

결정계수(R^2)

K-최근접 이웃 회귀 알고리즘을 구현한 클래스는 KneighborsRegressor이다. 

from sklearn.neighbors import KNeighborsRegressor


knr = KNeighborsRegressor()
# k-최근접 이웃 회귀 모델을 훈련합니다
knr.fit(train_input, train_target)

 

 

결정계수란?

다음과 같이 점수가 나왔을때, 이를 결정계수 라고 부른다.(또는 R^2)

 

 

과대적합 vs 과소적합 (평가 점수 비교)

 

훈련세트의 점수와 테스트 점수를 비교하였을때,( 보통 훈련 세트의 점수가 더 높은 점수가 나와야한다.)

 

 

훈련점수 0.9698 , 테스트점수 0.9928 은 과소적합이라고 할수있다.

 

이를 해결하기 위해서는 이웃의 개수를 늘려서 데이터 전반에 있는 일반적인 패턴을 반영시킬수있다.

=> 이웃의 적합한 수를 찾는 알고리즘은 5장에서 할 예정

 

 

선형 회귀 Linear Regression 

k-nn의 한계: 돌연변이 값에 대한 대처가 약하다. 

 

다음과 같이 데이터(초록)가 들어왔을때 평균의 범주와 떨어져 있으면 최근접 데이터가 현실과 차이가 크게 생긴다.

 

=> 이를 해결하기 위하여 선형 회귀를 사용해야한다.

 

y=ax+b <<에서 a와 b의 값을 알면 전부 값을 알수있다.

즉, 기울기와 y절편<< 을 찾아야한다.

 

선형회귀의 목적: 최적의 대각선을 찾자

 

1. 사이킷런은 sklearn.liner_model 패키지 아래에 LinearRegression 클래스로 선형 회귀 알고리즘을 구현했습니다.

 

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

perch_length = np.array(
    [8.4, 13.7, 15.0, 16.2, 17.4, 18.0, 18.7, 19.0, 19.6, 20.0,
     21.0, 21.0, 21.0, 21.3, 22.0, 22.0, 22.0, 22.0, 22.0, 22.5,
     22.5, 22.7, 23.0, 23.5, 24.0, 24.0, 24.6, 25.0, 25.6, 26.5,
     27.3, 27.5, 27.5, 27.5, 28.0, 28.7, 30.0, 32.8, 34.5, 35.0,
     36.5, 36.0, 37.0, 37.0, 39.0, 39.0, 39.0, 40.0, 40.0, 40.0,
     40.0, 42.0, 43.0, 43.0, 43.5, 44.0]
     )
perch_weight = np.array(
    [5.9, 32.0, 40.0, 51.5, 70.0, 100.0, 78.0, 80.0, 85.0, 85.0,
     110.0, 115.0, 125.0, 130.0, 120.0, 120.0, 130.0, 135.0, 110.0,
     130.0, 150.0, 145.0, 150.0, 170.0, 225.0, 145.0, 188.0, 180.0,
     197.0, 218.0, 300.0, 260.0, 265.0, 250.0, 250.0, 300.0, 320.0,
     514.0, 556.0, 840.0, 685.0, 700.0, 700.0, 690.0, 900.0, 650.0,
     820.0, 850.0, 900.0, 1015.0, 820.0, 1100.0, 1000.0, 1100.0,
     1000.0, 1000.0]
     )


# 훈련 세트와 테스트 세트로 나눕니다
train_input, test_input, train_target, test_target = train_test_split(
    perch_length, perch_weight, random_state=42)
# 훈련 세트와 테스트 세트를 2차원 배열로 바꿉니다
train_input = train_input.reshape(-1, 1)
test_input = test_input.reshape(-1, 1)

# 선형회귀 알고리즘 객체 생성
lr = LinearRegression()


# 선형 회귀 모델 <훈련>
lr.fit(train_input, train_target)

# 50cm 농어에 대한 예측
print(lr.predict([[50]]))
print(lr.coef_, lr.intercept_)


#시각화 
# 훈련 세트의 산점도를 그립니다
plt.scatter(train_input, train_target)
# 15에서 50까지 1차 방정식 그래프를 그립니다
plt.plot([15, 50], [15*lr.coef_+lr.intercept_, 50*lr.coef_+lr.intercept_])
# 50cm 농어 데이터
plt.scatter(50, 1241.8, marker='^')
plt.scatter(50, 1033, marker='x')

#plt.plot([x1,x2], [y1,y2])
plt.plot([15,50],[lr.coef_*15+lr.intercept_, lr.coef_*50+lr.intercept_],'r')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()


print(lr.coef_)
print(lr.intercept_)

 

최적의 선 찾기

 

다항 회귀

선형회귀의 문제점: 그래프의 왼쪽 아래가 직선으로 쭉 가면 0을 뚫어서 -무게가 되어버렸다.

 

다항 회귀란? 다항식을 사용한 선형 회귀를 다항회귀라고 한다.

 

 

 

짧은 직선을 이어서 그려서 마치 곡선처럼 보이게 한다.

 

다중 회귀

List->넘파이->판다스로 변경 가능

            ->바로 판다스로도 가능

 

다중 회귀 모델을 훈련하기 위해서는 여러개의 특성을 사용하여 선형 회귀를 수행햐아한다.

 

1. 사이킷런의 LinearRegression 클래스를 임포트하고 앞에서 만든 train_poly를 사용해 모델을 훈련시킨다.

 

from sklearn.linear+model import LinearRegression
lr=LinearRegression()
lr.fit(train_poly, train_target)

#훈련 세트 데이터 점수 출력
print(lr.score(train_poly,train_target))
#테스트 세트 데이터 점수 출력
print(lr.score(test_poly,test_target))

 

2. 기존의 특성을 이용하여 또 다른 특성을 만들어 내는 작업(특성 공학)을 통해 신뢰도를 올려야한다.

예) "농어 길이", "농어 높이" , "농어 길이x농어 높이 "

 

3. 늘어난 데이터를 처리하기 위해서는 그 방법이 매우 까다로운데 이를 처리하기 위해서 판다스(유명한 데이터 분석 라이브러리)를 사용하는것이 좋다.

 데이터프레임은 판다스의 핵심 데이터 구조인데, 많은 기능을 제공하고 배열로 쉽게 변경도 가능하다.

 

판다스를 이용하여 자료를 받기.