< 분류 평가지표 사용방법>
모델은 프레딕트, 프레딕트_프로바 둘다 사용가능
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))
'IT,SW,Data,Cloud,코딩 > Python' 카테고리의 다른 글
20230617 빅분기 3유형 가설검정 t-test, one-way ANOVA (1) | 2023.06.17 |
---|---|
20230616 빅분기공부 (0) | 2023.06.17 |
20230615 머신러닝 공부, 시험환경 꿀팁 등 (0) | 2023.06.15 |
20230614 kaggle 따라치기 - 타이타닉 튜토리얼 (0) | 2023.06.14 |
20230614 파이썬공부 - 모델링, 평가지표 (0) | 2023.06.14 |
20230613 파이썬공부 (0) | 2023.06.13 |
20230612 복습문제 (0) | 2023.06.12 |
20230611 빅분기 작업형1 모의문제 (0) | 2023.06.11 |
댓글