توضیح XGBoost برای مبتدیان
XGBoost کتابخانه متنبازی است که نقش مؤثری در اجرای کارآمدِ درختهای تصمیم دارد. کد C++ به همراه واسط کاربری پایتون میتواند بستهای قدرتمند بسازد که بهراحتی اجرا شود. XGBoost به لطف عملکرد فوقالعادهای که دارد، در بسیاری از مسابقات Kaggle به موفقیت رسیده است. قابلیت تقویت گرادیان این کتابخانه نظیر ندارد و انتظار میرود در آینده، خبرهای خوبی درباره آن به گوش برسد. مفاهیم پایه کتابخانه XGBoost در این نوشتار توضیح داده خواهد شد. در ابتدا، سازوکار تقویت گرادیان را بررسی خواهیم کرد و سپس به نمونهای اشاره خواهیم کرد که نقش XGBoost را در تسریع کارها نشان میدهد.
تقویت درختها
مدل یادگیری ماشین سادهای نظیر درخت تصمیم میتواند به آموزش مدل در مجموعهدادهمان کمک کند. این مدل در امر پیشبینی استفاده میشود. ممکن است پارامترها را قدری تغییر دهیم یا امر دادهافزایی را بررسی کنیم؛ اما در نهایت فقط از یک مدل استفاده میکنیم. حتی در صورتی که یک مجموعه بسازیم، همه مدلها بهصورت جداگانه آموزش داده شده و در دادههایمان به کار برده میشوند. از سوی دیگر، عمل «تقویت Boosting» در رویکردی تکراریiterative به اجرا در میآید؛ اما کماکان یک روش کلاسهبندی جمعیEnsemble technique برشمرده میشود. مدلهای بسیاری در این روشها با یکدیگر ادغام میشوند، تا عملیات نهایی صورت گیرد، اما رویکرد هوشمندانهای در پیش گرفته میشود.
به جای آموزش کلیه مدلها بهصورت جدا از یکدیگر، عمل «تقویت» مدلها را پشت سر هم آموزش میدهد. هر مدل جدید با این هدف آموزش داده میشود که خطاهای ناشی از مدلهای پیشین تصحیح شوند. مدلها تا زمانی بهصورت متوالی افزوده میشوند که دیگر امکان پیشرفتِ بیشتر وجود نداشته باشد. مزیت این روش تکراری این است که مدلهای اضافهشده در صدد تصحیح اشتباهاتی هستند که سایر مدلها مرتکب شدهاند. در روش کلاسهبندی جمعی استانداردی که مدلها بهصورت جداگانه آموزش داده میشوند، کلیه مدلها ممکن است اشتباهات یکسانی را مرتکب شوند.
تقویت گرادیان به روشی اطلاق میشود که در آن، مدلهای جدید با هدفِ پیشبینی باقیماندههای مدلهای پیشین آموزش داده میشوند. جزئیات این روش در نمودار زیر نشان داده شده است.
آغاز به کار با XGBoost
حال، نوبت به استفاده از کتابخانه شگفتانگیز XGBoost رسیده است. در گام نخست باید کتابخانهای را نصب کنیم که به آسانترین شکل ممکن با pip انجام میگیرد. حتی بهتر است این عملیات در محیط مجازی پایتون انجام شود.
pip install xgboost
بهکارگیری داده با XGBoost
در ادامه نوشتار از دیتاست گل زنبقIris flowers dataset استفاده خواهیم کرد. در این راستا، میتوان از Scikit Learn برای بارگذاری آن در پایتون استفاده کرد. همچنین، کتابخانه تازهنصبشده XGBoost نیز نیاز به وارد کردن دارد.
from sklearn import datasets import xgboost as xgb iris = datasets.load_iris() X = iris.data y = iris.target
بهکارگیری دادهها با تفکیک بین دادههای آموزشی و آزمایشی آغاز میشود. بدین ترتیب، امکان مشاهده نحوه عملکرد XGBoost فراهم میآید. این بار با تفکیک %20-%80 ادامه میدهیم.
from sklearn.model_selection import train_test_split X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size=0.2)
برای اینکه XGBoost قادر به استفاده از دادههای ما باشد، باید آن را به قالب خاصی تبدیل کنیم، تا XGBoost بتواند مدیریتش کند. این قالب «DMatrix» نام دارد. این رویکرد تکخطی برای تبدیل آرایش نامنظم دادهها به قالب «DMatrix» استفاده میشود.
D_train = xgb.DMatrix(X_train, label=Y_train) D_test = xgb.DMatrix(X_test, label=Y_test)
تعریف مدل XGBoost
حال که تمامی دادهها بارگذاری شده است، میتوان پارامترهای روش کلاسهبندی جمعی تقویت گرادیان را تعریف کرد. تعدادی از مهمترین پارامترها در بخش زیر نشان داده شده است. اگر میخواهید تَسکها و مدلهای پیچیدهتری را بررسی کنید، به لیست کامل پارامترهای احتمالی در وبسایت رسمی XGBoost مراجعه نمایید.
param = { 'eta': 0.3, 'max_depth': 3, 'objective': 'multi:softprob', 'num_class': 3} steps = 20 # The number of training iterations
سادهترین پارامترها عبارتاند از: max_depth (عمق بیشینه درختهای تصمیمی که آموزش داده میشوند)، objective (تابع زیان مورداستفاده) و num_class (تعداد دستهها در دیتاست). الگوریتمeta باید بیش از پیش مورد توجه قرار گیرد.
با توجه به نظریهمان، ایجاد و افزودن درختهای تصمیم به مدل کلاسهبندی جمعی Ensemble model از جمله عملیاتی است که در «تقویت گرادیان» انجام میشود. درختهای جدید با هدفِ تصحیح خطاهای باقیمانده در پیشبینیهای بهدستآمده از کلاسهبندی جمعی موجود ایجاد میشوند. بنا به ماهیت مدل کلاسهبندی جمعی، احتمال بیشبرازش افزایش مییابد. در این راستا، چندین مدل در کنار یکدیگر قرار میگیرند، تا مدل بسیار بزرگ و پیچیدهای ایجاد گردد. عدهای از eta بهعنوان نرخ یادگیریLearning rate یاد میکنند. به جای افزودن پیشبینی درختهای جدید به مدل کلاسهبندی جمعی با وزن کامل، eta به باقیماندههایی ضرب میشود که با هدف کاهش وزن اضافه میشوند. این اقدام میتواند پیچیدگی مدل را به طرز مؤثری کاهش دهد. رایج است که مقادیر کوچک در بازه 1/0 تا 3/0 جای گیرند. وزن کمِ این باقیماندهها کماکان میتواند نقش مهمی در آموزش مدلهای قدرتمند داشته باشد، اما اجازه نمیدهد مدل با پیچیدگی بیش از حد همراه شود. در این شرایط، احتمال بیشبرازش بالاست.
آموزش و آزمایش
طبق رویکردی که در Scikit Learn در پیش گرفته شد، مدلمان را سرانجام آموزش میدهیم.
model = xgb.train(param, D_train, steps)
اکنون، نوبت به ارزیابی رسیده است. این فرایند شباهت بسیاری به آموزش مدلها در Scikit Learn دارد:
import numpy as np from sklearn.metrics import precision_score, recall_score, accuracy_score preds = model.predict(D_test) best_preds = np.asarray([np.argmax(line) for line in preds]) print("Precision = {}".format(precision_score(Y_test, best_preds, average='macro'))) print("Recall = {}".format(recall_score(Y_test, best_preds, average='macro'))) print("Accuracy = {}".format(accuracy_score(Y_test, best_preds)))
بسیار عالی!
اگر تا به اینجا همه مراحل را پابهپای ما طی کرده باشید، باید دستکم به دقت 90 درصدی دست پیدا کرده باشید.
بررسی بیشتر با XGBoost
مفاهیم پایه XGBoost در این نوشتار توضیح داده شد؛ اما چند ویژگی جالب دیگر وجود دارد که به شما کمک میکند، تا بهترین عملکرد را برای مدلهایتان به ارمغان آورید.
- پارامتر گاما میتواند نقش مهمی در کنترل بیشبرازش ایفا کند و کاهش کمینه زیان را نیز تصریح میکند، تا بخشبندی بیشتر در گره برگ درخت میسر شود. به تعبیری، ایجاد گره جدید زیان را به مقدار معین کاهش نمیدهد؛ پس اصلاً آن را ایجاد نخواهیم کرد.
- پارامتر تقویتکننده Booster parameter این فرصت را در اختیار افراد قرار میدهد، تا نوع مدلی را که میخواهند در هنگام ساخت کلاسهبندی جمعی به کار ببرند، تعیین کنند. gbtree پیشفرض ماست که مجموعهای از درختهای تصمیم میسازد. اگر دادههایتان بیش از حد پیچیده نیست، میتوانید از gblinear استفاده کنید که سادهتر و آسانتر است، زیرا مجموعهای از مدلهای خطی تهیه میکند.
- تعیین هایپرپارامترهای بهینه مدلهای یادگیری ماشین میتواند چالش بزرگی به همراه داشته باشد، آیا بهتر نیست این کار را به Scikit Learn بسپاریم؟ امکان تلفیق جستوجوی شبکه Scikit Learn با کلاسیفایر XGBoost وجود دارد:
from sklearn.model_selection import GridSearchCV clf = xgb.XGBClassifier() parameters = { "eta" : [0.05, 0.10, 0.15, 0.20, 0.25, 0.30 ] , "max_depth" : [ 3, 4, 5, 6, 8, 10, 12, 15], "min_child_weight" : [ 1, 3, 5, 7 ], "gamma" : [ 0.0, 0.1, 0.2 , 0.3, 0.4 ], "colsample_bytree" : [ 0.3, 0.4, 0.5 , 0.7 ] } grid = GridSearchCV(clf, parameters, n_jobs=4, scoring="neg_log_loss", cv=3) grid.fit(X_train, Y_train)
اگر زمان کافی دارید، این کار را در دیتاست بزرگتری انجام دهید. جستوجوی شبکه اساساً به معنای آموزش مجموعهای از درختهای تصمیم برای چندین بار است.
به محض اینکه مدل XGBoost آموزش یافت، میتوانید توصیفی خوانا از آن در قالب فایل متنی ارائه کنید:
model.dump_model('dump.raw.txt')