지도학습 - 분류(Classification), 회귀(Regression)
- 찾고자 하는 변수(y, target, 종속변수, 결과, 목표)가 범주형인지 연속형인지에 따라서 분류, 회귀를 구분해서 사용한다.
필요한 용어 정리
- 모델
- 추정, 예측, 추론
- 변수(Variable), 필드(Field), 속성(Attribute), 특성(Feature)
- 개체(Instance), 관측치(Observed Value), 기록(Record), 경우(Case)
- 독립변수, 종속변수
- 학습용, 검증용, 평가용 데이터셋
- 과대적합(Overfitting), 과소적합(Underfitting)
- 오차 = 실제값 - 예측값 / 이탈도(Deviance)
- y: 실제값 / y-hat: 예측값 / y-bar: 평균값
회귀 평가 지표 (오차 줄이기)
- 오차 합 SE
- 오차 제곱의 합 SSE
- 오차 제곱의 합의 평균 MSE
- 오차 제곱의 합의 평균의 루트 RMSE
- 오차 절대값의 합 SAE
- 오차 절대값의 합의 평균 MAE
- 오차 절대값의 합의 퍼센트 MAPE
- SSR (Sum Squared Regression) = 실제값과 비교한 회귀식의 오차
- SSE (Sum Squared Error) = 실제값과 비교한 평균의 오차
- R^2 (결정계수) = SSR / SST
분류 평가 지표 (정확도 높이기)
- 정확도 (Accuracy)
- 정밀도 (Precision)
- 재현율 (Recall)
- 오분류표 (Confusion Matrix)
- 특이도 (Specificity) : 실제값이 False 일 때, False로 판정할 확률
- 민감도 (Sensitivity) : 실제값이 True 일 때, True로 판정할 확률
- F1-Score : 정밀도와 재현율의 조화평균
모델링 순서
- 데이터 전처리
- x, y 분리
- train_test_split
- 필요한 라이브러리 import
- 변수로 모델 선언 model =
- 모델을 가지고 학습 model.fit
- 학습한 모델을 가지고 예측 model.predict
- 예측한 결과를 평가
회귀 문제
- 모델
- LinearRegression
- KNeighborsRegressor :
- x_train 정규화 필요, n_neighbors 에 따라 성능 차이 발생
- x, y의 거리를 기준으로 이웃을 찾는 방식
- minmaxscaler를 통해서 x와 y의 최소최대 범위를 일치시켜줘야 올바른 결과가 나온다.
- 시각화 어려움
- DecisionTreeRegressor :
- 시각화 쉬움
- 스무고개처럼 초반에 의미있는 질문을 주어서 분류해야한다.
- 노드의 깊이가 크면 어려움 (트리 크기를 제한해서 성능 높인다.)
- 지니 불순도 (Gini Impurity)
- 엔트로피 (Entropy)
- 바이너리 클래스로 계산
- 정보 이득 = 부모노드의 불순도 - 자식노드의 불순도
- 부모노드의 불순도 대비 자식노드의 불순도를 가장 낮추는 질문이 Decision Tree 에서 가장 의미있는 질문이 된다.
- 가장 정보 이득이 큰 속성부터 분할을 한다.
- max_depth : 과적합 방지용 / 트리의 깊이.
- min_samples_split : 과적합 방지용 / 노드 분할을 위한 최소 샘플 수
- min_samples_leaf : 과적합 방지용 / 리프 노드의 최소 샘플 수
- max_feature : 기본 값 None / 최선의 분할 위해 고려할 feature 수
- max_leaf_node : 리프 노드 최대 개수
- model.feature_importances_ : 학습한 모델에서 변수 중요도 데이터
- SVR :
- RandomForestRegressor
- XGBRegressor
- 평가
- mean_absolute_error
- mean_squared_error
- root mean_squared_error
- mean_absolute_percentage_error
- r2_score : SSR / SST
- model.coef_ : 기울기, 가중치
- model.intercept_ : y 절편, 편향
분류 문제
- 모델
- DecisionTreeClassifier
- KNeighborsClassifier
- LogisticRegression : 로지스틱 함수(시그모이드 함수)를 통해 회귀를 이용해 분류 문제 해결
- SVC :
- x_train 정규화 필요
- 결정 경계(분류를 결정하는 선)
- 벡터(scatterplot의 데이터 하나의 포인트)
- 서포트 벡터(마진을 결정해주는 결정 경계선에 가장 가까운 포인트들)
- 마진(마진을 최대로 하는 결정 경계를 찾음)
- 비용(cost, C) : 많이 주면 hard margin 으로 과대적합 발생. 반대는 soft margin 으로 과소적합 발생
- 감마(gamma) : 모델이 생성하는 경계의 복잡한 정도
- 커널 설정: linear, poly(Polynomial), rbf(Radial Basis Function)
- RandomForestClassifier
- XGBClassifier
- 평가
- accuracy_score : 정확도
- recall_score : 재현율 = 민감도
- precision_score : 정밀도
- classification_report
- confusion_matrix : 혼동 행렬
K-Fold 교차 검증 / cross_val_score(모델 , x_train , y_train , cv=분할 개수)
- k >= 2
- k 개로 데이터를 분할하여 각각의 데이터를 평가에 한 번, 학습에 k-1번 사용하여 모델 성능 평가
- 특정 모델의 교차 검증을 통한 평균 성능을 확인
- 데이터의 편향 방지
- 과소적합 문제 방지
- train 과 test 를 미리 분리한 후에 train 데이터만 이용하여 검증할 것
Hyperparameter
- 모델링할 때 최적화하기 위해 조절 가능한 옵션
Grid Search CV & Random Search CV
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_absolute_error, r2_score
# 1. 하이퍼 파라미터 튜닝해볼 범위 설정
param = {'n_neighbors': range(1, 101),
'metric': ['euclidean', 'manhattan']}
# 2. 모델 선언
model = KNeighborsClassifier()
"""
- 확인할 모델
- 설정한 파라미터 변수
- cv: K-Fold 분할 개수(기본값=5)
- scoring: 평가 방법 ('accuracy', 'r2')
"""
model = GridSearchCV(model, param, cv=5, scoring='accuracy')
from sklearn.model_selection import RandomizedSearchCV
from sklearn.metrics import confusion_matrix, classification_report
# 1. 하이퍼 파라미터 튜닝해볼 범위 설정
param = {'max_depth': range(1, 51)}
# 2. 모델 선언
model = DecisionTreeClassifier(random_state=1)
"""
추가
- n_iter: Random하게 시도할 횟수 (기본값=10)
"""
model = RandomizedSearchCV(model, rand_param, cv=3, n_iter =20, scoring='r2')
- Grid Search 실행 횟수 = param 으로 만들어지는 모든 조합 X CV 값
- Random Search 실행 횟수 = param 으로 만들어지는 모든 조합에서 n_iter 값 만큼 랜덤하게 추출
# 1. 모델 선언 후 학습 진행
model.fit(x_train, y_train)
model.fit(x_train, y_train)
# 2. 결과 확인
model.cv_results_] # 수행 결과 전체
model.cv_results_['mean_test_score'] # 평균 수행 결과
model.best_params_ # 최고 성능이 나온 최적의 파라미터
model.best_score_ # 최고 성능 점수
model.best_estimator_.feature_importances_ # 변수 중요도 (결정트리의 경우)
# 3. y 예측
y_pred = model.predict(x_test)
# 4. 회귀 평가
print(mean_absolute_error(y_test, y_pred))
print(r2_score(y_test, y_pred))
# 4. 분류 평가
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
댓글