선형회귀모델
### 모델 라이브러리 불러들이기
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. 이외 다른 회귀모델을 사용하여 비교
* 특성 => 컬럼(열), 필드, 퓨처 모두 같은 의미
: 데이터 처리 분야에서는 컬럼 또는 필드라고 칭하며, 머신러닝에서는 특성이라고 칭하며, 딥러닝에서는 퓨처라고 칭합니다.
'인공지능 > 머신러닝' 카테고리의 다른 글
[머신러닝ML]모델 파일 저장 및 불러오기 (1) | 2023.12.29 |
---|---|
[머신러닝ML] 머신러닝 실습 - 다중회귀모델(Multiple Regression) (1) | 2023.12.21 |
[머신러닝ML] 머신러닝 실습 - KNN모델(회귀모델) (0) | 2023.12.21 |
[머신러닝ML]머신러닝 실습 - 생선 구분하기(K최근접이웃 모델, KNN) (2) | 2023.12.20 |
[머신러닝ML] 머신러닝이란? (10) | 2023.12.19 |