사이킷런의 linear_regression 사용하기 위한 패키지 import
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn.datasets import load_diabetes
비만 데이터 Load
X, y = load_diabetes(return_X_y=True)
print(X[:5])
print(X.shape, y.shape)
[[ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076
-0.04340085 -0.00259226 0.01990842 -0.01764613]
[-0.00188202 -0.04464164 -0.05147406 -0.02632783 -0.00844872 -0.01916334
0.07441156 -0.03949338 -0.06832974 -0.09220405]
[ 0.08529891 0.05068012 0.04445121 -0.00567061 -0.04559945 -0.03419447
-0.03235593 -0.00259226 0.00286377 -0.02593034]
[-0.08906294 -0.04464164 -0.01159501 -0.03665645 0.01219057 0.02499059
-0.03603757 0.03430886 0.02269202 -0.00936191]
[ 0.00538306 -0.04464164 -0.03638469 0.02187235 0.00393485 0.01559614
0.00814208 -0.00259226 -0.03199144 -0.04664087]]
(442, 10) (442,)
datasets = load_diabetes()
X = datasets.data
y = datasets.target
print('X:', X.shape, 'y:', y.shape)
features = datasets.feature_names
print('feature names:', features)
# 모든 특성(컬럼)들이 평균=0, 표준 편차=1 로 전처리가 되어 있는 데이터 세트.
print('X[0] =', X[0])
X: (442, 10) y: (442,)
feature names: ['age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6']
X[0] = [ 0.03807591 0.05068012 0.06169621 0.02187235 -0.0442235 -0.03482076
-0.04340085 -0.00259226 0.01990842 -0.01764613]
print('y[0] =', y[0])
y[0] = 151.0
# 선형 회귀(linear regression)란
# y = b + a * x
# y = b0 + b1 * x1 + b2 * x2 + ...
-- flatten 함수 설명
array = np.array([[1, 2],
[3, 4]])
print(array) # 2x2 행렬(2차원 배열)
[[1 2]
[3 4]]
for row in range(2):
for col in range(2):
print(array[row, col], end=' ')
1 2 3 4
flatten() 함수를 사용해보자
array_flatten = array.flatten()
print(array_flatten)
1 2 3 4
# 1개의 figure에 10개의 subplot를 그려서, 변수들과 당뇨병(y)의 대략적이 관계를 파악.
# y ~ age, y ~ sex, y ~ bmi, ...
fig, ax = plt.subplots(3, 4)
# ax: 3x4 형태의 2차원 배열(ndarray)
ax_flat = ax.flatten() # 3*4 행렬을 순차적으로 불러오기 위해 flatten 함수 사용
for i in range(len(features)):
subplot = ax_flat[i]
subplot.scatter(X[:, i], y)
subplot.set_title(features[i])
plt.show()
여기서 세 번째 그래프, bmi column을 가지고 linear_regression을 해보자!
bmi = X[:, np.newaxis, 2] # data에서 'bmi' 컬럼만 선택
# scikit-learn의 Linear Regression은 훈련 데이터 세트가 반드시 2차원 배열이어야 함.
# 2차원 배열 형태의 훈련 데이터 세트만 사용하기 때문에
print('bmi.shape:',bmi.shape)
print('bmi[:5] =',bmi[:5])
bmi.shape: (442, 1)
bmi[:5] = [[ 0.06169621]
# bmi를 학습(training)/검증(training) 세트로 분리
bmi_train = bmi[:-40]
bmi_test = bmi[-40:]
y_train = y[:-40]
y_test = y[-40:]
# 선형 회귀 모델(linear regression model) 객체 생성
regr = linear_model.LinearRegression()
# training_set로 학습
# y = b + a * bmi 선형 관계식에서 y절편 b와 기울기 a를 결정한다.
regr.fit(bmi_train, y_train)
print('coefficients:', regr.coef_)
coefficients: [955.44001079]
# 검증 세트로 테스트
y_pred = regr.predict(bmi_test)
plt.scatter(bmi_test, y_test) # 실제 값
plt.scatter(bmi_test, y_pred)
plt.show()