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인 XGBClassifier나 XGBRegressor는 Scikit-learn의 GridSearchCV나 cross_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