표 형식 데이터에 대한 이진 분류 모델을 선택하면서 저는 빠르고 비딥 러닝 모델인 GBDT(Gradient Boosting Decision Trees)를 빠르게 시험해 보기로 결정했습니다. 이 문서에서는 BigQuery를 데이터 소스로 사용하고 모델링을 위해 XGBoost 알고리즘을 사용하여 Jupyter Notebook 스크립트를 만드는 과정을 설명합니다.
설명 없이 바로 스크립트로 넘어가고 싶은 분들을 위해 여기 있습니다. 프로젝트에 맞게 project_name,dataset_name, table_name을 조정해주세요.
import xgboost as xgb from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.metrics import precision_score, recall_score, f1_score, log_loss from google.cloud import bigquery # Function to load data from BigQuery def load_data_from_bigquery(query): client = bigquery.Client() query_job = client.query(query) df = query_job.to_dataframe() return df def compute_metrics(labels, predictions, prediction_probs): precision = precision_score(labels, predictions, average='macro') recall = recall_score(labels, predictions, average='macro') f1 = f1_score(labels, predictions, average='macro') loss = log_loss(labels, prediction_probs) return { 'precision': precision, 'recall': recall, 'f1': f1, 'loss': loss } # Query in BigQuery query = """ SELECT * FROM `. . ` """ # Loading data df = load_data_from_bigquery(query) # Target data y = df["reaction"] # Input data X = df.drop(columns=["reaction"], axis=1) # Splitting data into training and validation sets X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=1) # Training the XGBoost model model = xgb.XGBClassifier(eval_metric='logloss') # Setting the parameter grid param_grid = { 'max_depth': [3, 4, 5], 'learning_rate': [0.01, 0.1, 0.2], 'n_estimators': [100, 200, 300], 'subsample': [0.8, 0.9, 1.0] } # Initializing GridSearchCV grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=3, scoring='accuracy', verbose=1, n_jobs=-1) # Executing the grid search grid_search.fit(X_train, y_train) # Displaying the best parameters print("Best parameters:", grid_search.best_params_) # Model with the best parameters best_model = grid_search.best_estimator_ # Predictions on validation data val_predictions = best_model.predict(X_val) val_prediction_probs = best_model.predict_proba(X_val) # Predictions on training data train_predictions = best_model.predict(X_train) train_prediction_probs = best_model.predict_proba(X_train) # Evaluating the model (validation data) val_metrics = compute_metrics(y_val, val_predictions, val_prediction_probs) print("Optimized Validation Metrics:", val_metrics) # Evaluating the model (training data) train_metrics = compute_metrics(y_train, train_predictions, train_prediction_probs) print("Optimized Training Metrics:", train_metrics)
이전에는 데이터가 CSV 파일로 Cloud Storage에 저장되었지만 느린 데이터 로드로 인해 학습 프로세스의 효율성이 저하되어 더 빠른 데이터 처리를 위해 BigQuery로 전환하게 되었습니다.
from google.cloud import bigquery client = bigquery.Client()
이 코드는 환경 변수 또는 Google Cloud SDK를 통해 설정할 수 있는 Google Cloud 사용자 인증 정보를 사용하여 BigQuery 클라이언트를 초기화합니다.
def load_data_from_bigquery(query): query_job = client.query(query) df = query_job.to_dataframe() return df
이 함수는 SQL 쿼리를 실행하고 그 결과를 Pandas의 DataFrame으로 반환하므로 효율적인 데이터 처리가 가능합니다.
XGBoost는 경사 부스팅을 활용한 고성능 기계 학습 알고리즘으로 분류 및 회귀 문제에 널리 사용됩니다.
https://arxiv.org/pdf/1603.02754
import xgboost as xgb model = xgb.XGBClassifier(eval_metric='logloss')
여기서 XGBClassifier 클래스는 로그 손실을 평가 지표로 사용하여 인스턴스화됩니다.
from sklearn.model_selection import train_test_split X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=1)
이 기능은 데이터를 훈련 세트와 검증 세트로 분할하는데, 이는 모델 성능을 테스트하고 과적합을 방지하는 데 중요합니다.
from sklearn.model_selection import GridSearchCV param_grid = { 'max_depth': [3, 4, 5], 'learning_rate': [0.01, 0.1, 0.2], 'n_estimators': [100, 200, 300], 'subsample': [0.8, 0.9, 1.0] } grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=3, scoring='accuracy', verbose=1, n_jobs=-1) grid_search.fit(X_train, y_train)
GridSearchCV는 모델에 가장 적합한 매개변수 조합을 찾기 위해 교차 검증을 수행합니다.
모델의 성능은 검증 데이터세트의 정밀도, 재현율, F1 점수, 로그 손실을 사용하여 평가됩니다.
def compute_metrics(labels, predictions, prediction_probs): from sklearn.metrics import precision_score, recall_score, f1_score, log_loss return { 'precision': precision_score(labels, predictions, average='macro'), 'recall': recall_score(labels, predictions, average='macro'), 'f1': f1_score(labels, predictions, average='macro'), 'loss': log_loss(labels, prediction_probs) } val_metrics = compute_metrics(y_val, val_predictions, val_prediction_probs) print("Optimized Validation Metrics:", val_metrics)
노트북을 실행하면 최상의 매개변수와 모델 평가 측정항목을 보여주는 다음 출력을 얻게 됩니다.
Best parameters: {'learning_rate': 0.2, 'max_depth': 5, 'n_estimators': 300, 'subsample': 0.9} Optimized Validation Metrics: {'precision': 0.8919952583956949, 'recall': 0.753797304483842, 'f1': 0.8078981867164722, 'loss': 0.014006406471894417} Optimized Training Metrics: {'precision': 0.8969556573175115, 'recall': 0.7681976753444204, 'f1': 0.8199353049298048, 'loss': 0.012475375680566196}
어떤 경우에는 BigQuery보다 Google Cloud Storage에서 데이터를 로드하는 것이 더 적절할 수 있습니다. 다음 함수는 Cloud Storage에서 CSV 파일을 읽고 이를 Pandas의 DataFrame으로 반환하며, load_data_from_bigquery 함수와 상호 교환적으로 사용할 수 있습니다.
from google.cloud import storage def load_data_from_gcs(bucket_name, file_path): client = storage.Client() bucket = client.get_bucket(bucket_name) blob = bucket.blob(file_path) data = blob.download_as_text() df = pd.read_csv(io.StringIO(data), encoding='utf-8') return df
사용 예:
bucket_name = '' file_path = ' ' df = load_data_from_gcs(bucket_name, file_path)
XGBoost 대신 LightGBM을 사용하려면 동일한 설정에서 XGBClassifier를 LGBMClassifier로 간단히 교체하면 됩니다.
import lightgbm as lgb model = lgb.LGBMClassifier()
향후 기사에서는 학습에 BigQuery ML(BQML)을 사용하는 방법을 다룰 예정입니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3