[ML] Python Wrapper API & Scikit-Learn Wrapper API

2024. 2. 21. 15:54카테고리 없음

오늘은 Python Wrapper API & Scikit-Learn Wrapper API 이 두가지에 대해서 알아보고자 합니다. 이 두가지를 이해하는 것은 파이썬에서 머신러닝에 대한 코드를 작성할 때 더 효율적으로 작업하고, 필요에 따라 적절한 도구를 선택하는데 도움이 됩니다.

 

1. Python Wrapper API

Python Wrapper API는 머신러닝 라이브러리의 기본 Python 인터페이스를 의미합니다. 이 API는 라이브러리가 제공하는 원시적이고 강력한 기능에 직접 접근할 수 있게 해줍니다. 사용자는 라이브러리의 세부 설정을 자유롭게 조정할 수 있으며, 복잡한 모델과 알고리즘을 세밀하게 제어할 수 있습니다.

 

예를 들어, XGBoost 라이브러리의 Python Wrapper API를 사용하면, 사용자는 xgboost.train() 함수를 통해 고급 학습 파라미터, 조기 중단, 사용자 정의 평가 함수 등 다양한 기능을 활용할 수 있습니다.

 

2. Scikit-Learn Wrapper API

Scikit-Learn Wrapper API는 Scikit-learn 스타일의 인터페이스를 제공하는 API입니다. 이 API는 Scikit-learn의 fit, predict, transform과 같은 일관된 메서드를 통해 다른 머신러닝 라이브러리를 Scikit-learn과 같은 방식으로 사용할 수 있게 해줍니다. 이로 인해 사용자는 Scikit-learn의 다양한 기능, 예를 들어 교차 검증, 파이프라인, 하이퍼파라미터 튜닝 도구 등을 손쉽게 활용할 수 있습니다.

예를 들어, XGBoost의 Scikit-Learn Wrapper인 XGBClassifierXGBRegressor는 Scikit-learn의 GridSearchCVcross_val_score와 같은 도구와 함께 사용될 수 있으며, 이는 머신러닝 모델을 더욱 쉽게 실험하고 최적화할 수 있게 해줍니다.

 

3. 두 API 스타일의 차이점

  • 유연성 vs. 편의성: Python Wrapper API는 라이브러리의 고급 기능을 최대한 활용할 수 있지만, 사용법이 복잡할 수 있습니다. 반면, Scikit-Learn Wrapper API는 사용이 간편하지만, 내부적으로 제공되는 기능에 일부 제한이 있을 수 있습니다.
  • 기능의 접근성: Python Wrapper는 라이브러리 고유의 기능에 더 깊숙이 접근할 수 있지만, Scikit-Learn Wrapper는 Scikit-learn 생태계와의 호환성에 중점을 둡니다.
  • 목적에 따른 선택: 복잡한 모델을 세밀하게 조정하고자 할 때는 Python Wrapper API가 적합할 수 있습니다. 반면, Scikit-learn의 도구들과 함께 라이브러리를 사용하고자 한다면 Scikit-Learn Wrapper API가 더 나을 수 있습니다.

4. 코드로 비교

Python Wrapper API

import lightgbm as lgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

iris = load_iris()
X, y = iris.data, iris.target
# X.shape, y.shape

# 데이터셋 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_train.shape, X_test.shape, y_train.shape, y_test.shape

# 이게 핵심 코드
train_data = lgb.Dataset(X_train, label = y_train)
test_data = lgb.Dataset(X_test, label = y_test)

# type(train_data)
params = {
    'objective': 'multiclass',
    'num_class': 3,  # Number of classes in the dataset
    'metric': 'multi_logloss',
    'boosting_type': 'gbdt',
    'num_leaves': 31,
    'learning_rate': 0.05,
    'feature_fraction': 0.9,
    'bagging_fraction': 0.8,
    'bagging_freq': 5,
    'verbose': 0
}

# 모델 학습
num_round = 5 # 경사하강법, learning_rate
model = lgb.train(params, train_data, num_round, valid_sets = [test_data])

# 예측
y_pred = model.predict(X_test)
y_pred_max = [list(x).index(max(x)) for x in y_pred]

# 모델 평가
accuracy = accuracy_score(y_test, y_pred_max)
print("Accuracy:", accuracy)

 

Scikit-Learn Wrapper API

import lightgbm as lgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

iris = load_iris()
X, y = iris.data, iris.target
# X.shape, y.shape

# 데이터셋 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# X_train.shape, X_test.shape, y_train.shape, y_test.shape

# 모델 학습
lgb_clf = lgb.LGBMClassifier(objective='multiclass',
                             num_class=3,  # Number of classes in the dataset
                             num_leaves=31,
                             learning_rate=0.05,
                             feature_fraction=0.9,
                             bagging_fraction=0.8,
                             bagging_freq=5)

lgb_clf.fit(X_train, y_train)

y_pred = lgb_clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
accuracy