반응형
건강검진 데이터로 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 |