본문 바로가기

인공지능/머신러닝

[머신러닝ML] 머신러닝 실습 - 선형회귀모델(LR; Linear Regression Model), 다항회귀모델(곡선)

~ 목차 ~

선형회귀모델

 

 


### 모델 라이브러리 불러들이기
from sklearn.linear_model import LinearRegression

### 사용할 데이터
train_input, test_input, train_target, test_target = train_test_split(perch_length,
                                                                      perch_weight,
                                                                      test_size=0.25,
                                                                      random_state=42)
print(f"{train_input.shape} : {train_target.shape}")
print(f"{test_input.shape} : {test_target.shape}")

 


### 모델 생성하기
lr = LinearRegression()
lr

### 모델 훈련 시키기
lr.fit(train_input, train_target)

### 훈련 정확도 
train_r2=lr.score(train_input, train_target)

### 테스트(검증) 정확도
test_r2=lr.score(test_input, test_target)

print(f"{train_r2}, {test_r2}")

 ==> 출력 : 0.939846333997604, 0.8247503123313558

 

해석🪄
-  결정계수 확인 결과, 훈련이 > 테스트 결정계수보다 크기에 과소적합은 일어나지 않았으나,
-  두 계수의 차이가 0.12로 과대적합이 의심됨(0.1이상일시 보통 의심, 10%의 오차이므로)

 

 

○ 임의 데이터로 예측하기
   - 직선의 방정식 y=ax+b
   - coef_ : 기울기(계수) -> a
   - intercept_ : y절편 -> b


### KNN에서는 1033g을 예측했었음
lr.predict([[50]])

### 추세선(예측선 이라고도 합니다.)을 그리기 위한 계수값 추출하기
lr.coef_, lr.intercept_

 ==> 출력 :array([1241.83860323])
                  (array([39.01714496]), -709.0186449535477)

 

 

추세선 그리기


### 훈련데이터 산점도
plt.scatter(train_input, train_target)

### 예측값 산점도
plt.scatter(50, 1241.839, marker="^")

### 추세선 (x값 15부터 50까지의 직선 그리기)
plt.plot([0, 25], [lr.coef_*0 + lr.intercept_, lr.coef_*25 + lr.intercept_], c="blue")
plt.plot([25, 50], [lr.coef_*25 + lr.intercept_, lr.coef_*50 + lr.intercept_], c="red", linestyle="--")

plt.grid()
plt.show()

선형 회귀 그래프

해석🪄
-  임의 값 예측 시 KNN보다는 성능이 좋은 예측이 가능하며, 과적합이 발생하지 않는 일반화된 모델로 보여지나, y절편의 값이 음수로 예측 시 음수의 데이터가 예측 될 가능성이 있는 모델로 보여짐
- 종속변수 무게의 값은 0 이하로 나올 수 없기에 이상치를 예측할 수 있는 모델로 현재 사용하는 데이터를 예측하기에는 부적합한 모델로 여겨짐

 

 

 


다항회귀모델(곡선)

 

<다항회귀모델>
- 데이터의 분포가 선형이면서 곡선을 띄는 경우에 사용됨
- 곡선(포물선)의 방정식이 적용되어 있음
- y=(a * x^2) + (b * x) + c
- 독립변수는 2개가 사용됨 : x^2값과 x값

 

훈련 및 테스트데이터의 독립변수에 x^2값 추가하기


#  훈련 독립변수
train_ploy = np.column_stack((train_input**2, train_input))

#  테스트 독립변수
test_ploy = np.column_stack((test_input**2, test_input))

train_ploy.shape, test_ploy.shape

 ==> 출력 : ((42, 2), (14, 2))

 

모델 생성하기

 - 선형, 다항, 다중회귀모델은 하나의 모델(클래스) 사용
 - 직선, 곡선에 대한 구분은 독립변수의 갯수로 모델이 알아서 구분해 준다.


# 독립변수가 2개인 데이터를 넣으면 앞에 내용은 제곱값으로 뒷 내용은 x값으로 알아서 인식함.
lr = LinearRegression()
lr

### 모델 훈련 시키기
lr.fit(train_ploy, train_target)

### 훈련 및 테스트 검증하고, 과적합 여부 확인해 주세요
train_r3 = lr.score(train_ploy, train_target)

test_r3 = lr.score(test_ploy, test_target)

print(f"훈련 검증 : {train_r3} / 테스트 검증 : {test_r3}")

 ==> 출력 : 훈련 검증 : 0.9706807451768623 / 테스트 검증 : 0.9775935108325122

해석🪄
-  결정계수 확인 결과, 훈련이 < 테스트 결정계수보다 작은 과소적합으로 보임

 

임의 테스트값 50을 예측

 


# 임의 테스트값 50을 예측
pred=lr.predict([[50**2,50]])
pred

"""훈련 시키기"""
lr.fit(train_ploy, train_target)

"""훈련 정확도 확인하기"""
train_r2 = lr.score(train_ploy, train_target)

"""테스트 정확도 확인하기"""
test_r2 = lr.score(test_ploy, test_target)

"""과적합 여부 확인(해석)
- 0.007 정도의 과소적합(훈련 < 검증)이 발생
"""
print(f"훈련 결정계수 : {train_r2} / 테스트 결정계수 : {test_r2}")

"""임의 값 50 예측하기"""
pred=lr.predict([[50**2,50]])
print(f"길이 50 예측 결과 : {pred}")

 ==> 출력 : 훈련 결정계수 : 0.9706807451768623 / 테스트 결정계수 : 0.9775935108325122
                    길이 50 예측 결과 : [1573.98423528]

 

 

추세선 그리기

- 추세선을 그리기 위해서는 곡선의 방정식에 사용할 계수 a, b와 절편 c를 알아야 한다.

 


print(f"계수 = {lr.coef_} / 절편 = {lr.intercept_}")

a = lr.coef_[0]
b = lr.coef_[1]
c = lr.intercept_
print(f"a={a}, b={b}, c={c}")

 ==> 출력 :
계수 = [  1.01433211 -21.55792498] / 절편 = 116.05021078278304
a=1.01433210937673, b=-21.557924978837356, c=116.05021078278304


plt.scatter(train_input, train_target)
plt.scatter(50, pred[0], marker="^")

### 추세선
# 추세선이 사용할 x축값 지정(0~50까지의 순차적인 값 사용)
point = np.arange(0, 51)
plt.plot(point, a*point**2 + b*point + c)

plt.grid()
plt.show()

추세선 그리기(곡선)

 

 

해석🪄

- 선형회귀모델의 경우에는 음의 절편값이 나타나는 모델이었으나, 다항회귀모델의 경우에는 이를 해소할 수 있었음

- 단, 길이(x)가 10이하의 독립변수는 사용하면 안됨

- 다항회귀모델의 훈련 및 테스트 결정계수의 결과 미세한 과소적합을 보이고 있으나, 사용가능한 모델로 판단됨
- 선형회귀모델에 비하여 독립변수들이 전체적으로 추세선에 가깝게 위치하고 있기에 오차가 적은 모델이라고 판단됨

 

 

<과적합을 해소하기 위한 방법>

1. 데이터 양(row 데이터, 행)을 늘릴 수 있는지 확인

2. 분석 모델이 좀 더 집중해서 훈련 할 수 있도록 → 특성(독립변수)을 추가하는 방법 확인

    → 특성을 추가(늘리는)하는 방법은 "특성공학" 개념을 적용

    → 특성을 늘려서 사용하는 모델로 다중회귀모델이 있음

    → 특성을 늘린다는 의미는 훈련의 복잡도를 증가시킨다고 표현하며, 복잡도가 증가되면, 훈련의 집중력이 강해지게 됨

3. 복잡도를 늘리는 방법으로는 규제 방법이 있음

    →  규제를 하는 하이퍼파라메터 속성을 이용하는 방식으로 릿지와 라쏘 회귀모델 방식이 있음

4.  이외 다른 회귀모델을 사용하여 비교 

 

* 특성 => 컬럼(열), 필드, 퓨처 모두 같은 의미

  : 데이터 처리 분야에서는 컬럼 또는 필드라고 칭하며, 머신러닝에서는 특성이라고 칭하며, 딥러닝에서는 퓨처라고 칭합니다.

 

 

728x90