파이썬/ai

[Ai, Python] Linear Regression- 4

hojung 2022. 4. 11.
728x90
반응형

1. 선형 회귀

앞서도 계속 학교의 ai수업 중간고사를 준비하기 위해 수업의 내용을 정리하고 첨언하는 식으로 포스팅을 계속해가고 있다. 

이번에 살펴볼 것은 Linear Regression학습 모델인데 여태까지 KNN이나 KNR처럼 자신의 주변의 사례들을 기반으로 새로운 데이터의 값을 예측하는 것은 사례기반 학습 LinearRegression처럼 기존의 데이터로 부터 함수를 만들어낸 뒤 그 함수를 통해 새로운 데이터의 값을 예측하는 것을 모델 학습이라고 한다. 앞선 포스팅에서 설명했듯이 LinearRegression은 그 모델 중 하나의 변수만을 고려하기 때문에 일차 함수의 형태를 띄고 우리는 여기서 y = ax + b에서 적절한 a와 b를 찾아내는 것이 목적이다. 이 a와 b를 모델 파라미터라고 한다. 


2. LinearRegression() 구현

1. LinearRegression 학습

lr = LinearRegression()
# 선형 회귀 모델 훈련
lr.fit(train_input, train_target)
LinearRegression()
# 50cm 농어에 대한 예측
print(lr.predict([[50]]))
#일차 함수의 기울기와 y절편
print(lr.coef_, lr.intercept_)

LinearRegression은 scikit-learn라이브러리에 포함되어 있기 때문에 pip을 통해 scikit-learn을 설치해준 후 사용해야한다. 

훈련 방법은 KNN과 KNR과 동일하게 fit이라는 api를 통해 훈련시키고 predict api를 통해 새로운 데이터들에 대한 값을 예측해볼 수 있다. 

또한 LinearRegression은 train_data들로부터 y = ax + b의 적절한 모델 파라미터 a와 b를 구하는 과정이기 때문에 이 a와 b는 coef와 intercept_라는 이름으로 저장되어있다. 

2. 학습 확인

학습을 확인하기 위해 matplotlib을 이용해 그래프를 그려보겠다. 

# 훈련 세트의 산점도를 그립니다.
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.xlabel('length')
plt.ylabel('weight')
plt.show()

다음과 같이 기존의 데이터들로부터 직선을 얻어낸 뒤 새로운 데이터가 들어왔을 때 이 직선을 기준으로 값을 예측한다. 

그러나 세상에는 정말 많은 변수들이 있고 이러한 단순한 직선에 의해 새로운 데이터의 값이 정확히 예측되는 것은 거의 불가능하다. 따라서 회귀에서는 좀 다른 방식으로 평가를 하는데 이를 결정계수라고 한다. 

결정계수는 다음과 같이 계산된다. 

 

R^2 = 1 -  {(타깃 - 예측의 값) ^2의 합 / (타깃 - 평균의 값)^2의 합}

 

여기서 train_data와 test_data에 대한 점수를 확인하면 다음과 같다. 

결과를 확인해보면 train_Data에 대한 점수가 더 좋긴하나 test_data와의 점수가 그리 많이 차이가 나지는 않는다. 그래도 어느정도는 과소 적합의 현상이 일어난 것을 확인할 수 있다. 

 


3. Polynomial Regression

1. polynomial Regression 데이터 전처리

그 한 변수의 영향을 꼭 일차 함수의 형태로 받으라는 법은 없다. 다차 함수의 형태로도 충분히 받을 수 있고 이 같은 경욱가 오히려 가능성이 높다. 따라서 LinearRegression의 경우 그렇게 점수가 높게 나오는 편은 아니다. 

그래서 우리는 농어의 길이가 무게에 다차함수 중 이차함수의 형태로 영향을 준다고 가정하고 학습을 시켜보겠다. 

 

Polynomial Regression을 통해 학습을 시키려면 데이터를 사전에 처리를 해야한다. 특히 우리가 학습시키고자 하는 다차함수 모델의 차수만큼 데이터 셋의 행이 준비되어야한다. 따라서 앞선 포스팅에서 설명했던 numpy라이브러리의 column_Stack함수를 이용하여 준비해둔 데이터들을 변형시켜보겠다. 

train_poly = np.column_stack((train_input ** 2, train_input)) #제곱의 값
test_poly = np.column_stack((test_input ** 2, test_input))
print(train_poly.shape, test_poly.shape)

column_Stack함수를 통해 데이터의 구조를 변형시킨 모습이다. 

파이썬에서 **는 제곱을 뜻하는 연산자이다. 

우리는 이차 함수의 형태로 학습을 시킬 것이기 때문에 데이터의 형태도 x^2, x의 형태로 변경해준다. 

변형된 데이터의 모습을 살펴보면 다음과 같다. 

열을 2개 가지는 행렬 형태로 변형된 것을 확인할 수 있다. 

그 후 LinearRegression을 통해 학습을 시켜준다. 

2. polynomial Regression 학습

lr = LinearRegression()
lr.fit(train_poly, train_target)

print(lr.predict([[50**2, 50]]))
#2차 함수의 기울기와 y절편
print(lr.coef_, lr.intercept_)

fit api를 통해 data와 target을 넣어준 후 새로운 데이터에 대한 예측치를 확인해보겠다. 

Linear Regression때 보다 훨씬 더 큰 값이 나오게 되었다. 이는 일차함수의 증가량보다 이차 함수의 증가 정도가 더 크기 때문이다. 

또한 구해진 그래프의 기울기와 y절편 값을 보면 다음과 같다. 

1.01433211과 -21.55792498은 기울기 116.05021078278264는 구한 2차 함수의 y절편에 해당한다. 아까와 달리 기울기의 값이 2개가 나온 것은 아까는 1차 함수의 그래프를 구한 것이었고 지금은 2차 함수의 그래프를 그린 것이기 떄문이다.

 

그 후 눈으로 확인해보기 위해 그래프를 그리면 다음과 같다. 

 구간별 직선을 그리기 위해 15에서 49까지 정수 배열을 만듭니다.
point = np.arange(15, 50)

# 훈련 세트의 산점도를 그립니다.
plt.scatter(train_input, train_target)

# 15에서 49까지 2차 방정식 그래프를 그립니다.
plt.plot(point, 1.01*point**2 - 21.6*point + 116.05)

# 50cm 농어 데이터
plt.scatter([50], [1574], marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

아까보다는 더 정확하게 데이터들과 이차 함수의 그래프가 일치하는 것을 확인할 수 있다. 

다시 한 번 Linear Regression에서 했던 것처럼 결정계수의 값을 확인해보겠다. 

Linear Regression보다는 훨씬 좋은 결정계수가 나온 것을 확인할 수 있다. 차수가 높아질수록 이처럼 정확도가 올라가는 경우가 대부분이지만 내려가는 경우도 존재하니 우리는 최고의 차수를 찾아 regression을 학습해야한다. 

728x90
반응형

댓글