목차
<Regression>
- 1-1. Simple Regression
- 1-2. Multiple Regression
- 1-3. Ridge Regression
- 1-4. Logistic Regresssion
<Tree Base Model>
- 2-1. Decision Trees
- 2-2. Random Forests
- 2-3. Evaluation Metrics 평가지표
- 2-4. Model Selection
<예측모델 적용>
- 3-1. Choose your ML problems
- 3-2. Data Wrangling
- 3-3. 특성중요도 계산
- 3-4. Interpreting ML Model
Regression
1-1. Simple Regression
(1) 기준모델
: 예측 모델을 만들기 전에 가장 간단하면서도 직관적이면서 최소한의 성능을 나타내는 기준이 되는 모델
- 분류문제: 타겟의 최빈 클래스
- 회귀문제: 타겟의 평균값
- 시계열회귀문제: 이전 타임스탬프의 값
(2) 예측모델
: 회귀분석에서 중요한 개념은 예측값과 잔차(residual)
: 예측값은 만들어진 모델이 추정하는 값이고, 잔차는 예측값과 관측값의 차이
: 회귀선은 잔차 제곱들의 합인 RSS(residual sum of squares)를 최소화 하는 직선
(RSS = SSE / Sum of Square Error)
(3) scikit-learn을 사용한 선형회귀모델
: scikit-learn은 머신러닝 모델을 만드는데 가장 많이 사용하는 라이브러리
: 계수 (Coefficients) , 절편 (intercept)
khalidpark/machinelearning_whitepaper
machine learning. Contribute to khalidpark/machinelearning_whitepaper development by creating an account on GitHub.
github.com
(4) 머신러닝 모델의 일반적인 흐름
1-2. Multiple Regression
(1) 학습데이터 / 테스트 데이터
: 데이터를 훈련/테스트 데이터로 나누어야 우리가 만든 모델의 예측 성능을 제대로 평가할 수 있다.
(2) 다중선형회귀 모델
: 특성을 2개 이상 선택하여 선형회귀 모델을 만들 때
[코드내용]
(1) 데이터 나누기
(2) 기준모델
(3) 단순선형회귀모델
(4) 다중선형회귀모델
(5) 시각화
(6) 회귀계수해석
khalidpark/machinelearning_whitepaper
machine learning. Contribute to khalidpark/machinelearning_whitepaper development by creating an account on GitHub.
github.com
(3) 회귀모델 평가지표들
: MSE (Mean Squared Error)
: MAE (Mean absolute error)
: RMSE (Root Mean Squared Error)
: R-squared (Coefficient of determination)
(4) 과적합과 과소적합
: 일반화(generalization)
훈련데이터에서와 같이 테스트데이터에서도 좋은 성능을 내는 모델은 일반화가 잘 된 모델
: 과적합
모델이 훈련데이터에만 특수한 성질을 과하게 학습해 일반화를 못해 결국 테스트데이터에서 오차가 커지는 현상
: 과소적합
훈련데이터에 과적합도 못하고 일반화 성질도 학습하지 못해, 훈련/테스트 데이터 모두에서 오차가 크게 나오는 경우
(5) 분산(Bias) / 편향(Variance) 트레이드오프
: 분산이 높은경우
모델이 학습 데이터의 노이즈에 민감하게 적합하여 테스트데이터에서 일반화를 잘 못하는 경우 즉 과적합 상태
: 편향이 높은경우
모델이 학습 데이터에서, 특성과 타겟 변수의 관계를 잘 파악하지 못해 과소적합 상태
1-3. Ridge Regression
(1) 원핫인코딩
: 범주형(Cagegorical) 자료를 다루기 위한 기법
: 순서가 없는 명목형(nominal)과, 순서가 있는 순서형(ordinal)으로 나뉜다.
: 카테고리가 너무 많은 경우(high cardinality)에는 사용하기 적합하지 않다
: get_dummy를 사용한 방법 , category_encoders 라이브러리를 사용한 방법
from category_encoders import OneHotEncoder
## 원핫 인코딩
encoder = OneHotEncoder(use_cat_names = True)
X_train = encoder.fit_transform(X_train)
X_test = encoder.transform(X_test)
(2) 특성선택 (feature selection)
: 특성공학은 과제에 적합한 특성을 만들어 내는 과정
: 사이킷런의 SelectKBest를 사용해서 회귀모델에 중요한 특성을 선택
## f_regresison, SelectKBest
from sklearn.feature_selection import f_regression, SelectKBest
## selctor 정의
selector = SelectKBest(score_func=f_regression, k=10)
## 학습데이터에 fit_transform
X_train_selected = selector.fit_transform(X_train, y_train)
## 테스트 데이터는 transform
X_test_selected = selector.transform(X_test)
all_names = X_train.columns
## selector.get_support()
selected_mask = selector.get_support()
## 선택된 특성들
selected_names = all_names[selected_mask]
## 선택되지 않은 특성들
unselected_names = all_names[~selected_mask]
print('Selected names: ', selected_names)
print('Unselected names: ', unselected_names)
(3) Ridge Regression
: Ridge 회귀는 과적합을 줄이기 위해서 사용하는 것
: Ridge 회귀는 이 편향을 조금 더하고, 분산을 줄이는 방법으로 정규화(Regularization)를 수행
: 정규화는 모델을 변형하여 과적합을 완화해 일반화 성능을 높여주기 위한 기법
: 람다 = 정규화의 강도를 조절해주는 패널티값
[코드내용]
(1) OLS
(2) Ridge Regression
(3) RidgeCV를 통한 최적 패널티(alpha, lambda) 검증
khalidpark/machinelearning_whitepaper
machine learning. Contribute to khalidpark/machinelearning_whitepaper development by creating an account on GitHub.
github.com
1-4. Logistic Regression
(1) 데이터를 훈련 / "검증" / 테스트 데이터로 나누기
: 왜 검증데이터로도 나눠서 진행해야 하는가?
: 훈련세트로 모델을 한 번에 완전하게 학습시키기가 어렵기 때문. 훈련세트로 다르게 튜닝된 여러 모델들을 학습한 후 어떤 모델이 학습이 잘 되었는지 검증하고 선택하는 과정이 필요.
from sklearn.model_selection import train_test_split
train, val = train_test_split(train, random_state=2)
print("train shape: ", train.shape)
print("val shape: ", val.shape)
(2) 분류
: 분류문제를 풀기전에 항상 먼저 타겟 범주가 어떤 비율을 가지고 있는지 확인 필요
: 절대로 회귀 평가지표를 분류에 사용하시면 안됨.
: 분류문제에서는 "정확도(Accuracy)"가 평가지표로 사용됨
from sklearn.metrics import accuracy_score
print("training accuracy: ", accuracy_score(y_train, y_pred))
(3) 로지스틱 회귀 (Logistic Regression)
: 분류문제에서는 확률값을 사용하여 분류를 하는데, 예를들어 확률값이 정해진 기준값 보다 크면 1 아니면 0으로 예측
[코드내용]
타이타닉 데이터를 사용하여 모든 특성을 사용한 로지스틱 회귀 모델
(1) 데이터 로드
(2) 특성 선택
(3) 원핫인코딩
(4) 결측치 처리 (평균으로처리)
(5) 특성값 표준화
(6) 로지스틱 회귀 모델
(7) 출력, 캐글제출
khalidpark/machinelearning_whitepaper
machine learning. Contribute to khalidpark/machinelearning_whitepaper development by creating an account on GitHub.
github.com
Tree Base Model
2-1. Decision Trees
(1) 사이킷런 파이프라인
[코드내용]
(1) 데이터전처리
(2) 사이킷런 파이프라인
khalidpark/machinelearning_whitepaper
machine learning. Contribute to khalidpark/machinelearning_whitepaper development by creating an account on GitHub.
github.com
(2) 결정트리
[코드내용]
사이킷런 Decision Tree Classifier 를 사용해 결정트리 구현
"DecisionTreeClassifier"
from sklearn.tree import DecisionTreeClassifier
pipe = make_pipeline(
OneHotEncoder(use_cat_names=True),
SimpleImputer(),
DecisionTreeClassifier(random_state=2, criterion='entropy')
)
pipe.fit(X_train, y_train)
print('훈련 정확도: ', pipe.score(X_train, y_train))
print('검증 정확도: ', pipe.score(X_val, y_val))
(3) 과적합 해결
: 복잡도를 낮춰 일반화 유도
- min_samples_split
- min_samples_leaf : 말단 노드에 최소한 존재해야 하는 샘플들의 수 지정
- max_depth
pipe = make_pipeline(
OneHotEncoder(use_cat_names=True),
SimpleImputer(),
DecisionTreeClassifier(min_samples_leaf=10, max_depth=6, random_state=2)
)
pipe.fit(X_train, y_train)
print('훈련 정확도', pipe.score(X_train, y_train))
print('검증 정확도', pipe.score(X_val, y_val))
2-2. Random Forests
(1) 랜덤포레스트
: 데이터가 선형이든 비선형이든, 분류문제를 풀어야 한다면 랜덤포레스트를 먼저 적용해보자!
[코드내용]
(1) 데이터전처리
(2) 랜덤포레스트모델
khalidpark/machinelearning_whitepaper
machine learning. Contribute to khalidpark/machinelearning_whitepaper development by creating an account on GitHub.
github.com
(2) 순서형(ordinal) 인코딩 (VS 원핫인코딩)
: 순서형 인코딩은 범주에 숫자를 맵핑
: 트리구조 학습에서 원핫인코딩 사용시 문제 발생 (high cardinality 로 상위노드에서 선택될 기회 적어짐)
2-3.Evaluation Metrics
(1) Confusion matrix ( 분류모델의 성능 평가지표)
from sklearn.metrics import plot_confusion_matrix
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
pcm = plot_confusion_matrix(pipe, X_val, y_val,
cmap=plt.cm.Blues,
ax=ax);
plt.title(f'Confusion matrix, n = {len(y_val)}', fontsize=15)
plt.show()
정확도(Accuracy)는 전체 범주를 모두 바르게 맞춘 경우를 전체 수로 나눈 값 = (TP + TN) / Total
정밀도(Precision)는 Positive로 예측한 경우 중 올바르게 Positive를 맞춘 비율 = TP / (TP + FP)
재현율(Recall, Sensitivity)은 실제 Positive인 것 중 올바르게 Positive를 맞춘 것의 비율 = TP / (TP + FN)
F1점수(F1 score)는 정밀도와 재현율의 조화평균 = 2 * 정밀도 * 재현율 / (정밀도 + 재현율)
(2) ROC , AUC
: ROC, AUC를 사용하면 분류문제에서 여러 임계값 설정에 대한 모델의 성능을 구할 수 있다.
: ROC는 여러 임계값에 대해 재현율과 위양성률 그래프를 보여준다.
: 재현율은 최대화 하고 위양성률은 최소화 하는 임계값이 최적의 임계값
: ROC curve는 이진분류문제에서 사용할 수 있다.
from sklearn.metrics import roc_curve
# roc_curve(타겟값, prob of 1)
fpr, tpr, thresholds = roc_curve(y_val, y_pred_proba)
from sklearn.metrics import roc_auc_score
auc_score = roc_auc_score(y_val, y_pred_proba)
auc_score
2-4.Model Selection
(1) 교차검증 (Cross Validation)
: 위에서는 데이터를 훈련/검증/테스트 세트로 나누어 학습을 진행 ( = hold-out 교차검증)
: 데이터가 충분하지 않을 경우 hold out 교차검증은 부적절
: 교차검증은 시계열(time series) 데이터에는 부적합
: 데이터를 k개로 등분하여야 하는데 이를 k-fold cross-validation(CV)라 한다
릿지 리그레션에 k-fold CV 적용
from category_encoders import OneHotEncoder
from sklearn.feature_selection import f_regression, SelectKBest
from sklearn.impute import SimpleImputer
from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
target = 'SalePrice'
features = train.columns.drop([target])
X_train = train[features]
y_train = train[target]
X_test = test[features]
y_test = test[target]
pipe = make_pipeline(
OneHotEncoder(use_cat_names=True),
SimpleImputer(strategy='mean'),
StandardScaler(),
SelectKBest(f_regression, k=20),
Ridge(alpha=1.0)
)
# 3-fold 교차검증을 수행합니다.
k = 3
scores = cross_val_score(pipe, X_train, y_train, cv=k,
scoring='neg_mean_absolute_error')
print(f'MAE ({k} folds):', -scores)
랜덤 포레스트에 k-fold CV 적용
from category_encoders import TargetEncoder
from sklearn.ensemble import RandomForestRegressor
pipe = make_pipeline(
# TargetEncoder: 범주형 변수 인코더로, 타겟값을 특성의 범주별로 평균내어 그 값으로 인코딩
TargetEncoder(min_samples_leaf=1, smoothing=1),
SimpleImputer(strategy='median'),
RandomForestRegressor(max_depth = 10, n_jobs=-1, random_state=2)
)
k = 3
scores = cross_val_score(pipe, X_train, y_train, cv=k,
scoring='neg_mean_absolute_error')
print(f'MAE for {k} folds:', -scores)
(2) 검증곡선 (validation curve)
import matplotlib.pyplot as plt
from category_encoders import OrdinalEncoder
from sklearn.model_selection import validation_curve
from sklearn.tree import DecisionTreeRegressor
pipe = make_pipeline(
OrdinalEncoder(),
SimpleImputer(),
DecisionTreeRegressor()
)
depth = range(1, 30, 2)
ts, vs = validation_curve(
pipe, X_train, y_train
, param_name='decisiontreeregressor__max_depth'
, param_range=depth, scoring='neg_mean_absolute_error'
, cv=3
, n_jobs=-1
)
train_scores_mean = np.mean(-ts, axis=1)
validation_scores_mean = np.mean(-vs, axis=1)
fig, ax = plt.subplots()
# 훈련세트 검증곡선
ax.plot(depth, train_scores_mean, label='training error')
# 검증세트 검증곡선
ax.plot(depth, validation_scores_mean, label='validation error')
# 이상적인 max_depth
ax.vlines(5,0, train_scores_mean.max(), color='blue')
# 그래프 셋팅
ax.set(title='Validation Curve'
, xlabel='Model Complexity(max_depth)', ylabel='MAE')
ax.legend()
fig.dpi = 100
(3) Randomized Search CV (하이퍼파라미터 튜닝)
: 여러 하이퍼파라미터의 최적값을 찾기 위해
: 사이킷런에는 하이퍼파라미터 튜닝을 도와주는 툴이 2개 존재 ( GridSearchCV , RandomizedSearchCV)
Ridge 회귀모델의 하이퍼파라미터를 튜닝
from sklearn.model_selection import RandomizedSearchCV
pipe = make_pipeline(
OneHotEncoder(use_cat_names=True)
, SimpleImputer()
, StandardScaler()
, SelectKBest(f_regression)
, Ridge()
)
# 튜닝할 하이퍼파라미터의 범위를 지정해 주는 부분
dists = {
'simpleimputer__strategy': ['mean', 'median'],
'selectkbest__k': range(1, len(X_train.columns)+1),
'ridge__alpha': [0.1, 1, 10],
}
clf = RandomizedSearchCV(
pipe,
param_distributions=dists,
n_iter=50,
cv=3,
scoring='neg_mean_absolute_error',
verbose=1,
n_jobs=-1
)
clf.fit(X_train, y_train);
>> Fitting 3 folds for each of 50 candidates, totalling 150 fits
print('최적 하이퍼파라미터: ', clf.best_params_)
print('MAE: ', -clf.best_score_)
랜덤포레스트에 하이퍼파라미터 튜닝
from scipy.stats import randint, uniform
pipe = make_pipeline(
TargetEncoder(),
SimpleImputer(),
RandomForestRegressor(random_state=2)
)
dists = {
'targetencoder__smoothing': [2.,20.,50.,60.,100.,500.,1000.], # int로 넣으면 error(bug)
'targetencoder__min_samples_leaf': randint(1, 10),
'simpleimputer__strategy': ['mean', 'median'],
'randomforestregressor__n_estimators': randint(50, 500),
'randomforestregressor__max_depth': [5, 10, 15, 20, None],
'randomforestregressor__max_features': uniform(0, 1) # max_features
}
clf = RandomizedSearchCV(
pipe,
param_distributions=dists,
n_iter=50,
cv=3,
scoring='neg_mean_absolute_error',
verbose=1,
n_jobs=-1
)
clf.fit(X_train, y_train);
>>Fitting 3 folds for each of 50 candidates, totalling 150 fits
print('최적 하이퍼파라미터: ', clf.best_params_)
print('MAE: ', -clf.best_score_)
예측모델 적용
3-1. Choose your ML problems
khalidpark/machinelearning_whitepaper
machine learning. Contribute to khalidpark/machinelearning_whitepaper development by creating an account on GitHub.
github.com
3-2. Data wrangling
: 데이터 랭글링은 분석을 하거나 모델을 만들기 전에 데이터를 사용하기 쉽게 변형하거나 맵핑하는 과정
3-3. 특성 중요도 계산
(1) 3가지 방법
: Feature Importances (Mean decrease impurity, MDI)
: Drop-Column Importance
: Permutation Importance 순열중요도 + (eli5 라이브리러리 활용)
khalidpark/machinelearning_whitepaper
machine learning. Contribute to khalidpark/machinelearning_whitepaper development by creating an account on GitHub.
github.com
(2) Boosting
: 종류
scikit-learn Gradient Tree Boosting — 상대적으로 속도가 느림
xgboost — 결측값을 수용하며, monotonic constraints를 강제 가능
LightGBM — 결측값을 수용하며, monotonic constraints를 강제 가능
CatBoost — 결측값을 수용하며, categorical features를 전처리 없이 사용 가능
#XGBoost 사용
from xgboost import XGBClassifier
pipe = make_pipeline(
OrdinalEncoder(),
SimpleImputer(strategy='median'),
XGBClassifier(n_estimators=200
, random_state=2
, n_jobs=-1
, max_depth=7
, learning_rate=0.2
)
)
pipe.fit(X_train, y_train);
# 하이퍼파라미터 세팅
encoder = OrdinalEncoder()
X_train_encoded = encoder.fit_transform(X_train) # 학습데이터
X_val_encoded = encoder.transform(X_val) # 검증데이터
model = XGBClassifier(
n_estimators=1000, # <= 1000 트리로 설정했지만, early stopping 에 따라 조절됩니다.
max_depth=7, # default=3, high cardinality 특성을 위해 기본보다 높여 보았습니다.
learning_rate=0.2,
scale_pos_weight=ratio, # imbalance 데이터 일 경우 비율을 적용합니다.
n_jobs=-1
)
eval_set = [(X_train_encoded, y_train),
(X_val_encoded, y_val)]
model.fit(X_train_encoded, y_train,
eval_set=eval_set,
early_stopping_rounds=50 # 50 rounds 동안 스코어의 개선이 없으면 멈춤
)
(3) 하이퍼 파라미터 튜닝
: Random Forest
1) max_depth (높은값에서 감소시키며 튜닝, 너무 깊어지면 과적합)
2) n_estimators (적을경우 과소적합, 높을경우 긴 학습시간)
3) min_samples_leaf (과적합일경우 높임)
4) max_features (줄일 수록 다양한 트리생성, 높이면 같은 특성을 사용하는 트리가 많아져 다양성이 감소)
5) class_weight (imbalanced 클래스인 경우 시도)
: XGBoost
1) learning_rate (높을경우 과적합 위험)
2) max_depth (낮은값에서 증가시키며 튜닝, 너무 깊어지면 과적합위험, -1 설정시 제한 없이 분기, 특성이 많을 수록 깊게 설정)
3) n_estimators (너무 크게 주면 긴 학습시간, early_stopping_rounds와 같이 사용)
4) scale_pos_weight (imbalanced 문제인 경우 적용시도)
3-4. Interpreting ML Model
(1) Partial Dependence Plots(PDP)
: 부분의존도그림(PDP)을 사용하면 관심있는 특성들이 타겟에 어떻게 영향을 주는지 쉽게 파악
khalidpark/machinelearning_whitepaper
machine learning. Contribute to khalidpark/machinelearning_whitepaper development by creating an account on GitHub.
github.com
(2) SHAP 라이브러리
: 복잡한 머신러닝모델의 예측을 설명하기 위한 매우 유용한 방법
khalidpark/machinelearning_whitepaper
machine learning. Contribute to khalidpark/machinelearning_whitepaper development by creating an account on GitHub.
github.com
서로 관련이 있는 모든 특성들에 대한 전역적인(Global) 설명
Feature Importances
Drop-Column Importances
Permutaton Importances
타겟과 관련이 있는 개별 특성들에 대한 전역적인 설명
Partial Dependence plots
개별 관측치에 대한 지역적인(local) 설명
Shapley Values
출처 : 코드스테이츠
댓글