머신러닝의 다양한 모델에 대해 알아보고, 훈련, 평가, Gridsearch를 이용한 최적의 파라미터 찾는 방법 등을 알아본다.
목차
< logisticRegression >
1. Model Building
★ 모델 설계 및 학습
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(X_train, y_train)
array([1., 1., 0., ..., 1., 1., 0.])
★ 예측
y_pred = lr.predict(X_test)
y_pred
array([1., 1., 0., ..., 1., 1., 0.])
2. 피처 중요도
1) feature importance 확인하기
★ coef 절대값이 클 수록 해당 피처의 중요도 높음
lr.coef_ : 회귀계수(2차원출력)
lr.coef_
array([[ 3.79084262e-04, -1.49813091e-05, -7.29626435e-07,
8.37010244e-03, -2.21317256e-06, 6.43304607e-06,
-2.54137725e-05, -5.66106961e-04]])
2) feature_names_in_
컬럼이름
lr.feature_names_in_
array(['claim_status_opinion', 'author_ban_status_banned',
'author_ban_status_under review', 'video_duration_sec',
'video_view_count', 'video_share_count', 'video_download_count',
'video_comment_count'], dtype=object)
3) dataframe 만들기
coef= pd.DataFrame({'coefficients Name': lr.feature_names_in_, 'coefficients': lr.coef_[0]})
coef
4) sort_values(by=?, key=abs)
절대값(abs) 기준 정렬하기
coef.sort_values(by='coefficients', key=abs).reset_index(drop=True)
5) feature_importances_
- tree기반 모델에서는 피처 중요도 확인하고 싶을 때 feature_importances_ 이용 가능
- logisticRegression은 없음 : - lr.feature_importances_ (X)
3. 분류 평가
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
1) confusion_matrix(y_test, y_pred)
from sklearn.metrics import confusion_matrix
result= confusion_matrix(y_test, y_pred)
print(result)
[[3304 3757]
[1162 6085]]
2) ConfusionMatrixDisplay(혼동행렬).plot()
from sklearn.metrics import ConfusionMatrixDisplay
ConfusionMatrixDisplay(result).plot()
plt.show()
3) Classification_report(y_test, y_pred, target_names=?)
from sklearn.metrics import classification_report
target_labels=['verified', 'not verified']
print(classification_report(y_test, y_pred, target_names=target_labels))
4) recall, precision, f1_score, accuracy_score
from sklearn.metrics import recall_score, precision_score, f1_score, accuracy_score
accuracy_score(y_test, y_pred)
precision_scre(y_test, y_pred)
recall_score(y_test, y_pred)
f1_score(y_test, y_pred)
< random forest model >
1. 모델
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()
2. 하이퍼파라미터 튜닝
params = {'n_estimators': [50, 100],
'max_depth': [10, 50],
'min_samples_leaf':[1, 5],
'min_samples_split': [ 10,20],
'max_features':['sqrt'],
'max_samples':[.5, .7]}
1) n_estimators : 트리의 개수
기본값 : 100
n_estimators : [100,200,300]
2) max_depth : 개별 트리의 최대 깊이, 깊이가 깊을수록 모델은 데이터를 세밀하게 학습하나 과적합의 위험 높아짐
기본값 : None
max_depth : [10,20,None]
3) min_samples_leaf : 리프 노드의 최소 샘플 수
기본값 : 1
min_samples_leaf : [1,2,4]
4) min_samples_split : 노드 분할 위한 최소 샘플 수. 값이 낮으면 모델이 복잡, 높으면 과적합 예방. 0.01같은 비율 또는 2 같은 정수 값으로 샘플 수를 설정함.
기본값 : 2
예를 들어 min_samples_split=0.1이라면 100개의 데이터 중 0.1은 10개이므로, 노드에 최소 10개의 샘플이 있어야 분할이 가능하다.
min_samples_split : [2, 4, 10]
5) max_features : 각 노드에서 분할에 사용할 최대 특성 수. sqrt는 특성 수의 제곱근만큼 사용함.
기본값 :'auto', 분류문제에서 'sqrt' 선택됨
예를 들어 컬럼이 4개라면 sqrt(4) = 2개 만큼 쓰겠다.
max_features :['auto', 'sqrt', 'log2']
6) max_samples : 각 트리가 학습할 때 사용하는 랜덤한 샘플의 비율, 전체의 몇 퍼센트의 데이터 사용할지? 과적합을 방지하며, 일부 데이터만 사용하기에 학습 속도도 개선됨
0 < max_samples <=1
기본값: None(전체 데이터셋)
예를 들어 총 데이터가 100개이며 max_samples=0.5라면 50개의 데이터를 랜덤하게 선택해 학습함
max_samples : [0.5, 0.7, 0.9]
6) bootstrap : 부트스트랩 샘플링 사용
부트스트랩 : 중복을 허용한 랜덤 샘플링 --> 다양성이 증가하여 오버피팅 방지
기본값 : True
bootstrap = True
3. GridSearch 최적의 파라미터 찾기
1) scoring
gridsearchCV가 각 하이퍼파라미터 조합에 대해 모델 성능을 평가하는데 사용할 다양한 성능 메트릭 정의
scoring = {'accuracy', 'precision', 'recall', 'f1'}
2) refit
최적의 모델으로 다시 학습할 때 기준이 될 메트릭
refit='recall'
3) 단일 metric
만약 단일 metric으로 평가하려면 scroing='accuracy'처럼 단일 metric을 적용함.
refit은 자동으로 해당 metric이 적용되기 때문
4) cv
교차검증전략
5개의 fold로 나눠서 검증함
cv=5
5) n_jobs
사용할 cpu코어 개수, -1은 가능한 모든 코어 사용하겠다는 의미
n_jobs=-1
6) verbose
진행 상황 출력 여부, 1은 모두 출력하겠다는 의미
verbose=1
7) error_score
어떤 에러인지 설명해주기 때문에 좋음
error_score ='raise'
8) %%time
매직코맨드 %, %% + time을 이용해서 시간을 보여줄 수 있다.
%%time
- 전체 코드 -
from sklearn.model_selection import GridSearchCV
scoring = {'accuracy':'accuracy',
'precision':'precision',
'recall':'recall',
'f1':'f1'}
grid_rf = GridSearchCV(estimator = rf,
param_grid =params,
scoring = scoring,
refit = 'accuracy',
cv=5,
verbose=1,
n_jobs=-1,
error_score='raise')
grid_rf.fit(x_tr, y_tr)
9) 최적의 하이퍼파라미터
grid_rf.best_params_
{'max_depth': 50,
'max_features': 'sqrt',
'max_samples': 0.7,
'min_samples_leaf': 5,
'min_samples_split': 10,
'n_estimators': 50}
10) 하이퍼파라미터 평가
# average validation score
grid_rf.best_score_
0.993995633187773
< XGBoost >
Extreme Gradient Boosting
회귀 / 분류와 같은 예측 모델에 사용함
트리 기반의 앙상블 학습 알고리즘
모델 XGBoostClassifier
from xgboost import XGBClassifier
1) objective : 목적함수
★ binary : logistic
이진 분류를 위한 로지스틱 회귀 (0 또는 1의 이진 출력)
xgb = XGBClassifier(objective = 'binary:logistic', random_state=0)
★ multi : softmax
다중 클래스 분류 문제에서 가장 높은 확률을 가진 클래스의 인덱스 반환
num_class 파라미터 추가하여 클래스 수를 설정해야 함
xgb = XGBClassifier(objective='multi:softmax', num_class=3, random_state=42)
2) 하이퍼파라미터
cv_params = {'max_depth': [4,8,12],
'min_child_weight': [3, 5],
'learning_rate': [0.01, 0.1],
'n_estimators': [300, 500]
}
★ min_child_wieght
각 트리의 리프 노드를 분할할 때 최소로 필요한 데이터 샘플 수이다.
규제 파라미터로서 역할을 하고, 크기가 클 수록 underfit이 발생할 가능성이 높다.
0-1 사이의 값을 취한다.
★ learning_rate
각 트리가 이전 트리의 오차를 얼마나 크게 반영하여 학습할지를 결정한다.
lr이 크면 이전 트리의 오차를 크게 반영하기에 모델학습이 빠르게 되지만, 수렴하지 못하고 발산할 가능성이 있다.
lr이 작으면 이전 트리의 오차를 작게 반영하여 모델이 안정적으로 수렴하나, 학습이 느려질 수 있다.
3) 평가
모델성능평가지표
각 지표에 대해 교차검증 결과가 계산됨
scoring = {'accuracy', 'recall', 'f1', 'precision'}
4) cv
cross validation 교차 검증
데이터 분할에 따른 편향을 줄이고 모델의 일반화 성능을 평가할 수 있음
데이터를 훈련 세트와 검증세트로 여러 번 나누어 각 폴드에서 모델 성능을 평가함.
예를 들어 cv=3이라하면, 3개의 폴드가 있다.
1) | 훈련 | 훈련 | 검증 | 평가=a |
2) | 훈련 | 검증 | 훈련 | 평가=b |
3) | 검증 | 훈련 | 훈련 | 평가=c |
(a+b+c)/3 |
여기서 각각 모델을 훈련 및 평가한다. 그 결과로 3개의 점수가 생성된다. 이 점수는 각 폴드의 성능을 대변한다. 이 점수들의 평균을 계산한 것이 최종 점수가 된다.
5) refit
여러 지표 중 특정 지표를 기준으로 모델을 재학습
만약 refit='recall'이라면, 교차 검증 후 recall 점수가 가장 높은 하이퍼파라미터 조합으로 모델을 재학습함
6) 훈련
grid_xgb.fit(x_tr, y_tr)
7) best_score_
grid_xgb.best_score_
8) best_params_
gird_xgb.best_params_
데이터분석 모델링
'파이썬 > 판다스' 카테고리의 다른 글
pandas 배우기 6편 enocoding 한글 인코딩 utf-8 euc-kr (0) | 2024.11.15 |
---|---|
pandas 배우기 4편 데이터 전처리 : upsampling(업샘플링), outlier(이상치) , 상관관계, 차원변환 (0) | 2024.11.08 |
pandas 배우기 3편 데이터시각화: 빅분기 ADP 데이터분석 시험, 파이차트, 히스토그램, 박스플랏, 스케터플랏,히트맵 (1) | 2024.11.07 |
pandas 배우기 2편 데이터전처리 :빅분기 ADP 데이터분석 요약 (0) | 2024.10.11 |
pandas 배우기 1편 EDA : 빅분기 ADP 데이터분석 시험 요약 (0) | 2024.10.11 |