독립변수 개수로 회귀분석을 단순 회귀와 다중 회귀로 분류 

Linear Regression

단순 회귀(Simple Regression) 

  • 독립변수 하나가 종속변수에 영향을 미치는 선형 회귀
  • 𝑥 값 하나만으로 𝑦값을 설명할 수 있는 경우 예) 행복지수가 연수입만으로 결정됨
  • 회귀식: 𝑦ො = 𝑤0 + 𝑤1𝑥1
  • 독립변수의 최선의 가중치와(w1)와 편향(w0)을 찾음
  • 단순 회귀의 회귀 계수
    • 모델 학습 후 회귀계수 확인 가능
    • model.coef_: 회귀계수(=가중치)
    • model.intercept_: 편향
    • y_hat = x * model.coef_ + model.intercept_

 

다중 회귀(Multiple Regression)

  • 여러 독립변수가 종속변수에 영향을 미치는 선형 회귀
  • 𝑦 값을 설명하기 위해서는 여러 개의 𝑥 값이 필요한 경우 예: 여러 요인들에 의해 보스턴 지역 집 값이 결정 됨
  • 회귀식: 𝑦ො = w0 + w1𝑥1 + w2𝑥2 + w3𝑥3 + ⋯ + w𝑛𝑥𝑛
  • 각 독립변수의 최선의 가중치와(w1, w2, w3, w4…)와 편향(w0)을 찾음
  • 단순 회귀의 회귀 계수
    • 회귀계수가 여럿이므로 독립변수 이름과 같이 확인하기를 권고
    • model.coef_: 회귀계수(=가중치)
    • model.intercept_: 편향
    • y_hat = x * model.coef_ + model.intercept_

 

K-Nearest Neighbor

  • k-Nearest Neighbor: k 최근접 이웃(가장 가까운 이웃 k개)
  • 학습용 데이터에서 k개의 최근접 이웃의 값을 찾아 그 값들로 새로운 값을 예측하는 알고리즘
  • 회귀와 분류에 사용되는 매우 간단한 지도학습 알고리즘
  • 다른 알고리즘에 비해 이해하기 쉽지만, 연산 속도가 느림
  • Regression - k개 값의 편균을 계산하여 값을 예측
  • Classification - 가장 많이 포함된 유형으로 분류
  • k(탐색하는 이웃 개수)에 따라 데이터를 다르게 예측할 수도 있음
    • k 값에 따라 예측 값이 달라지므로 적절한 k 값을 찾는 것이 중요(기본값=5)
    • 일반적으로 k를 1로 설정 안함 → 이웃 하나로 현재 데이터를 판단하기에는 너무 편향된 정보
    • k를 홀수로 설정 → 짝수인 경우 과반수 이상의 이웃이 나오지 않을 수 있음
  • MinMaxScaler를 사용하면 더 나은 결과값을 얻을 수 있다.
    • from sklearn.preprocessing import MinMaxScaler
    • 평가용 데이터에도 학습용 데이터를 기준으로 스케일링을 수행함(학습용 데이터의 최댓값, 최솟값, 평균 등을 사용)
scaler = MinMaxScaler()
x_train_s = scaler.fit_transform(x_train)
x_test_s = scaler.transform(x_test)
# x_train이 array형태로 저장됨 다시 DF로 바꿔주는 작업 필요
x_train = pd.DataFrame(x_train_s, columns = list(x))

#인덱스 지정을 해야된다면 다음과 같은 방법 활용 가능
# scaler = MinMaxScaler().set_output(transform="pandas")

 

Decision Tree

  • 결정 트리, 의사 결정 나무 등으로 번역
  • 특정 변수에 대한 의사결정 규칙을 나무 가지가 뻗는 형태로 분류해 나감
  • 분류와 회귀 모두에 사용되는 지도학습 알고리즘
  • 분석 과정이 직관적이며, 이해와 설명하기가 쉬움
  • 스케일링 등의 전처리 영향도가 크지 않음
  • 분석 과정을 실제로 눈으로 확인할 수 있음 → 화이트박스 모델
  • 스무고개처럼 의미 있는 질문을 먼저 하는 것이 중요
  • 훈련 데이터에 대한 제약 사항이 거의 없는 유연한 모델 → 과적합으로 모델 성능이 떨어지기 쉬움 → 트리 깊이를 제한하는(=가지치기) 튜닝이 필요

용어 정리

  • Root Node(뿌리 마디): 전체 자료를 갖는 시작하는 마디
  • Child Node(자식 마디): 마디 하나로부터 분리된 2개 이상의 마디
  • Parent Node(부모 마디): 주어진 마디의 상위 마디
  • Terminal Node(끝 마디): 자식 마디가 없는 마디(=Leaf Node)
  • Internal Node(중간 마디): 부모 마디와 자식 마디가 모두 있는 마디
  • Branch(가지): 연결되어 있는 2개 이상의 마디 집합
  • Depth(깊이): 뿌리 마디로부터 끝 마디까지 연결된 마디 개수(층을 연결한 선의 갯수라 생각하면 편함)

 

분류와 회귀

분류

  • 비용 함수 : 불순도
  • 마지막 노드에 있는 샘플들의 최빈값을 예측값으로 반환.
  • 불순도를 수치화 할 수 있는 지표(지니 불순도 / 엔트로피)
  • 지니 불순도(Gini Impurity)
    • 지니 불순도 = 1 − (양성 클래스 비율2+음성 클래스 비율2 )
    • 분류 후에 얼마나 잘 분류했는지 평가하는 지표
    • 얼마나 순도가 증가했는지, 불순도가 감소했는지
  • 지니 불순도 특징
    • 지니 불순도가 낮을수록 순도가 높음
    • 지니 불순도는 0~0.5 사이의 값(이진 분류의 경우)
      • 순수하게(완벽하게) 분류되면 → 0
      • 완벽하게 섞이면(50:50) → 0.5
    • 지니 불순도가 낮은 속성으로 의사결정 트리 노드 결정
     
  • 엔트로피(Entropy)
    • 엔트로피 = −음성클래스비율× 𝑙𝑜𝑔2 음성클래스비율 − 양성클래스비율 × 𝑙𝑜𝑔2(양성클래스비율)
    • 𝑝𝑖 : 집합 안에서 속성 i의 확률을 나타냄
      • 예를 들어 𝑝𝑖=1이면 집합 안의 모든 항목이 i 속성을 가진 경우
    • 엔트로피는 0~1 사이의 값
      • 순수하게(완벽하게) 분류되면 → 0
      • 완벽하게 섞이면(50:50) → 1

정보 이득(Information Gain)

  • Information Gain
  • 엔트로피는 단지 속성의 불순도를 표현
  • 우리가 알고 싶은 것 = 어떤 속성이 얼마나 많은 정보를 제공하는가!
  • 정보 이득 공식 • 정보 이득이 크다 = 어떤 속성으로 분할할 때 불순도가 줄어든다
  • 모든 속성에 대해 분할한 후 정보 이득 계산
  • 정보 이득이 가장 큰 속성부터 분할

가지치기

  • 가지치기를 하지 않으면 모델이 학습 데이터에는 매우 잘 맞지만, 평가 데이터에는 잘 맞지 않음
    • → 과대적합, 일반화되지 못함
  • 여러 하이퍼파라미터 값을 조정해 가지치기 할 수 있음
    • max_depth, min_samples_leaf, min_samples_split 등
  •  학습 데이터에 대한 성능은 낮아지나, 평가 데이터에 대한 성능을 높일 수 있음
  • 가장 적절한 하이퍼파라미터 값을 찾도록 노력해야 함

max_depth ☆

  • 트리의 최대 깊이(기본값: None)
  • 기본값으로 설정하면 완벽히 분류될 때 까지 분할하거나, 노드가 갖는 샘플 개수가 min_samples_split 설 정 값 보다 작아질 때 까지 계속 분할
  • 계속 분할되면 트리 깊이가 너무 깊어져 과적합이 발생할 수 있으니 적절한 값 설정 필요

min_samples_split

  • 노드를 분할하기 위한 최소한의 샘플 개수(기본값: 2)
  • 값을 작게 설정할 수록 계속 분할되어 트리 깊이가 깊어져 과적합 발생 가능
  • 적절한 값을 지정해 과적합을 방지할 필요가 있음

min_samples_leaf

  • 리프 노드가 되기 위한 최소한의 샘플 수(기본값: 1)
  • min_samples_split과 함께 과적합을 방지할 목적으로 사용
  • 불균형 클래스인 경우 이를 고려하여 작은 값을 설정할 필요가 있음

max_feature

  • 최선의 분할을 위해 고려할 Feature 수(기본값: None)
  • 기본값으로 설정하면 모든 Feature를 사용해서 분할 수행
  • 정수형으로 선언하면 Feature 수, 실수형으로 선언하면 Feature 비율
  • 'sqrt'로 선언하면 전체 Feature 수의 루트 값
  • 'auto'로 설정하면 'sqrt'와 같은 의미
  • 'log'로 선언하면 log2(전체 Feature 수

max_leaf_node

  • 리프 노드 최대 개수

 

Logistic Regression

  • 알고리즘은 분류모델에만 사용할 수 있음
  • 알고리즘 함수: sklearn.linear_model.LogisticRegression
  • 성능평가 함수: sklearn.metrics.confusion_matrix, sklearn.metrics.classification_report 등

 

로지스틱 함수

  • 시그모이드(sigmoid) 함수라고도 부름
  • 확률 값 𝑝 는 선형 판별식 값이 커지면 1, 작아지면 0에 가까운 값이 됨
  • (-∞, ∞) 범위를 갖는 선형 판별식 결과로 (0, 1) 범위의 확률 값을 얻게 됨
  • 기본적으로 확률 값 0.5를 임계값(Threshold)로 하여 이보다 크면 1, 아니면 0으로 분류함
  • 𝑥 데이터가 주어졌을 때 확률을 예측하는 로지스틱 회귀분석은 학습 데이터를 잘 설명하는 선형 판별식의 기울기(𝑎)와 절편(𝑏)을 찾는 문제
  • from sklearn.linear_model import LogisticRegression

K-Fold Cross Validation

  • 모든 데이터가 평가에 한 번, 학습에 k-1번 사용
  • K개의 분할(Fold)에 대한 성능을 예측 → 평균과 표준편차 계산 → 일반화 성능
  • 단, k는 2 이상이 되어야 함(최소한 한 개씩의 학습용, 검증용 데이터가 필요)

장점

  • 모든 데이터를 학습과 평가에 사용할 수 있음
  • 반복 학습과 평가를 통해 정확도를 향상시킬 수 있음
  • 데이터가 부족해서 발생하는 과소적합 문제를 방지할 수 있음
  • 평가에 사용되는 데이터의 편향을 막을 수 있음 
  • 좀 더 일반화된 모델을 만들 수 있음 

단점 

  • 반복 횟수가 많아서 모델 학습과 평가에 많은 시간이 소요

Hyperparameter 튜닝

Random Search

  1. 성능을 테스트할 파라미터 값의 범위를 지정(딕셔너리 형태)
  2. 위 파라미터 값 범위를 모두 사용하는 Grid Search 모델 선언 후 학습
  3. 학습 데이터에 대해 가장 좋은 성능을 보인 파라미터 값으로 자동으로 학습함
  4. 이후 예측 및 평가 과정을 바로 진행하면 됨
# 함수 불러오기
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import RandomizedSearchCV

# 파라미터 선언
param = {'n_neighbors': range(1, 500, 10), 'metric': ['euclidean', 'manhattan']}
# 기본모델 선언
knn_model = KNeighborsClassifier()
# Random Search 선언
model = RandomizedSearchCV(knn_model, param, cv=3, n_iter=20)

# 학습하기
model.fit(x_train, y_train)
# 수행 정보
model.cv_results_
# 최적 파라미터
model.best_params_
# 최고 성능
model.best_score_

 

Grid Search

  1. 성능을 테스트할 파라미터 값의 범위를 지정(딕셔너리 형태)
  2. 위 파라미터 값 범위에서 몇 개 선택할 지 정하여 Random Search 모델 선언 후 학습
  3. 학습 데이터에 대해 가장 좋은 성능을 보인 파라미터 값으로 자동으로 학습함
  4. 이후 예측 및 평가 과정을 바로 진행하면 됨
# 함수 불러오기
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
# 파라미터 선언
param = {'n_neighbors': range(1, 500, 10), 'metric': ['euclidean', 'manhattan']}
# 기본모델 선언
knn_model = KNeighborsClassifier()
# Grid Search 선언
model = GridSearchCV(knn_model, param, cv=3)

 

 

회귀

  • 비용 함수 : MSE(표준편차?)
  • 마지막 노드에 있는 샘플들의 평균을 예측값으로 반환

 

앙상블(Ensemble)

여러 개의 모델을 결합하여 훨씬 강력한 모델을 생성하는 기법

 

보팅(Voting)

  • 여러 모델들(다른 유형의 알고리즘 기반 )의 예측 결과투표를 통해 최종 예측 결과를 결정하는 방법
  • 하드 보팅: 다수 모델이 예측한 값이 최종 결괏값
  • 소프트 보팅: 모든 모델이 예측한 레이블 값의 결정 확률 평균을 구한 뒤 가장 확률이 높은 값을 최종 선택

배깅(Bagging)

  • Bootstrap Aggregating의 약자
  • 데이터로부터 부트스트랩 한 데이터로 모델들을 학습시킨 후, 모델들의 예측 결과를 집계해 최종 결과를 얻는 방법
  • 같은 유형의 알고리즘 기반 모델들을 사용
  • 데이터 분할 시 중복을 허용(복원 랜덤 샘플링 방식이라고 함)
  • 범주형 데이터(Categorical Data)는 투표 방식(Voting)으로 결과를 집계
  • 연속형 데이터(Continuous Data)는 평균으로 결과를 집계
  • 대표적인 배깅 알고리즘: Random Forest
    •  

부스팅(Boosting)

  • 같은 유형의 알고리즘 기반 모델 여러 개에 대해 순차적으로 학습을 수행
  • 이전 모델이 제대로 예측하지 못한 데이터에 대해서 가중치를 부여하여 다음 모델이 학습과 예측을 진행하는 방법
  • 계속하여 모델에게 가중치를 부스팅하며 학습을 진행해 부스팅 방식이라 함
  • 예측 성능이 뛰어나 앙상블 학습을 주도함
  • 배깅에 비해 성능이 좋지만, 속도가 느리고 과적합 발생 가능성이 있음 → 상황에 맞게 적절히 사용해야 함
  • 대표적인 부스팅 알고리즘: XGBoost, LightGBM

스태킹(Stacking)

'<프로그래밍> > [python]' 카테고리의 다른 글

[python] 딥러닝 성능관리  (0) 2024.10.14
[python] 딥러닝 기초  (0) 2024.10.10
[python] 머신러닝의 기초2  (1) 2024.09.27
[python] 머신러닝의 기초  (0) 2024.09.26
[python] 데이터 시각화2(단변량 분석)  (1) 2024.09.26

+ Recent posts