반응형

건강검진 데이터로 LDL콜레스테롤 수치 예측하는 모델 개발하기

 

(1) 데이터 전처리

 

** 데이터 불러오기

#판다스 라이브러리
import pandas as pd
pd.set_option('display.max_columns',None)
#데이터 불러오기
df=pd.read_csv('./건강검진정보.CSV', encoding = 'cp949')
df.head()

 

 

** 불필요한 데이터 삭제하기

# 가설을 참고하여 데이터 일부 삭제하기
df.drop(['치아우식증유무','치석','구강검진수검여부','시력(좌)','시력(우)','청력(좌)','청력(우)', '기준년도'], axis=1, inplace=True)
df.drop(['가입자일련번호','시도코드','성별코드'], axis=1, inplace=True)

 

 

 

** ??

# 테스트 데이터 추출하기
test=df[df['LDL콜레스테롤'].isnull()]
test

 

 

 

** 결측치 제거하고 정답데이터와 정답을 제거한 학습데이터 생성

# NaN데이터를 삭제한 데이터를 train으로 저장하기
train=df.dropna(axis=0)
# 정답데이터 생성
y=train['LDL콜레스테롤']
# 학습데이터 생성하기
x=train.drop('LDL콜레스테롤',axis=1)

 

 

** 정답데이터와 학습데이터를 학습용과 테스트용으로 분리하기

# 라이브러리
from sklearn.model_selection import train_test_split

# 사이킷럿 예시 비율대로 불러오기
x_train, x_test, y_train, y_test=train_test_split(
    x, y, test_size=0.33, random_state=42)

#학습/검증 데이터 확인
print('학습/검증 데이터 확인')
print(x_train.shape, y_train.shape, x_test.shape, y_test.shape)
학습/검증 데이터 확인
(225877, 18) (225877,) (111253, 18) (111253,)

 

 

(2) 선형회귀학습 및 추론하기

# 선형회귀 라이브러리
from sklearn.linear_model import LinearRegression

# 모델 생성
reg=LinearRegression()

#학습
reg.fit(x_train, y_train)

#기울기/절편 확인
print(f'''
기울기 coef={reg.coef_}
절편 intercept={reg.intercept_}'''
    )
기울기 coef=[-0.00211547  0.00838286  0.00403974  0.02586561 -0.00362227 -0.00478919
 -0.00181933  0.98893442 -0.18998983 -0.90963871  0.04906444  0.04162509
  0.14300268 -0.00654572  0.00520954 -0.00195242  0.08355305 -0.22383297]
절편 intercept=-7.701480658594335

 

for index, columns in enumerate(x_train.columns):
    print(f"{columns}={reg.coef_[index]}")
연령대코드(5세단위)=-0.002115473657691812
신장(5cm단위)=0.008382856140953354
체중(5kg단위)=0.004039744108514079
허리둘레=0.02586561239950237
수축기혈압=-0.003622269066453412
이완기혈압=-0.004789193384671504
식전혈당(공복혈당)=-0.0018193256235438263
총콜레스테롤=0.9889344164631583
트리글리세라이드=-0.18998982863839742
HDL콜레스테롤=-0.9096387125982928
혈색소=0.049064443694074644
요단백=0.041625090022684406
혈청크레아티닌=0.14300268237983352
혈청지오티(AST)=-0.006545718172646075
혈청지피티(ALT)=0.005209544960069729
감마지티피=-0.0019524161439548294
흡연상태=0.08355304678253972
음주여부=-0.22383296735907002

 

 

(3) 예측을 통한 최종 검증하기

#예측하기
y_pred=reg.predict(x_test)

#결과 검증을 위해 MSE라이브러리 불러오기
from sklearn.metrics import mean_squared_error
rmse=mean_squared_error(y_test, y_pred, squared=False)

# rmse 확인
print(f'''주요 feature 삭제 전 rmse = {round(rmse,3)}''')
주요 feature 삭제 전 rmse = 4.293

 

 

 

(4) 가중치의 의미

#칼럼명 확인
train.columns
Index(['연령대코드(5세단위)', '신장(5cm단위)', '체중(5kg단위)', '허리둘레', '수축기혈압', '이완기혈압',
       '식전혈당(공복혈당)', '총콜레스테롤', '트리글리세라이드', 'HDL콜레스테롤', 'LDL콜레스테롤', '혈색소',
       '요단백', '혈청크레아티닌', '혈청지오티(AST)', '혈청지피티(ALT)', '감마지티피', '흡연상태', '음주여부'],
      dtype='object')

 

기존 분석에서 가중치가 큰 feature를 삭제한 후 rmse가 어떻게 바뀌는지 확인하는것....왜?

#주요 칼럼(feature) 삭제하기
x=x.drop(['총콜레스테롤','트리글리세라이드','HDL콜레스테롤'], axis=1)

# 사이킷럿 예시대로 불러오기
x_train, x_test, y_train, y_test = train_test_split(
    x, y, test_size=.33, random_state=42)

 

 

(5) 선형회귀모델 재학습

lr=LinearRegression()
lr.fit(x_train, y_train)

# 가중치 확인
print(f''' coef
{lr.coef_}
intercept
{lr.intercept_}''')
 coef
[-1.50293683 -0.39035452  0.15513633 -0.20859166 -0.20332664  0.40434892
 -0.13615129  3.43928937 -0.68370857 -2.45956598 -0.08639088  0.06739086
 -0.01048069 -2.77843294  0.15151187]
intercept
170.57752870857038

 

(6) 가중치 비교하기

# 검증데이터로 예측하기
y_pred = lr.predict(x_test)

# 각 데이터에 대해 가중치(회귀계수) 확인
print('가중치 확인')
for index, columns in enumerate(x_train.columns):
    print(f"{columns} = {reg.coef_[index]}")
가중치 확인
연령대코드(5세단위) = -0.002115473657691812
신장(5cm단위) = 0.008382856140953354
체중(5kg단위) = 0.004039744108514079
허리둘레 = 0.02586561239950237
수축기혈압 = -0.003622269066453412
이완기혈압 = -0.004789193384671504
식전혈당(공복혈당) = -0.0018193256235438263
혈색소 = 0.9889344164631583
요단백 = -0.18998982863839742
혈청크레아티닌 = -0.9096387125982928
혈청지오티(AST) = 0.049064443694074644
혈청지피티(ALT) = 0.041625090022684406
감마지티피 = 0.14300268237983352
흡연상태 = -0.006545718172646075
음주여부 = 0.005209544960069729

 

# 주요 Feature 삭제 후의 RMSE 확인하기
RMSE_2=mean_squared_error(y_test, y_pred, squared=False)

# 가중치가 큰 특성을 삭제했을 때 영향을 많이 받는지 확인하기
print(f'''주요 feature 삭제 후 rmse = {round(RMSE_2,3)}''')
주요 feature 삭제 후 rmse = 37.185

 

 

특정 Feature의존재여부에 따라 rmse 값이 매우 크게 차이 나는 걸 확인할 수 있음

'Tech' 카테고리의 다른 글

통계학 정리  (1) 2024.08.28
Ch8 로지스틱 회귀  (0) 2024.06.27
ch8. 지도학습 AI 모델링  (0) 2024.06.25
Ch7. AI 모델링  (0) 2024.06.24
Ch6. 데이터 전처리 - 레이블 인코딩, 스케일링, 변수선택  (0) 2024.06.08

+ Recent posts