본문 바로가기
IT,SW,Data,Cloud,코딩/Python

20230614 하이퍼 파라메터 튜닝 - 랜덤포레스트, xgboost

by 착실하게 2023. 6. 14.
반응형

< 분류 평가지표 사용방법>

 

모델은 프레딕트, 프레딕트_프로바 둘다 사용가능

model.predict()

model.predict_proba()

 

분류 평가지표는 프레딕트 사용. ROC_AUC_SCORE만 프레딕트_프로바 사용. 

precision_score : predict 

f1_score : predict 

accuracy_score : predict 

roc_auc_score : predict_proba[:,1]

recall_score : predict 

 

<하이퍼 파라메터 튜닝방법>

# 하이퍼 파라미터 튜닝 - RandomForestClassifier
# max_depth = 트리의 깊이 제한. (3에서 12사이. 보통 3,5,7 범위 추천)
# n_estimators = 트리의 갯수. 기본값은 100이다. (100보다 낮추는 케이스는 잘 없음. 100,200,400,800,1000까지. 많이 만들수록 속도는 느려질수밖에 없음)

 

# 하이퍼 파라메터 튜닝 - XGBClassifier
# max_depth = xgboost의 기본값은 3이다. 랜덤포레스트와 동일하다. 3에서 최대12 까지. 
# n_estimators= 100이 기본값이다. 100보다 떨어뜨리지는 않는다. 랜덤포레스트와 약간 다르다. 랜덤포레스트는 트리를 여러개 만드는데, xgboost에서 이거는 약한 학습기다. xgboost는 이걸 올릴때에는 반드시 learning_rate 값은 낮춰줘야 한다. n_estimators = 100 ~ 1000, learning_rate = 0.1 ~ 0.01 

 

# 심장마비 확률이 높은 사람? 
# roc-auc, accuracy, f1 
# target : output (1 확률 높음, 0: 확률 낮음) 
# id, output 확률 # 1일 확률 
import pandas as pd 
# (1) 데이터 불러오기
test = pd.read_csv('data/heart/2/test.csv')
train = pd.read_csv('data/heart/2/train.csv')

# (2) EDA 
print(train.shape,test.shape)

train=train.drop('id',axis=1)
test_id = test.pop('id')

print(train.shape,test.shape,train.head(),test.head(),train.info(),test.info(),train.isnull().sum(),test.isnull().sum(),train.describe(),test.describe(), sep='\n')

print(train['output'].value_counts()) # 거의 반반 결과 

print(train.nunique(),test.nunique(),sep='\n')


# (3) 결측치 #결측치 없어서 패쓰
# (4) 인코딩 #object 타입 컬럼이 없어서 패쓰

# (5) 스케일링 (선택) 
# from sklearn.preprocessing import RobustScaler
# scaler = RobustScaler()
# # cols=test.columns
# cols=['trtbps','chol','thalachh','oldpeak']
# train[cols]=scaler.fit_transform(train[cols])
# test[cols]=scaler.transform(test[cols])


# (6) validation dataset 분리
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train.drop('output',axis=1),train['output'],random_state=2022,test_size=0.15)

# (7) 모델링, 평가지표
# 분류문제로 판단하였음. 분류_확률예측.
# roc-auc, accuracy, f1 로 평가하라고 지시되어있었으나, 일단 다 써보겠음. 
from sklearn.metrics import precision_score, f1_score, accuracy_score, roc_auc_score, recall_score

from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
import lightgbm

# print('LogisticRegression')
# model = LogisticRegression()
# model.fit(X_tr,y_tr)
# pred=model.predict(X_val)
# pred_proba=model.predict_proba(X_val)
# print("precision_score",precision_score(y_val,pred))
# print("f1_score",f1_score(y_val,pred))
# print("accuracy_score",accuracy_score(y_val,pred))
# print("roc_auc_score",roc_auc_score(y_val,pred_proba[:,1]))
# print("recall_score",recall_score(y_val,pred))



# print('DecisionTreeClassifier')
# model = DecisionTreeClassifier(random_state=2022)
# model.fit(X_tr,y_tr)
# pred=model.predict(X_val)
# pred_proba=model.predict_proba(X_val)
# print("precision_score",precision_score(y_val,pred))
# print("f1_score",f1_score(y_val,pred))
# print("accuracy_score",accuracy_score(y_val,pred))
# print("roc_auc_score",roc_auc_score(y_val,pred_proba[:,1]))
# print("recall_score",recall_score(y_val,pred))

# 하이퍼 파라미터 튜닝 - RandomForestClassifier
# max_depth = 트리의 깊이 제한. (3에서 12사이. 보통 3,5,7 범위 추천)
# n_estimators = 트리의 갯수. 기본값은 100이다. (100보다 낮추는 케이스는 잘 없음. 100,200,400,800,1000까지. 많이 만들수록 속도는 느려질수밖에 없음)

print('RandomForestClassifier')
model = RandomForestClassifier(random_state=2022,max_depth=5,n_estimators=200)
model.fit(X_tr,y_tr)
pred=model.predict(X_val)
pred_proba=model.predict_proba(X_val)
# print("precision_score",precision_score(y_val,pred))
print("f1_score",f1_score(y_val,pred))
print("accuracy_score",accuracy_score(y_val,pred))
print("roc_auc_score",roc_auc_score(y_val,pred_proba[:,1]))
# print("recall_score",recall_score(y_val,pred))

# 평가지표결과 기록하고 비교하기! 
#baseline
#max_depth=3
#max_depth=5
#max_depth=7
#max_depth=5,n_estimator=200
#max_depth=5,n_estimator=400



# 하이퍼 파라메터 튜닝 - XGBClassifier
# max_depth = xgboost의 기본값은 3이다. 랜덤포레스트와 동일하다. 3에서 최대12 까지. 
# n_estimators= 100이 기본값이다. 100보다 떨어뜨리지는 않는다. 랜덤포레스트와 약간 다르다. 랜덤포레스트는 트리를 여러개 만드는데, xgboost에서 이거는 약한 학습기다. xgboost는 이걸 올릴때에는 반드시 learning_rate 값은 낮춰줘야 한다. n_estimators = 100 ~ 1000, learning_rate = 0.1 ~ 0.01 

print('XGBClassifier')
model = XGBClassifier(random_state=2022,max_depth=5,n_estimators=600,learning_rate=0.01)
model.fit(X_tr,y_tr)
pred=model.predict(X_val)
pred_proba=model.predict_proba(X_val)
# print("precision_score",precision_score(y_val,pred))
print("f1_score",f1_score(y_val,pred))
print("accuracy_score",accuracy_score(y_val,pred))
print("roc_auc_score",roc_auc_score(y_val,pred_proba[:,1]))
# print("recall_score",recall_score(y_val,pred))

# max_depth =3 
# max_depth =5
# max_depth =7
# max_depth =5, n_estimators=600 learning_rate=0.01


# print('lightgbm')
# model = lightgbm.LGBMClassifier(random_state=2022)
# model.fit(X_tr,y_tr)
# pred=model.predict(X_val)
# pred_proba=model.predict_proba(X_val)
# print("precision_score",precision_score(y_val,pred))
# print("f1_score",f1_score(y_val,pred))
# print("accuracy_score",accuracy_score(y_val,pred))
# print("roc_auc_score",roc_auc_score(y_val,pred_proba[:,1]))
# print("recall_score",recall_score(y_val,pred))





# (8) 제출

# pred=model.predict(test)
pred_proba=model.predict_proba(test)

submit = pd.DataFrame({
  'id' : test_id,
  'output' : pred_proba[:,1] 
})
submit.to_csv('data/heart/2/20230614_01.csv',index=False)

# 시험 환경에서 제출한 submit 파일 읽어와서 내용 확인 해보기! 

# 번외 - 자체 채점 
y_test = pd.read_csv('data/heart/2/y_test.csv') 
# print(y_test.head())
print("====answer====")
# print("precision_score",precision_score(y_test,pred))
# print("f1_score",f1_score(y_test,pred))
# print("accuracy_score",accuracy_score(y_test,pred))
print("roc_auc_score",roc_auc_score(y_test,pred_proba[:,1]))
# print("recall_score",recall_score(y_test,pred))
반응형

댓글