مهمترین الگوریتمهای یادگیری ماشین (به همراه کدهای پایتون و 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 و پایتون صرفاً آشنا کردن شما با آغاز مسیر بوده است. اگر علاقهمند به یادگیری ماشینی هستید همین اکنون شروع کنید. مسئلهای را انتخاب کنید، درک فیزیکی از فرایند آن کسب کنید و این کدها را در مورد آنها به کار گیرید. مطمئناً از دیدن نتیجه شگفتزده میشوید!
سلام کدام روش بوستینگ برای برآورد داده های گمشده توصیه می شود، با توجه به اینکه به داده های پرت حساس است.