3. Polynomial Regression(다항 회귀)¶
공부 시간에 따른 시험 점수 (우등생)¶
In [1]:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
In [2]:
dataset = pd.read_csv('../data/PolynomialRegressionData.csv')
dataset.head()
Out[2]:
hour | score | |
---|---|---|
0 | 0.2 | 2 |
1 | 0.5 | 4 |
2 | 0.8 | 6 |
3 | 0.9 | 4 |
4 | 1.2 | 6 |
In [3]:
X = dataset.iloc[:, :-1].values # 공부시간 컬럼 데이터
y = dataset.iloc[:, -1].values # 점수 컬럼 데이터
X, y
Out[3]:
(array([[0.2],
[0.5],
[0.8],
[0.9],
[1.2],
[2.4],
[2.5],
[2.6],
[2.9],
[3.1],
[3.2],
[3.3],
[3.7],
[3.9],
[4. ],
[4.1],
[4.2],
[4.4],
[4.7],
[4.8]]),
array([ 2, 4, 6, 4, 6, 14, 10, 12, 24, 26, 32, 46, 44,
52, 58, 54, 68, 80, 84, 100], dtype=int64))
3-1. 단순 선형 회귀 (Simple Linear Regression)¶
- y = mx + b (단순 선형 회귀)
- y = b + m1x1 + m2x2 + . . . + mnxn (다중 선형 회귀)
- y = b + m1x1 + m2x^2 + . . . + mnx^n (다항 회귀)
In [4]:
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(X, y) # 전체 데이터로 학습
Out[4]:
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
LinearRegression()
데이터 시각화 (전체)¶
In [5]:
plt.scatter(X, y, color='blue') # 산점도
plt.plot(X, reg.predict(X), color='green') # 선 그래프
plt.title('Score by hours') # 제목
plt.xlabel('hours') # X 축 이름
plt.ylabel('score') # Y 축 이름
plt.show()
In [6]:
reg.score(X, y) # 전체 데이터를 통한 모델 평가
Out[6]:
0.8169296513411765
3-2. 다항 회귀 (Polynomial Regression)¶
- 다항 회귀(Polynomial Regression)는
선형 회귀의 확장된 형태로 종속 변수와 독립 변수 간의 비선형 관계를 모델링하는 데 사용됩니다.
선형 회귀는 독립 변수와 종속 변수 사이의 관계를 직선으로 표현하는 반면,
다항 회귀는 다항식을 사용하여 곡선을 통해 보다 복잡한 패턴을 포착할 수 있습니다.
- 다항 회귀의 핵심 개념
모델 형태: 다항 회귀 모델은 일반적으로 y = b + m1x1 + m2x^2 + . . . + mnx^n 차수가 높아질수록 복잡한 데이터 패턴을 더 잘 포착할 수 있지만, 과적합(overfitting) 위험도 증가합니다.
- 비선형 회귀의 특징:
다항 회귀는 곡선 형태의 데이터를 모델링할 수 있지만, 회귀 계수의 결합을 통해 선형 방식으로 추정하므로 비선형 회귀 분석과는 다릅니다.
- 다항 회귀의 장점과 단점
- 장점 :
독립 변수와 종속 변수 간의 비선형 관계를 보다 유연하게 모델링할 수 있습니다.
- 단점: 차수를 높일수록 모델이 과적합될 가능성이 커지고, 데이터가 부족하거나 잡음이 많을 경우 예측 성능이 저하될 수 있습니다.
다항 회귀 적용 예시:
예를 들어, 주식 시장에서 시간에 따른 주가 변동을 모델링할 때, 주가가 단순한 직선의 형태가 아닌 여러 곡선을 따라가는 경우가 많습니다. 이러한 경우 다항 회귀를 사용하여 시간에 따른 비선형 변화를 모델링할 수 있습니다.
- 다항 회귀는 주로 비선형 데이터에서 패턴을 포착하거나 트렌드를 분석할 때 유용하게 사용됩니다.
In [7]:
from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures(degree=4) # 4차, 차수가 너무 높으면 과대적합이 될수도 있음
X_poly = poly_reg.fit_transform(X) # 생성한 다항 회귀 poly_reg 로 X 데이터 변환
X_poly[:5] # [x] -> [x^0, x^1, x^2] -> x 가 3이라면 [1, 3, 9] 으로 변환
Out[7]:
array([[1.0000e+00, 2.0000e-01, 4.0000e-02, 8.0000e-03, 1.6000e-03],
[1.0000e+00, 5.0000e-01, 2.5000e-01, 1.2500e-01, 6.2500e-02],
[1.0000e+00, 8.0000e-01, 6.4000e-01, 5.1200e-01, 4.0960e-01],
[1.0000e+00, 9.0000e-01, 8.1000e-01, 7.2900e-01, 6.5610e-01],
[1.0000e+00, 1.2000e+00, 1.4400e+00, 1.7280e+00, 2.0736e+00]])
In [8]:
lin_reg = LinearRegression()
lin_reg.fit(X_poly, y) # 변환된 X_poly 와 y 를 선형 회귀 적용
Out[8]:
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
LinearRegression()
데이터 시각화 (변환된 X 와 y)¶
In [9]:
plt.scatter(X, y, color='blue')
plt.plot(X, lin_reg.predict(X_poly), color='green')
plt.title('Score by hours') # 제목
plt.xlabel('hours') # X 축 이름
plt.ylabel('score') # Y 축 이름
plt.show()
데이터 시각화 (선 부드럽게)¶
In [10]:
X_range = np.arange(min(X), max(X), 0.1) # X 의 최소값에서 최대값까지의 범위를 0.1 단위로 잘라서 데이터를 생성, 선을 부드럽게 그리기 위함
X_range
C:\Users\ysh\AppData\Local\Temp\ipykernel_7304\3647238444.py:1: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)
X_range = np.arange(min(X), max(X), 0.1) # X 의 최소값에서 최대값까지의 범위를 0.1 단위로 잘라서 데이터를 생성, 선을 부드럽게 그리기 위함
Out[10]:
array([0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. , 1.1, 1.2, 1.3, 1.4,
1.5, 1.6, 1.7, 1.8, 1.9, 2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7,
2.8, 2.9, 3. , 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4. ,
4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7])
In [11]:
X_range.shape # 변환 후 shape 확인
Out[11]:
(46,)
In [12]:
X.shape # 변환 전 shape 확인
Out[12]:
(20, 1)
In [13]:
X_range = X_range.reshape(-1, 1) # row 개수는 자동으로 계산, column 개수는 1개
X_range.shape # shape 확인, 변환 전 shape 과 맞춤
Out[13]:
(46, 1)
In [14]:
plt.scatter(X, y, color='blue') # 원본 데이터 X
# X데이터를 변환한 데이터 X_range 로 다항 회귀 적용후 선형회귀 적용
plt.plot(X_range, lin_reg.predict(poly_reg.fit_transform(X_range)), color='green')
plt.title('Score by hours') # 제목
plt.xlabel('hours') # X 축 이름
plt.ylabel('score') # Y 축 이름
plt.show()
공부 시간에 따른 시험 성적 예측¶
In [15]:
reg.predict([[2]]) # 2시간을 공부했을 때 선형 회귀 모델의 예측
Out[15]:
array([19.85348988])
In [16]:
lin_reg.predict(poly_reg.fit_transform([[2]])) # 2시간을 공부했을 때 다항 회귀 모델의 예측
Out[16]:
array([8.70559135])
In [17]:
lin_reg.score(X_poly, y)
Out[17]:
0.9782775579000046
'Python > SikitLearn' 카테고리의 다른 글
05. (비지도학습)_K-Means (0) | 2024.11.23 |
---|---|
04. (지도학습)_Logistic Regression(로지스틱 회귀) (0) | 2024.11.23 |
02. (지도학습)_Multiple Linear Regression(다중 선형 회귀) (0) | 2024.11.23 |
01. (지도학습)_Linear Regression(선형 회귀) (0) | 2024.11.23 |