제2유형 연습하기_당뇨진척정도(회귀)

1. 라이브러리 및 데이터 확인

import pandas as pd
import numny as np

# 실기 시험 데이터셋으로 셋팅하기
diabetes = load_diabetes()
x = pd.DataFrame(diabetes.data, columns=diabetes.featurn_names)
y = pd.DataFrame(diabetes.target)

# 실기시험 데이터셋으로 설정하기
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2,
									random_state=2023)
# ,stratify=y는 분류일때만

x_test = pd.DataFrame(x_test.reset_index())
x_train = pd.DataFrame(x_train.reset_index())
y_train = pd.DataFrame(y_train.reset_index())

x_test.rename(columns={'index':'cust_id'}, inplace=True)
x_train.rename(columns={'index':'cust_id'}, inplace=True)
y_train.columns = ['cust_id', 'target']

당뇨병 환자의 질병 진행정도를 예측해보자

# 데이터 설명
print(diabetes.DESCR)

2. 데이터 탐색(EDA)

print(x_train.shape)
print(x_test.shape)
print(y_train.shape)

# 초기 데이터 확인
print(x_train.head(3))
print(x_test.head(3))
print(y_train.head(3))

# 변수명과 데이터 타입이 매칭이 되는지, 결측치가 있는지 확인해보세요
print(x_train.info())
print(x_test.info())
print(y_train.info())

# x_train과 x_test 데이터의 기초통계량을 잘 비교해보세요
print(x_train.describe())
print(x_test.describe())
print(y_train.describe())

# y데이터도 구체적으로 살펴보세요
print(y_train.head())
print(y_train.describe().T)
# 분류형일 경우 value_counts() 사용?

3. 데이터 전처리 및 분리

  1. 결측치, 2) 이상치, 3) 변수 처리하기
# 결측치 확인
print(x_train.isnull().sum())
print(x_test.isnull().sum())
print(y_train.isnull().sum())

# 결측치 제거
# df = df.dropna()

# 결측치 대체(평균값, 중앙값, 최빈값)
# 연속형 변수 : 중앙값, 평균값
# - df['변수명'].median()
# - df['변수명'].mean()
# 볌주형 변수 : 최빈값

# df['변수명'] = df['변수명'].fillna(대체할 값)

# 이상치 대체
# (참고) df['변수명'] = np.where(df['변수명'] >= 5, 대체할 값, df['변수명'])

# 변수쳐리

# 불필요한 변수 제거
# df = df.drop(columns=['변수1', '변수2']
# df = df.drop(['변수1', '변수2'], axis=1)

# 필요시 변수 추기(파생변수 생성)
# df['파생변수명'] = df['A'] * df['B'] (파생변수 생성 수식)

# 원핫인코딩
# x_train = pd.get_dummies(x_train)
# x_test = pd.get_dummies(x_test)

# 변수 처리
# 불필요한 변수(columns) 제거
# cust_id는 불필요한 변수이므로 제거
# 단, test셋의 cust_id가 나중에 제출에 필요하기 때문에 별도로 저장

cust_id = x_test['cust_id'].copy()

# 각 데이터에서 cust_id 변수 제거
x_train = x_train.drop(columns=['cust_id']) # drop(columns=['변수1', '변수2'])
x_test = x_test.drop(columns=['cust_id'])

데이터 분리

# 데이터를 훈련 세트와 검증요 세트로 분할(80% 훈련, 20% 검증용)
from sklearn.model_selection import train_test_split
x_train, x_val, y_train, y_val = train_test_split(x_train, y_train['target'],
				test_size=0.2, random_state=23)

print(x_tarin.shape)
print(x_val.shape)
print(y_train.shape)
print(y_val.shape)

4. 모델링 및 성능 평가

# 랜덤포레스트 모델 사용(참고:분류모델은 RandomForestClassifier)
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor(random_state=2023)
model.fit(x_train, y_train)

# 모델을 사용하여 테스트 데이터 예측
y_pred = model.predict(x_val)

# 모델 성능 평가(평균 제곱 오차 및 R_squared)
from sklearn.metrics import mean_squared_errer, r2_score
mse = mead_squared_error(y_val, y_pred) # (실제값, 예측값)
r2 = r2_score(y_val, y_pred)

# RMSE
rmse = mse**0.5

5. 예측값 제출

주의!