1 Diabetes 데이터와 Linear Regression
당뇨병 진행도와 관련된 데이터를 이용해 당뇨병 진행을 예측하는 Linear Regression을 학습해 보겠습니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(2021)
1.1 1. Data
1.1.1 1.1 Data Load
데이터는 sklearn.datasets의 load_diabetes 함수를 이용해 받을 수 있습니다.
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
더보기
{'data': array([[ 0.03807591, 0.05068012, 0.06169621, ..., -0.00259226,
0.01990842, -0.01764613],
[-0.00188202, -0.04464164, -0.05147406, ..., -0.03949338,
-0.06832974, -0.09220405],
[ 0.08529891, 0.05068012, 0.04445121, ..., -0.00259226,
0.00286377, -0.02593034],
...,
[ 0.04170844, 0.05068012, -0.01590626, ..., -0.01107952,
-0.04687948, 0.01549073],
[-0.04547248, -0.04464164, 0.03906215, ..., 0.02655962,
0.04452837, -0.02593034],
[-0.04547248, -0.04464164, -0.0730303 , ..., -0.03949338,
-0.00421986, 0.00306441]]),
'target': array([151., 75., 141., 206., 135., 97., 138., 63., 110., 310., 101.,
69., 179., 185., 118., 171., 166., 144., 97., 168., 68., 49.,
68., 245., 184., 202., 137., 85., 131., 283., 129., 59., 341.,
87., 65., 102., 265., 276., 252., 90., 100., 55., 61., 92.,
259., 53., 190., 142., 75., 142., 155., 225., 59., 104., 182.,
128., 52., 37., 170., 170., 61., 144., 52., 128., 71., 163.,
150., 97., 160., 178., 48., 270., 202., 111., 85., 42., 170.,
200., 252., 113., 143., 51., 52., 210., 65., 141., 55., 134.,
42., 111., 98., 164., 48., 96., 90., 162., 150., 279., 92.,
83., 128., 102., 302., 198., 95., 53., 134., 144., 232., 81.,
104., 59., 246., 297., 258., 229., 275., 281., 179., 200., 200.,
173., 180., 84., 121., 161., 99., 109., 115., 268., 274., 158.,
107., 83., 103., 272., 85., 280., 336., 281., 118., 317., 235.,
60., 174., 259., 178., 128., 96., 126., 288., 88., 292., 71.,
197., 186., 25., 84., 96., 195., 53., 217., 172., 131., 214.,
59., 70., 220., 268., 152., 47., 74., 295., 101., 151., 127.,
237., 225., 81., 151., 107., 64., 138., 185., 265., 101., 137.,
143., 141., 79., 292., 178., 91., 116., 86., 122., 72., 129.,
142., 90., 158., 39., 196., 222., 277., 99., 196., 202., 155.,
77., 191., 70., 73., 49., 65., 263., 248., 296., 214., 185.,
78., 93., 252., 150., 77., 208., 77., 108., 160., 53., 220.,
154., 259., 90., 246., 124., 67., 72., 257., 262., 275., 177.,
71., 47., 187., 125., 78., 51., 258., 215., 303., 243., 91.,
150., 310., 153., 346., 63., 89., 50., 39., 103., 308., 116.,
145., 74., 45., 115., 264., 87., 202., 127., 182., 241., 66.,
94., 283., 64., 102., 200., 265., 94., 230., 181., 156., 233.,
60., 219., 80., 68., 332., 248., 84., 200., 55., 85., 89.,
31., 129., 83., 275., 65., 198., 236., 253., 124., 44., 172.,
114., 142., 109., 180., 144., 163., 147., 97., 220., 190., 109.,
191., 122., 230., 242., 248., 249., 192., 131., 237., 78., 135.,
244., 199., 270., 164., 72., 96., 306., 91., 214., 95., 216.,
263., 178., 113., 200., 139., 139., 88., 148., 88., 243., 71.,
77., 109., 272., 60., 54., 221., 90., 311., 281., 182., 321.,
58., 262., 206., 233., 242., 123., 167., 63., 197., 71., 168.,
140., 217., 121., 235., 245., 40., 52., 104., 132., 88., 69.,
219., 72., 201., 110., 51., 277., 63., 118., 69., 273., 258.,
43., 198., 242., 232., 175., 93., 168., 275., 293., 281., 72.,
140., 189., 181., 209., 136., 261., 113., 131., 174., 257., 55.,
84., 42., 146., 212., 233., 91., 111., 152., 120., 67., 310.,
94., 183., 66., 173., 72., 49., 64., 48., 178., 104., 132.,
220., 57.]),
'frame': None,
'DESCR': '.. _diabetes_dataset:\n\nDiabetes dataset\n----------------\n\nTen baseline variables, age, sex, body mass index, average blood\npressure, and six blood serum measurements were obtained for each of n =\n442 diabetes patients, as well as the response of interest, a\nquantitative measure of disease progression one year after baseline.\n\n**Data Set Characteristics:**\n\n :Number of Instances: 442\n\n :Number of Attributes: First 10 columns are numeric predictive values\n\n :Target: Column 11 is a quantitative measure of disease progression one year after baseline\n\n :Attribute Information:\n - age age in years\n - sex\n - bmi body mass index\n - bp average blood pressure\n - s1 tc, total serum cholesterol\n - s2 ldl, low-density lipoproteins\n - s3 hdl, high-density lipoproteins\n - s4 tch, total cholesterol / HDL\n - s5 ltg, possibly log of serum triglycerides level\n - s6 glu, blood sugar level\n\nNote: Each of these 10 feature variables have been mean centered and scaled by the standard deviation times `n_samples` (i.e. the sum of squares of each column totals 1).\n\nSource URL:\nhttps://www4.stat.ncsu.edu/~boos/var.select/diabetes.html\n\nFor more information see:\nBradley Efron, Trevor Hastie, Iain Johnstone and Robert Tibshirani (2004) "Least Angle Regression," Annals of Statistics (with discussion), 407-499.\n(https://web.stanford.edu/~hastie/Papers/LARS/LeastAngle_2002.pdf)',
'feature_names': ['age',
'sex',
'bmi',
'bp',
's1',
's2',
's3',
's4',
's5',
's6'],
'data_filename': 'diabetes_data.csv.gz',
'target_filename': 'diabetes_target.csv.gz',
'data_module': 'sklearn.datasets.data'}
당뇨병 데이터에서 사용되는 변수명은 feature_names 키 값으로 들어 있습니다.
변수명과 변수에 대한 설명은 다음과 같습니다.
- age: 나이
- sex: 성별
- bmi: Body mass index
- bp: Average blood pressure
- 혈청에 대한 6가지 지표들
- S1, S2, S3, S4, S5, S6
diabetes["feature_names"]
[ 'age', 'sex', 'bmi', 'bp', 's1', 's2', 's3', 's4', 's5', 's6' ]
데이터와 정답을 확인해 보겠습니다.
data, target = diabetes["data"], diabetes["target"]
data[0]
>>>
array([ 0.03807591, 0.05068012, 0.06169621, 0.02187235, -0.0442235 ,
-0.03482076, -0.04340085, -0.00259226, 0.01990842, -0.01764613])
target[0]
>>> 151.0
1.1.2 1.2 Data EDA
df = pd.DataFrame(data, columns=diabetes["feature_names"])
df.describe()
1.1.3 1.3 Data Split
sklearn.model_selection의 train_test_split함수를 이용해 데이터를 나누겠습니다.
train_test_split(
*arrays,
test_size=None,
train_size=None,
random_state=None,
shuffle=True,
stratify=None,
)
- *arrays: 입력은 array로 이루어진 데이터을 받습니다.
- test_size: test로 분할될 사이즈를 정합니다.
- train_size: train으로 분할될 사이즈를 정합니다.
- random_state: 다음에도 같은 값을 얻기 위해서 난수를 고정합니다
- shuffle: 데이터를 섞을지 말지 결정합니다.
- stratify: 데이터를 나눌 때 정답의 분포를 반영합니다.
from sklearn.model_selection import train_test_split
train_data, test_data, train_target, test_target = train_test_split(data, target, test_size=0.3)
train과 test를 7:3의 비율로 나누었습니다.
실제로 잘 나누어졌는지 확인해보겠습니다.
len(data), len(train_data), len(test_data)
>>> (442, 309, 133)
print("train ratio : {:.2f}".format(len(train_data)/len(data)))
print("test ratio : {:.2f}".format(len(test_data)/len(data)))
train ratio : 0.70
test ratio : 0.30
1.2 2. Multivariate Regression
1.2.1 2.1 학습
from sklearn.linear_model import LinearRegression
multi_regressor = LinearRegression()
multi_regressor.fit(train_data, train_target)
1.2.2 2.2 회귀식 확인
multi_regressor.intercept_
>>> 147.71524417759434
multi_regressor.coef_
>>> array([ 15.28529701, -218.59128442, 545.19999487, 263.6592052 ,
-582.66349612, 317.33684049, 48.53542723, 215.51374612,
655.7965519 , 64.04030953])
1.2.3 2.3 예측
multi_train_pred = multi_regressor.predict(train_data)
multi_test_pred = multi_regressor.predict(test_data)
1.2.4 2.4 평가
평가는 sklearn.metrics 의 mean_squared_error를 이용하겠습니다. mean_squared_error는 두 값의 차이의 제곱의 평균을 계산해줍니다.
from sklearn.metrics import mean_squared_error
multi_train_mse = mean_squared_error(multi_train_pred, train_target)
multi_test_mse = mean_squared_error(multi_test_pred, test_target)
print(f"Multi Regression Train MSE is {multi_train_mse:.4f}")
print(f"Multi Regression Test MSE is {multi_test_mse:.4f}")
1.3 3. Ridge Regression
1.3.1 3.1 학습
from sklearn.linear_model import Ridge
ridge_regressor = Ridge()
ridge_regressor.fit(train_data, train_target)
1.3.2 3.2 회귀식 확인
ridge_regressor.intercept_
>>> 147.74060119766182
multi_regressor.coef_
>>>
array([ 15.28529701, -218.59128442, 545.19999487, 263.6592052 ,
-582.66349612, 317.33684049, 48.53542723, 215.51374612,
655.7965519 , 64.04030953])
ridge_regressor.coef_
>>>
array([ 46.89201977, -55.64009506, 270.71747699, 158.68867814,
23.59440223, -11.13019705, -130.05870493, 122.00237806,
225.92117758, 107.08728777])
1.3.3 3.3 예측
ridge_train_pred = ridge_regressor.predict(train_data)
ridge_test_pred = ridge_regressor.predict(test_data)
1.3.4 3.4 평가
ridge_train_mse = mean_squared_error(ridge_train_pred, train_target)
ridge_test_mse = mean_squared_error(ridge_test_pred, test_target)
print(f"Ridge Regression Train MSE is {ridge_train_mse:.4f}")
print(f"Ridge Regression Test MSE is {ridge_test_mse:.4f}")
>>>
Ridge Regression Train MSE is 3556.1983
Ridge Regression Test MSE is 3200.4051
1.4 4. LASSO Regression
1.4.1 4.1 학습
from sklearn.linear_model import Lasso
lasso_regressor = Lasso()
lasso_regressor.fit(train_data, train_target)
1.4.2 4.2 회귀식 확인
lasso_regressor.intercept_
>>>
148.13825690433762
lasso_regressor.coef_
>>>
array([ 0. , 0. , 377.69541767, 0. ,
0. , 0. , -0. , 0. ,
316.05550058, 0. ])
np.array(diabetes["feature_names"])[lasso_regressor.coef_ != 0]
>>>
array(['bmi', 's5'], dtype='<U3')
1.4.3 4.3 예측
lasso_train_pred = lasso_regressor.predict(train_data)
lasso_test_pred = lasso_regressor.predict(test_data)
1.4.4 4.4 평가
lasso_train_mse = mean_squared_error(lasso_train_pred, train_target)
lasso_test_mse = mean_squared_error(lasso_test_pred, test_target)
print(f"LASSO Regression Train MSE is {lasso_train_mse:.4f}")
print(f"LASSO Regression Test MSE is {lasso_test_mse:.4f}")
LASSO Regression Train MSE is 3897.9528
LASSO Regression Test MSE is 3581.6843
1.5 5. 마무리
1.5.1 5.1 평가
print(f"Multi Regression Test MSE is {multi_test_mse:.4f}")
print(f"Ridge Regression Test MSE is {ridge_test_mse:.4f}")
print(f"LASSO Regression Test MSE is {lasso_test_mse:.4f}")
Multi Regression Test MSE is 2562.2750
Ridge Regression Test MSE is 3200.4051
LASSO Regression Test MSE is 3581.6843
1.5.2 5.2 예측값과 실제값의 관계 Plot
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15, 5))
preds = [
("Multi regression", multi_test_pred),
("Ridge regression", ridge_test_pred),
("LASSO regression", lasso_test_pred),
]
for idx, (name, test_pred) in enumerate(preds):
ax = axes[idx]
ax.scatter(test_pred, test_target)
ax.plot(np.linspace(0, 330, 100), np.linspace(0, 330, 100), color="red")
ax.set_xlabel("Predict")
ax.set_ylabel("Real")
ax.set_title(name)
'Machine Learning > 머신러닝 온라인 강의' 카테고리의 다른 글
CH03_02. 폐암의 양성 음성 분류(실습) (0) | 2022.10.07 |
---|---|
CH03_01. Logtistic Regression (0) | 2022.10.07 |
CH02-05. Regularization (1) | 2022.10.03 |
CH02-03. Linear Regression 실습하기 (Python) (0) | 2022.10.03 |
CH02-02. Linear Regression 심화 (0) | 2022.10.03 |