본문 바로가기
개발/Python

LightGBM Hyper Parameters and Attributes

by 피로물든딸기 2025. 11. 22.
반응형

전체 링크

LightGBM

- XGBoost보다 학습 시간이 적고, 메모리 사용량도 적은편

- 리프 중심 트리 분할(Leaf Wise)

ㄴ 최대한 균형 잡힌 트리를 유지하면서 분할하기 때문에 트리의 깊이가 최소화

ㄴ 균형 잡힌 트리를 유지하면서 분할하면 과적합에 더 강한 구조를 가지지만 균형을 맞추기 위한 시간이 많이 필요

ㄴ 리프 중심 트리는 최대 손실 값(max delta loss)을 가지는 리프 노드를 지속적으로 분할하여 

    트리의 깊이가 깊어지고 비대칭 트리가 생성된다.

 

장점

- Histogram + Leaf-wise로 XGBoost보다 일반적으로 빠름

- Approximate 분할로 메모리 사용량 감소

- Leaf-wise로 복잡한 패턴을 더 잘 학습

- 카테고리형 피처의 자동 변환과 최적 분할 (원-핫 인코딩 불필요)

- 대규모 데이터 처리 가능

- GPU 가속 지원

 

단점

- Leaf-wise 방식은 깊은 비대칭 트리를 만들기 때문에 작거나 노이즈가 많은 데이터에서 과적합 위험 ↑

- 적은 데이터에서 과적합 발생 (10000건 이하)

- 소형 데이터에 비효율적

- 일반 트리보다 복잡한 구조로 모델 설명력이 떨어짐


하이퍼 파라미터

from lightgbm import LGBMClassifier, LGBMRegressor

LGBMClassifier(
    boosting_type: str = 'gbdt',
    num_leaves: int = 31,
    max_depth: int = -1,
    learning_rate: float = 0.1,
    n_estimators: int = 100,
    subsample_for_bin: int = 200000,
    objective: Union[str, Callable[[Union[numpy.ndarray, NoneType], numpy.ndarray], Tuple[numpy.ndarray, numpy.ndarray]], Callable[[Union[numpy.ndarray, NoneType], numpy.ndarray, Union[numpy.ndarray, NoneType]], Tuple[numpy.ndarray, numpy.ndarray]], Callable[[Union[numpy.ndarray, NoneType], numpy.ndarray, Union[numpy.ndarray, NoneType], Union[numpy.ndarray, NoneType]], Tuple[numpy.ndarray, numpy.ndarray]], NoneType] = None,
    class_weight: Union[Dict, str, NoneType] = None,
    min_split_gain: float = 0.0,
    min_child_weight: float = 0.001,
    min_child_samples: int = 20,
    subsample: float = 1.0,
    subsample_freq: int = 0,
    colsample_bytree: float = 1.0,
    reg_alpha: float = 0.0,
    reg_lambda: float = 0.0,
    random_state: Union[int, numpy.random.mtrand.RandomState, numpy.random._generator.Generator, NoneType] = None,
    n_jobs: Union[int, NoneType] = None,
    importance_type: str = 'split',
    **kwargs: Any,
)

LGBMRegressor(
    boosting_type: str = 'gbdt',
    num_leaves: int = 31,
    max_depth: int = -1,
    learning_rate: float = 0.1,
    n_estimators: int = 100,
    subsample_for_bin: int = 200000,
    objective: Union[str, Callable[[Union[numpy.ndarray, NoneType], numpy.ndarray], Tuple[numpy.ndarray, numpy.ndarray]], Callable[[Union[numpy.ndarray, NoneType], numpy.ndarray, Union[numpy.ndarray, NoneType]], Tuple[numpy.ndarray, numpy.ndarray]], Callable[[Union[numpy.ndarray, NoneType], numpy.ndarray, Union[numpy.ndarray, NoneType], Union[numpy.ndarray, NoneType]], Tuple[numpy.ndarray, numpy.ndarray]], NoneType] = None,
    class_weight: Union[Dict, str, NoneType] = None,
    min_split_gain: float = 0.0,
    min_child_weight: float = 0.001,
    min_child_samples: int = 20,
    subsample: float = 1.0,
    subsample_freq: int = 0,
    colsample_bytree: float = 1.0,
    reg_alpha: float = 0.0,
    reg_lambda: float = 0.0,
    random_state: Union[int, numpy.random.mtrand.RandomState, numpy.random._generator.Generator, NoneType] = None,
    n_jobs: Union[int, NoneType] = None,
    importance_type: str = 'split',
    **kwargs: Any,
)
반응형

댓글