y = b + a * x: linear regression
y = b + a1 * x + a2 * x^2 -> 선형 회귀로 b, a1, a2를 결정할 수 있다.
y = b + a1 * x1 + a2 * x2: 선형 회귀
y = b + a1 * x1 + a2 * x2 + a3 * x1^2 + a4 * x1 * x2 + a5 * x2^2
import numpy as np
import matplotlib.pyplot as plt
# Training Set - data : 범위 -3 <= x < 3 의 x값의 집합 100개 생성
np.random.seed(1216)
X = 6 * np.random.rand(100, 1) - 3 # -3 <= x < 3
print('X =', X[:5])
X = [[ 2.9735891 ]
[ 0.74046546]
[ 2.25656212]
[ 2.33626717]
[-0.67942513]]
y값의 랜덤 집합 생성 + matplotlib.pyplot으로 그래프 구현
# target
y = 0.5 + 2 * X + X**2 + np.random.randn(100, 1)
plt.scatter(X, y)
plt.show()
fit_transform 함수를 설명하기 위해 먼저 np.array 함수 실행 예시하겠습니다.
A = np.array([[1], [2], [3]]) # 3x1 행렬(2차원 리스트)
print('A =', A)
A = [[1]
[2]
[3]]
PolynominalFeatures 객체 생성
fit_transform메소드를 사용하면 x값에 대한 제곱값의 칼럼이 옆에 추가됩니다.
poly_feature = PolynomialFeatures(degree=2, include_bias=False)
A_poly = poly_feature.fit_transform(A) # x^2 컬럼이 추가됨
print('A_poly =', A_poly)
A_poly = [[1. 1.]
[2. 4.]
[3. 9.]]
2차원 행렬에 대해서도 적용해보겠습니다.
B = np.array([[1, 2], [3, 4]]) # 2x2 행렬(2차원 리스트
print('B =', B)
B = [[1 2]
[3 4]]
1차 미지수, 0차 미지수에 대하여 0차, 1차, 2차 미지수가 추가된 모습
B_poly = poly_feature.fit_transform(B) # x1^2, x1*x2, x2^2 컬럼이 추가됨
print('B_poly =', B_poly)
B_poly = [[ 1. 2. 1. 2. 4.]
[ 3. 4. 9. 12. 16.]]
X값에 대하여 fit_transform을 적용 -> 다중회귀를 변수가 여러개인 선형회귀로 변환하여 적용하기 위함
X_poly = poly_feature.fit_transform(X)
print('X_poly =', X_poly[:5])
X_poly = [[ 2.9735891 8.84223212]
[ 0.74046546 0.5482891 ]
[ 2.25656212 5.09207262]
[ 2.33626717 5.45814428]
[-0.67942513 0.46161851]]
fit 메소드를 통해 회귀분석 실행
lin_reg = LinearRegression() # LinearRegression 객체 생성
lin_reg.fit(X_poly, y) # 회귀분석 실행 메소드
print('intercept:', lin_reg.intercept_)
print('coefficients:', lin_reg.coef_)
# y = b + a1 * x + a2 * x^2
intercept: [0.53611387]
coefficients: [[2.02456163 0.97973891]]
linspace함수 : -3에서 3 사이에 100개의 균일한 간격으로 점 생성
reshape함수 : 데이터 타입을 100, 1의 행렬로 변환
X_test = np.linspace(-3, 3, 100).reshape(100, 1)
print(X_test[:5])
print(X_test[-5:])
[[-3. ]
[-2.93939394]
[-2.87878788]
[-2.81818182]
[-2.75757576]]
[[2.75757576]
[2.81818182]
[2.87878788]
[2.93939394]
[3. ]]
X_test를 회귀분석에 맞게 fit_transform 실행
X_test_poly = poly_feature.fit_transform(X_test)
y_pred = lin_reg.predict(X_test_poly) # lin_reg 선형회귀분석을 토대로 predict 실행
plt.scatter(X, y)
plt.plot(X_test, y_pred, 'r') # predict한 결과를 그래프로 구현
plt.show()