مهم‌ترین الگوریتم‌های یادگیری ماشین (به همراه کدهای پایتون و R) — بخش یازدهم و پایانی: الگوریتم‌های ارتقای گرادیان

۱۷۱۹ بازدید
آخرین به‌روزرسانی: ۱۴ شهریور ۱۴۰۲
زمان مطالعه: ۵ دقیقه
مهم‌ترین الگوریتم‌های یادگیری ماشین (به همراه کدهای پایتون و R) — بخش یازدهم و پایانی: الگوریتم‌های ارتقای گرادیان

GBM یک الگوریتم ارتقایی است که وقتی با مقدار زیادی داده سروکار داریم برای ارائه یک پیش‌بینی با توان بالا استفاده می‌شود. این الگوریتم‌ها در واقع مجموعه‌ای از الگوریتم‌هایی هستند که پیش‌بینی چند تخمین‌گر پایه را در جهت بهبود پایداری پیش‌بینی نسبت به یک تخمین‌گر منفرد ترکیب می‌کنند. این الگوریتم‌ها شامل چند پیش‌بین ضعیف یا متوسط هستند که با هم یک پیش‌بین قوی ایجاد می‌کنند. این الگوریتم‌های ارتقا همیشه در رقابت‌های دانش داده‌ها مانند Kaggle، AV Hackathon و CrowdAnalytix به خوبی عمل می‌کنند.

الگوریتم‌های ارتقای گرادیان (Gradient Boosting)

1- GBM

کد پایتون

#Import Library

from sklearn.ensemble import GradientBoostingClassifier

#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset

# Create Gradient Boosting Classifier object

model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)

# Train the model using the training sets and check score

model.fit(X, y)

#Predict Output

predicted= model.predict(x_test)

کد R

#Import Library

from sklearn.ensemble import GradientBoostingClassifier

#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset

# Create Gradient Boosting Classifier object

model= GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1, random_state=0)

# Train the model using the training sets and check score

model.fit(X, y)

#Predict Output

predicted= model.predict(x_test)

GradientBoostingClassifier و جنگل تصادفی دو کلاس‌بندی‌کننده درختی مختلف هستند و اغلب در مورد تفاوت آنها سؤالاتی مطرح می‌شود.

2- XGBoost

یکی دیگر از الگوریتم‌های ارتقای گرادیان که مشهور است تصمیمی بین برد و باخت در برخی رقابت‌های Kaggle است.

XGBoost توان پیش‌بینی بسیار بالایی دارد که آن را تبدیل به بهترین گزینه برای دقت در رویدادهای مختلف می‌کند چراکه هم مدل خطی دارد و هم الگوریتم یادگیری درختی. این الگوریتم تقریباً 10 برابر سریع‌تر از الگوریتم‌های موجود ارتقای گرادیان است.

این الگوریتم شامل تابع‌های عینی مختلف، رگرسیون، کلاس‌بندی و رتبه‌بندی است.

یکی از جالب‌ترین نکات در مورد XGBoost این است که به نام تکنیک ارتقای رگوله شده نیز شناخته می‌شود. این الگوریتم به کاهش مدل‌های بزرگ کمک می‌کند و همچنین پشتیبانی خوبی در طیف وسیعی از زبان‌ها مانند اسکالا، جاوا، R، پایتون، جولیا و C++ دارد.

این الگوریتم از تمرین توزیع یافته و پراکنده بر روی دستگاه‌های مختلف پشتیبانی می‌کند که شامل خوشه‌های GCE، AWS، Azure و Yarn می‌شود. XGBoost را می‌توان با اسپارک، فلینک و دیگر سیستم‌های داده‌ای ابری که بر مبنای اعتبارسنجی متقابل در هر تکرار فرایند ارتقا ساخته شده‌اند ادغام کرد.

کد پایتون

from xgboost import XGBClassifier

from sklearn.model_selection import train_test_split

from sklearn.metrics import accuracy_score

X = dataset[:,0:10]

Y = dataset[:,10:]

seed = 1

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.33, random_state=seed)

model = XGBClassifier()

model.fit(X_train, y_train)

#Make predictions for test data

y_pred = model.predict(X_test)

کد R

require(caret)

x <- cbind(x_train,y_train)

# Fitting model

TrainControl <- trainControl(method = "repeatedcv", number = 10, repeats = 4)

model<- train(y ~., data = x, method = "xgbLinear", trControl = TrainControl,verbose = FALSE)

OR

model<- train(y ~., data = x, method = "xgbTree", trControl = TrainControl,verbose = FALSE)

predicted <- predict(model, x_test)

3- LightGBM

این الگوریتم یک چارچوب ارتقای گرادیان است که از الگوریتم‌های یادگیری بر مبنای درخت استفاده می‌کند. این الگوریتم برای استفاده توزیع یافته و کارآمد با مزیت‌های زیر طراحی شده است:

  • سرعت تمرین بالا و کارآمدی بیشتر
  • استفاده کمتر از حافظه
  • دقت بهتر
  • پشتیبانی از محاسبات موازی و بر مبنای GPU
  • قابلیت مدیریت داده‌های بزرگ‌مقیاس

این چارچوب یک ارتقای گرادیان سریع و با عملکرد بالا است که بر اساس الگوریتم‌های درخت تصمیم ساخته شده است. این چارچوب برای رتبه‌بندی، کلاس‌بندی و بسیاری وظایف دیگر یادگیری ماشینی استفاده می‌شود. این چارچوب تحت پروژه کیت ابزار یادگیری ماشینی توزیع یافته مایکروسافت توسعه‌یافته است.

از آنجا که LightGBM بر اساس الگوریتم‌های درخت تصمیم طراحی شده است، از طریق برگ درخت با بهترین برازش افراز می‌کند در حالی که دیگر الگوریتم‌های ارتقا از طریق عمق درخت یا سطح آن به جای برگ عمل می‌کنند. بنابراین وقتی LightGBM بر روی یک برگ رشد می‌کند، این الگوریتم برگی می‌تواند کاهش اتلاف بیشتری را نسبت به الگوریتم‌های سطحی داشته باشد و از این‌رو نتایج آن از نظر دقت بسیار بهتر هستند. این عملکرد به ندرت از سوی دیگر الگوریتم‌های ارتقایی موجود به دست می‌آید.

ضمناً این الگوریتم به طرز شگفت‌انگیزی سریع است و عبارت Light (سبک) در عنوان آن به همین نکته اشاره دارد.

کد پایتون

data = np.random.rand(500, 10) # 500 entities, each contains 10 features

label = np.random.randint(2, size=500) # binary target

train_data = lgb.Dataset(data, label=label)

test_data = train_data.create_valid('test.svm')

param = {'num_leaves':31, 'num_trees':100, 'objective':'binary'}

param['metric'] = 'auc'

num_round = 10

bst = lgb.train(param, train_data, num_round, valid_sets=[test_data])

bst.save_model('model.txt')

# 7 entities, each contains 10 features

data = np.random.rand(7, 10)

ypred = bst.predict(data)

کد R

library(RLightGBM)

data(example.binary)

#Parameters

num_iterations <- 100

config <- list(objective = "binary",  metric="binary_logloss,auc", learning_rate = 0.1, num_leaves = 63, tree_learner = "serial", feature_fraction = 0.8, bagging_freq = 5, bagging_fraction = 0.8, min_data_in_leaf = 50, min_sum_hessian_in_leaf = 5.0)

#Create data handle and booster

handle.data <- lgbm.data.create(x)

lgbm.data.setField(handle.data, "label", y)

handle.booster <- lgbm.booster.create(handle.data, lapply(config, as.character))

#Train for num_iterations iterations and eval every 5 steps

lgbm.booster.train(handle.booster, num_iterations, 5)

#Predict

pred <- lgbm.booster.predict(handle.booster, x.test)

#Test accuracy

sum(y.test == (y.pred > 0.5)) / length(y.test)

#Save model (can be loaded again via lgbm.booster.load(filename))

lgbm.booster.save(handle.booster, filename = "/tmp/model.txt")

اگر با بسته Caret در R آشنا باشید، این هم یک روش دیگر پیاده‌سازی LightGBM در R است:

require(caret)

require(RLightGBM)

data(iris)

model <-caretModel.LGBM()

fit <- train(Species ~., data = iris, method=model, verbosity = 0)

print(fit)

y.pred <- predict(fit, iris[,1:4])

library(Matrix)

model.sparse <- caretModel.LGBM.sparse()

#Generate a sparse matrix

mat <- Matrix(as.matrix(iris[,1:4]), sparse = T)

fit <- train(data.frame(idx = 1:nrow(iris)), iris$Species, method = model.sparse, matrix = mat, verbosity = 0)

print(fit)

4- Catboost

این الگوریتم یک الگوریتم یادگیری ماشینی توسعه‌یافته از سوی یاندکس (Yandex) است که اخیراً کد-باز شده است. این الگوریتم به‌راحتی می‌تواند با چارچوب‌های یادگیری عمیق مانند TensorFlow گوگل و Core ML اپل ادغام شود.

بهترین بخش در مورد Catboost این است که نیازمند داده‌های تمرینی گسترده‌ای مانند دیگر مدل‌های ML نیست و می‌تواند بر روی فرمت‌های داده‌ای مختلفی عمل کند؛ که نشان‌دهنده پایداری بسیار بالای آن است.

قبل از پیاده‌سازی مطمئن شوید که مشکل داده‌های مفقود را حل کرده‌اید.

Catboost می‌تواند به طور خودکار و بدون خطای تبدیل نوع با متغیرهای دسته‌ای کار کند. این قابلیت کمک می‌کند که بر روی بهتر کردن مدل تمرکز کنیم و نه رفع خطاهای مختلف.

کد پایتون

import pandas as pd

import numpy as np

from catboost import CatBoostRegressor

#Read training and testing files

train = pd.read_csv("train.csv")

test = pd.read_csv("test.csv")

#Imputing missing values for both train and test

train.fillna(-999, inplace=True)

test.fillna(-999,inplace=True)

#Creating a training set for modeling and validation set to check model performance

X = train.drop(['Item_Outlet_Sales'], axis=1)

y = train.Item_Outlet_Sales

from sklearn.model_selection import train_test_split

X_train, X_validation, y_train, y_validation = train_test_split(X, y, train_size=0.7, random_state=1234)

categorical_features_indices = np.where(X.dtypes!= np.float)[0]

#importing library and building model

from catboost import CatBoostRegressormodel=CatBoostRegressor(iterations=50, depth=3, learning_rate=0.1, loss_function='RMSE')

model.fit(X_train, y_train,cat_features=categorical_features_indices,eval_set=(X_validation, y_validation),plot=True)

submission = pd.DataFrame()

submission['Item_Identifier'] = test['Item_Identifier']

submission['Outlet_Identifier'] = test['Outlet_Identifier']

submission['Item_Outlet_Sales'] = model.predict(test)

کد R

set.seed(1)

require(titanic)

require(caret)

require(catboost)

tt <- titanic::titanic_train[complete.cases(titanic::titanic_train),]

data <- as.data.frame(as.matrix(tt), stringsAsFactors = TRUE)

drop_columns = c("PassengerId", "Survived", "Name", "Ticket", "Cabin")

x <- data[,!(names(data) %in% drop_columns)]y <- data[,c("Survived")]

fit_control <- trainControl(method = "cv", number = 4,classProbs = TRUE)

grid <- expand.grid(depth = c(4, 6, 8),learning_rate = 0.1,iterations = 100, l2_leaf_reg = 1e-3,            rsm = 0.95, border_count = 64)

report <- train(x, as.factor(make.names(y)),method = catboost.caret,verbose = TRUE, preProc = NULL,tuneGrid = grid, trControl = fit_control)

print(report)

importance <- varImp(report, scale = FALSE)

print(importance)

سخن پایانی

اینک مطمئنیم که شما ایده‌ای هرچند کلی از الگوریتم‌های یادگیری ماشینی متداول در ذهن دارید. نیت ما از نوشتن این سری آموزش‌ها و ارائه کدهای R و پایتون صرفاً آشنا کردن شما با آغاز مسیر بوده است. اگر علاقه‌مند به یادگیری ماشینی هستید همین اکنون شروع کنید. مسئله‌ای را انتخاب کنید، درک فیزیکی از فرایند آن کسب  کنید و این کدها را در مورد آنها به کار گیرید. مطمئناً از دیدن نتیجه شگفت‌زده می‌شوید!

بر اساس رای ۲۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
۱ دیدگاه برای «مهم‌ترین الگوریتم‌های یادگیری ماشین (به همراه کدهای پایتون و R) — بخش یازدهم و پایانی: الگوریتم‌های ارتقای گرادیان»

سلام کدام روش بوستینگ برای برآورد داده های گمشده توصیه می شود، با توجه به اینکه به داده های پرت حساس است.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *