تعلم الآلة: Mixing Ensemble in Python

المزج هو مجموعة خوارزمية تعلم الآلة. هذا اسم عامي للتعميم المكدس [فيما يلي سنستخدم مصطلح "التعبئة والتغليف" بدلاً من مصطلح "التكديس" المقبول في الأعمال العلمية] أو مجموعة التغليف ، حيث بدلاً من تدريب النموذج الأساسي على التنبؤات خارج المجموعات التي تم إجراؤها بواسطة النموذج الأساسي ، يتم تدريب النموذج على التنبؤات التي تم إجراؤها على مجموعة بيانات مستقلة.



تم استخدام المزج لوصف نماذج التجميع التي جمعت عدة مئات من النماذج في مسابقة Netflix للتعلم الآلي بقيمة 1000000 دولار ، وعلى هذا النحو ، يظل المزج طريقة شائعة واسمًا للتجميع في مسابقات التعلم الآلي مثل Kaggle ... خاصة لبدء تدفق جديد لدورة "التعلم الآلي"نشارك برنامجًا تعليميًا حول كيفية تطوير وتقييم مجموعة مختلطة في بيثون. بعد الانتهاء من هذا البرنامج التعليمي ، ستعرف:



  • المجموعات المختلطة هي نوع من تجميع النماذج التي يتم فيها تدريب النموذج المعياري باستخدام تنبؤات على مجموعة بيانات اختبار مستقلة للتحقق من صحة الاختبار بدلاً من التنبؤات أثناء التحقق المتقاطع k-fold
  • كيفية تطوير مجموعة مختلطة ، بما في ذلك التدريب النموذجي ووظائف التنبؤ بناءً على بيانات جديدة.
  • كيفية تقييم المجموعات المختلطة للتصنيف ومشاكل نمذجة الانحدار التنبئي.













نظرة عامة على البرنامج التعليمي



هذا البرنامج التعليمي مقسم إلى أربعة أجزاء. ها هم:



  • فرقة مختلطة.
  • إنشاء فرقة مختلطة.
  • المجموعة المختلطة في مشكلة التصنيف.
  • المجموعة المختلطة في مشكلة الانحدار.


فرقة مختلطة



المزج هو أحد أساليب التعلم الآلي للمجموعة التي تستخدم نموذج التعلم الآلي لتعلم أفضل طريقة للجمع بين التنبؤات من نماذج أعضاء المجموعة المتعددة.



لذا فإن الخلط هو نفس تعميم التراص المعروف باسم التكديس. غالبًا ما يتم استخدام المزج والتجميع بالتبادل في نفس المقالة أو وصف النموذج.



لقد وجد العديد من ممارسي التعلم الآلي نجاحًا في استخدام التجميع والتقنيات ذات الصلة لتحسين دقة التنبؤ على أي من النماذج الفردية. في بعض السياقات ، يُطلق على التجميع أيضًا اسم المزج. سنقوم أيضًا بتبادل المصطلحات هنا.

التراص الخطي المرجح الميزة ، 2009.


تحتوي بنية نموذج الدُفعات على نموذجين أساسيين أو أكثر ، يُشار إليهما غالبًا باسم نماذج المستوى صفر ، والنموذج المعدني ، الذي يجمع بين تنبؤات النموذج الأساسي ، هو نموذج من المستوى الأول. يتم تدريب النموذج المعدني بناءً على التنبؤات التي قدمتها النماذج الأساسية على بيانات خارج العينة.



  • نماذج المستوى الصفري ( النماذج الأساسية ) هي نماذج مدربة على بيانات التدريب التي يتم جمع توقعاتها.
  • نموذج المستوى الأول ( metamodel ) هو نموذج يتعلم أفضل طريقة للجمع بين توقعات النماذج الأساسية.


ومع ذلك ، فإن الخلط له دلالات معينة لبناء نموذج مجمع معبأ. يمكن أن يوفر المزج تطوير مجموعة مكدس ، حيث تكون النماذج الأساسية هي أي نوع من نماذج التعلم الآلي ، والنموذج المعدني هو نموذج خطي "يمزج" تنبؤات النماذج الأساسية. على سبيل المثال ، يحسب نموذج الانحدار الخطي عند التنبؤ بقيمة رقمية ، أو نموذج الانحدار اللوجستي عند توقع تسمية فئة ، المجموع المرجح للتنبؤات التي قدمتها النماذج الأساسية وسيتم التعامل معه على أنه مزيج من التنبؤات.



  • المجموعة المختلطة : استخدم نموذجًا خطيًا ، مثل الانحدار الخطي أو الانحدار اللوجستي ، كنموذج metamodel في مجموعة نموذج دفعي.


كان المزج مصطلحًا شائعًا للإشارة إلى مجموعة مغلفة خلال مسابقة Netflix لعام 2009. تضمنت المسابقة فرقًا تبحث عن نماذج تنبؤية تقدم أداءً أفضل من خوارزمية Netflix الأصلية ، حيث مُنحت جائزة قدرها 1،000،000 دولار للفريق الذي حقق تحسنًا بنسبة 10 بالمائة في الأداء.



حلنا مع RMSE = 0.8643 ^ 2 هو مزيج خطي لأكثر من 100 نتيجة. [...] من خلال وصف الأساليب ، نسلط الضوء على المتنبئين المحددين الذين شاركوا في الحل المختلط النهائي.

حل BellKor 2008 لجائزة Netflix ، 2008.


وبالتالي ، فإن الخلط هو المصطلح العامي للتعلم الجماعي باستخدام بنية نموذجية مثل التجميع. نادرًا ما يتم استخدامه في الكتب المدرسية أو الأوراق الأكاديمية بخلاف تلك المتعلقة بالتعلم الآلي في المنافسة. الأكثر شيوعًا ، يستخدم مصطلح المزج لوصف تطبيق معين للتجميع حيث يتم تدريب النموذج المعياري على التنبؤات التي يتم إجراؤها بواسطة النماذج الأساسية مع مجموعة بيانات تحقق مستقلة. في هذا السياق ، يتم حجز التغليف للنموذج المعدني المدرب على التنبؤات أثناء إجراء التحقق المتبادل.



  • المزج : مجموعة من نوع الدُفعة حيث يتم تدريب النموذج الأساسي على تنبؤات تم إجراؤها على مجموعة بيانات مستقلة.
  • التجميع : مجموعة من نوع الدُفعات حيث يتم تدريب النموذج الأساسي على التنبؤات التي تم إجراؤها أثناء التحقق المتقاطع k-fold.


هذا التمييز شائع في مجتمع مسابقة التعلم الآلي في Kaggle.



المزج هو الكلمة التي ابتكرها الفائزون في Netflix. إنه قريب جدًا من التعميم ، ولكنه أبسط قليلاً وخطر تسرب المعلومات أقل. [...] من خلال المزج ، بدلاً من إنشاء تنبؤات أثناء التحقق المتبادل لمجموعة التدريب ، يمكنك إنشاء مجموعة صغيرة مستقلة ، على سبيل المثال ، 10٪ من مجموعة التدريب. ثم يتم تدريب نموذج التجميع على هذه المجموعة الصغيرة فقط.

دليل Kaggle Ensemble ، MLWave ، 2015.


نستخدم آخر تعريف للمزج. دعونا نرى كيف يتم تنفيذه.



تطوير المجموعات المختلطة



لا تدعم مكتبة scikit-learn الاختلاط خارج الصندوق في وقت كتابة هذه السطور. لكن يمكننا تنفيذه بأنفسنا باستخدام نماذج scikit-Learn. أولاً ، تحتاج إلى إنشاء مجموعة من النماذج الأساسية. يمكن أن تكون هذه أي نماذج نحبها لمشكلة الانحدار أو التصنيف. يمكننا تحديد دالة get_models () التي تعرض قائمة من النماذج ، حيث يتم تعريف كل نموذج على أنه مجموعة مع اسم ومصنف مخصص أو كائن انحدار. على سبيل المثال ، بالنسبة لمشكلة التصنيف ، يمكننا استخدام الانحدار اللوجستي و kNN وشجرة القرار و SVM ونموذج Bayesian الساذج.



# get a list of base models
def get_models():
models = list()
models.append(('lr', LogisticRegression()))
models.append(('knn', KNeighborsClassifier()))
models.append(('cart', DecisionTreeClassifier()))
models.append(('svm', SVC(probability=True)))
models.append(('bayes', GaussianNB()))
return models
      
      





بعد ذلك ، نحتاج إلى تدريب نموذج الخلط. تذكر أن النماذج الأساسية يتم تدريبها على مجموعة بيانات التدريب. يتم تدريب النموذج الأساسي على التنبؤات التي قدمها كل نموذج أساسي على مجموعة بيانات مستقلة.



أولاً ، يمكننا إجراء حلقة عبر النماذج الموجودة في قائمة وتدريب كل منها بدوره على مجموعة بيانات التدريب. بالإضافة إلى ذلك ، في هذه الدورة ، يمكننا استخدام نموذج مدرب لعمل تنبؤ على مجموعة بيانات مستقلة (التحقق من الصحة) وتخزين التنبؤات للمستقبل.



...
# fit all models on the training set and predict on hold out set
meta_X = list()
for name, model in models:
# fit in training set
model.fit(X_train, y_train)
# predict on hold out set
yhat = model.predict(X_val)
# reshape predictions into a matrix with one column
yhat = yhat.reshape(len(yhat), 1)
# store predictions as input for blending
meta_X.append(yhat)
      
      





لدينا الآن "meta_X *" تمثل المدخلات التي يمكن استخدامها لتدريب النموذج الميتا. يمثل كل عمود أو كائن ناتج نموذج أساسي واحد. يمثل كل سطر عينة واحدة من مجموعة بيانات مستقلة. يمكننا استخدام الدالة hstack () للتأكد من أن مجموعة البيانات هذه عبارة عن مصفوفة متعددة الأبعاد ثنائية الأبعاد ، كما هو متوقع بواسطة نموذج التعلم الآلي.



...
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
      
      





يمكننا الآن تدريب نموذج التعريف الخاص بنا. يمكن أن يكون أي نموذج تعلم آلي نحبه ، مثل الانحدار اللوجستي لمشكلة التصنيف.



...
# define blending model
blender = LogisticRegression()
# fit on predictions from base models
blender.fit(meta_X, y_val)
      
      





يمكنك تجميعها معًا في وظيفة تسمى fit_ensemble () تدرب نموذج المزج باستخدام مجموعة بيانات تدريب وتحقق مستقل.



# fit the blending ensemble
def fit_ensemble(models, X_train, X_val, y_train, y_val):
# fit all models on the training set and predict on hold out set
meta_X = list()
for name, model in models:
# fit in training set
model.fit(X_train, y_train)
# predict on hold out set
yhat = model.predict(X_val)
# reshape predictions into a matrix with one column
yhat = yhat.reshape(len(yhat), 1)
# store predictions as input for blending
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# define blending model
blender = LogisticRegression()
# fit on predictions from base models
blender.fit(meta_X, y_val)
return blender
      
      





الخطوة التالية هي استخدام مجموعة خلط للتنبؤ بالبيانات الجديدة. هذه عملية من خطوتين. الخطوة الأولى هي استخدام كل نموذج أساسي للتنبؤ. يتم بعد ذلك تجميع التنبؤات واستخدامها كمدخلات في نموذج الخلط لعمل التنبؤ النهائي.



يمكننا استخدام نفس الدورة عند تدريب النموذج. أي جمع تنبؤات كل نموذج أساسي في مجموعة بيانات تدريب ، وإضافة التنبؤات معًا ، واستدعاء التنبؤ () على نموذج الخلط مع مجموعة البيانات ذات المستوى المعدني. وظيفة Predict_ensemble ()أدناه تنفذ هذه الإجراءات. نظرًا لتدريب قائمة من النماذج الأساسية ، وتدريب خلاط مجموعة ، ومجموعة بيانات (مثل مجموعة بيانات اختبار أو بيانات جديدة) ، لمجموعة البيانات ، فإنها ستعيد مجموعة من التنبؤات.



# make a prediction with the blending ensemble
def predict_ensemble(models, blender, X_test):
# make predictions with base models
meta_X = list()
for name, model in models:
# predict with base model
yhat = model.predict(X_test)
# reshape predictions into a matrix with one column
yhat = yhat.reshape(len(yhat), 1)
# store prediction
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# predict
return blender.predict(meta_X)
      
      





لدينا الآن جميع العناصر اللازمة لتنفيذ مجموعة مختلطة للتصنيف أو مشاكل نمذجة الانحدار التنبئي.



مجموعة مختلطة لمشكلة التصنيف



في هذا القسم ، سننظر في استخدام المزج لمهمة التصنيف. أولاً ، يمكننا استخدام الدالة make_classification () لإنشاء مشكلة تصنيف ثنائي تركيبي مع 10000 مثال و 20 ميزة إدخال. يتم عرض المثال بأكمله أدناه.



# test classification dataset
from sklearn.datasets import make_classification
# define dataset
X, y = make_classification(n_samples=10000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
# summarize the dataset
print(X.shape, y.shape)
      
      





يؤدي تشغيل المثال إلى إنشاء مجموعة بيانات وتلخيص المدخلات والمخرجات.



(10000, 20) (10000,)
      
      





بعد ذلك ، نحتاج إلى تقسيم مجموعة البيانات إلى مجموعات تدريب واختبار أولاً ، ثم مجموعة التدريب إلى مجموعة فرعية تستخدم لتدريب النماذج الأساسية ومجموعة فرعية مستخدمة لتدريب النموذج الأساسي. في هذه الحالة ، سنستخدم تقسيمًا بنسبة 50-50 لمجموعات التدريب والاختبار ، ثم تقسيم 67-33 لمجموعات التدريب والتحقق.



...
# split dataset into train and test sets
X_train_full, X_test, y_train_full, y_test = train_test_split(X, y, test_size=0.5, random_state=1)
# split training set into train and validation sets
X_train, X_val, y_train, y_val = train_test_split(X_train_full, y_train_full, test_size=0.33, random_state=1)
# summarize data split
print('Train: %s, Val: %s, Test: %s' % (X_train.shape, X_val.shape, X_test.shape))
      
      





يمكنك بعد ذلك استخدام وظيفة get_models () من القسم السابق لإنشاء نماذج التصنيف المستخدمة في المجموعة. يمكن بعد ذلك استدعاء الوظيفة fit_ensemble () لتدريب المجموعة المختلطة على مجموعات البيانات هذه ، ويمكن استخدام وظيفة التنبؤ () لعمل تنبؤات على مجموعة بيانات مستقلة.



...
# create the base models
models = get_models()
# train the blending ensemble
blender = fit_ensemble(models, X_train, X_val, y_train, y_val)
# make predictions on test set
yhat = predict_ensemble(models, blender, X_test)
      
      





أخيرًا ، يمكننا قياس أداء نموذج المزج من خلال الإبلاغ عن دقة التصنيف في مجموعة بيانات الاختبار.



...
# evaluate predictions
score = accuracy_score(y_test, yhat)
print('Blending Accuracy: %.3f' % score)
      
      





فيما يلي مثال كامل لتقدير مجموعة مختلطة في مشكلة تصنيف ثنائي تركيبي.



# blending ensemble for classification using hard voting
from numpy import hstack
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB

# get the dataset
def get_dataset():
X, y = make_classification(n_samples=10000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
return X, y

# get a list of base models
def get_models():
models = list()
models.append(('lr', LogisticRegression()))
models.append(('knn', KNeighborsClassifier()))
models.append(('cart', DecisionTreeClassifier()))
models.append(('svm', SVC()))
models.append(('bayes', GaussianNB()))
return models

# fit the blending ensemble
def fit_ensemble(models, X_train, X_val, y_train, y_val):
# fit all models on the training set and predict on hold out set
meta_X = list()
for name, model in models:
# fit in training set
model.fit(X_train, y_train)
# predict on hold out set
yhat = model.predict(X_val)
# reshape predictions into a matrix with one column
yhat = yhat.reshape(len(yhat), 1)
# store predictions as input for blending
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# define blending model
blender = LogisticRegression()
# fit on predictions from base models
blender.fit(meta_X, y_val)
return blender

# make a prediction with the blending ensemble
def predict_ensemble(models, blender, X_test):
# make predictions with base models
meta_X = list()
for name, model in models:
# predict with base model
yhat = model.predict(X_test)
# reshape predictions into a matrix with one column
yhat = yhat.reshape(len(yhat), 1)
# store prediction
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# predict
return blender.predict(meta_X)

# define dataset
X, y = get_dataset()
# split dataset into train and test sets
X_train_full, X_test, y_train_full, y_test = train_test_split(X, y, test_size=0.5, random_state=1)
# split training set into train and validation sets
X_train, X_val, y_train, y_val = train_test_split(X_train_full, y_train_full, test_size=0.33, random_state=1)
# summarize data split
print('Train: %s, Val: %s, Test: %s' % (X_train.shape, X_val.shape, X_test.shape))
# create the base models
models = get_models()
# train the blending ensemble
blender = fit_ensemble(models, X_train, X_val, y_train, y_val)
# make predictions on test set
yhat = predict_ensemble(models, blender, X_test)
# evaluate predictions
score = accuracy_score(y_test, yhat)
print('Blending Accuracy: %.3f' % (score*100))
      
      





تشغيل المثال يعرض أولاً ملخصًا لجميع مجموعات البيانات ثم دقة المجموعة في مجموعة بيانات الاختبار.



ملاحظة: قد تختلف نتائجك بسبب الطبيعة العشوائية للخوارزمية أو إجراء التقدير ، أو الاختلافات في الدقة العددية. ضع في اعتبارك تشغيل المثال عدة مرات ومقارنة متوسط ​​النتيجة.



هنا نرى أن المجموعة المختلطة حققت دقة تصنيف تبلغ حوالي 97.900٪.



Train: (3350, 20), Val: (1650, 20), Test: (5000, 20)
Blending Accuracy: 97.900
      
      





في المثال السابق ، تم دمج توقع تسميات الفئة الواضحة باستخدام نموذج مزج. هذا نوع من التصويت الصعب . البديل هو طريقة حيث يتنبأ كل نموذج باحتمالات الفئة ويستخدم metamodel لخلط الاحتمالات. هذا نوع من التصويت الناعم يمكن أن يؤدي أحيانًا إلى أداء أفضل. أولاً ، يتعين علينا تكوين النماذج التي تُرجع الاحتمالات ، مثل نموذج SVM.



# get a list of base models
def get_models():
models = list()
models.append(('lr', LogisticRegression()))
models.append(('knn', KNeighborsClassifier()))
models.append(('cart', DecisionTreeClassifier()))
models.append(('svm', SVC(probability=True)))
models.append(('bayes', GaussianNB()))
return models
      
      





ثم تحتاج النماذج الأساسية إلى تعديل للتنبؤ بالاحتمالات بدلاً من تسميات الفصل الواضحة. يمكن تحقيق ذلك عن طريق استدعاء التنبؤ () داخل fit_ensemble () أثناء تدريب النماذج الأساسية.



...
# fit all models on the training set and predict on hold out set
meta_X = list()
for name, model in models:
# fit in training set
model.fit(X_train, y_train)
# predict on hold out set
yhat = model.predict_proba(X_val)
# store predictions as input for blending
meta_X.append(yhat)
      
      





هذا يعني أن مجموعة البيانات الوصفية المستخدمة لتدريب النموذج الفوقي ستحتوي على n من الأعمدة لكل مصنف ، حيث يمثل n عدد الفئات في مشكلة التنبؤ ، وفي حالتنا هناك فئتان. نحتاج أيضًا إلى تغيير التنبؤات التي قدمتها النماذج الأساسية عند استخدام نموذج الخلط للتنبؤ بالبيانات الجديدة.



...
# make predictions with base models
meta_X = list()
for name, model in models:
# predict with base model
yhat = model.predict_proba(X_test)
# store prediction
meta_X.append(yhat)
      
      





فيما يلي المثال الكامل لاستخدام المزج على احتمالات الفئة المتوقعة لمشكلة تصنيف ثنائي تركيبي.




# blending ensemble for classification using soft voting
from numpy import hstack
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB

# get the dataset
def get_dataset():
X, y = make_classification(n_samples=10000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
return X, y

# get a list of base models
def get_models():
models = list()
models.append(('lr', LogisticRegression()))
models.append(('knn', KNeighborsClassifier()))
models.append(('cart', DecisionTreeClassifier()))
models.append(('svm', SVC(probability=True)))
models.append(('bayes', GaussianNB()))
return models

# fit the blending ensemble
def fit_ensemble(models, X_train, X_val, y_train, y_val):
# fit all models on the training set and predict on hold out set
meta_X = list()
for name, model in models:
# fit in training set
model.fit(X_train, y_train)
# predict on hold out set
yhat = model.predict_proba(X_val)
# store predictions as input for blending
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# define blending model
blender = LogisticRegression()
# fit on predictions from base models
blender.fit(meta_X, y_val)
return blender

# make a prediction with the blending ensemble
def predict_ensemble(models, blender, X_test):
# make predictions with base models
meta_X = list()
for name, model in models:
# predict with base model
yhat = model.predict_proba(X_test)
# store prediction
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# predict
return blender.predict(meta_X)

# define dataset
X, y = get_dataset()
# split dataset into train and test sets
X_train_full, X_test, y_train_full, y_test = train_test_split(X, y, test_size=0.5, random_state=1)
# split training set into train and validation sets
X_train, X_val, y_train, y_val = train_test_split(X_train_full, y_train_full, test_size=0.33, random_state=1)
# summarize data split
print('Train: %s, Val: %s, Test: %s' % (X_train.shape, X_val.shape, X_test.shape))
# create the base models
models = get_models()
# train the blending ensemble
blender = fit_ensemble(models, X_train, X_val, y_train, y_val)
# make predictions on test set
yhat = predict_ensemble(models, blender, X_test)
# evaluate predictions
score = accuracy_score(y_test, yhat)
print('Blending Accuracy: %.3f' % (score*100))
      
      





تشغيل المثال يعرض أولاً ملخصًا لجميع مجموعات البيانات ثم دقة المجموعة في مجموعة الاختبار.



ملاحظة: قد تختلف نتائجك بسبب الطبيعة العشوائية للخوارزمية أو إجراء التقدير ، أو الاختلافات في الدقة العددية. جرب المثال عدة مرات وقارن النتيجة المتوسطة.



وهنا نرى أن خلط احتمالات الفئة أدى إلى زيادة دقة التصنيف حتى حوالي 98.240٪.



Train: (3350, 20), Val: (1650, 20), Test: (5000, 20)
Blending Accuracy: 98.240
      
      





تكون المجموعة المختلطة فعالة فقط إذا تمكنت من التفوق على أي من النماذج الفردية فيها. يمكننا تأكيد ذلك من خلال تقييم كل من النماذج الأساسية على حدة. يمكن تدريب كل نموذج أساسي على مجموعة بيانات التدريب بالكامل (على عكس مجموعة الاختلاط) وتقييمه في مجموعة بيانات الاختبار (تمامًا كما هو الحال في مجموعة الخلط). يوضح المثال أدناه ذلك من خلال تقييم كل نموذج أساسي على حدة.



# evaluate base models on the entire training dataset
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB

# get the dataset
def get_dataset():
X, y = make_classification(n_samples=10000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
return X, y

# get a list of base models
def get_models():
models = list()
models.append(('lr', LogisticRegression()))
models.append(('knn', KNeighborsClassifier()))
models.append(('cart', DecisionTreeClassifier()))
models.append(('svm', SVC(probability=True)))
models.append(('bayes', GaussianNB()))
return models

# define dataset
X, y = get_dataset()
# split dataset into train and test sets
X_train_full, X_test, y_train_full, y_test = train_test_split(X, y, test_size=0.5, random_state=1)
# summarize data split
print('Train: %s, Test: %s' % (X_train_full.shape, X_test.shape))
# create the base models
models = get_models()
# evaluate standalone model
for name, model in models:
# fit the model on the training dataset
model.fit(X_train_full, y_train_full)
# make a prediction on the test dataset
yhat = model.predict(X_test)
# evaluate the predictions
score = accuracy_score(y_test, yhat)
# report the score
print('>%s Accuracy: %.3f' % (name, score*100))
      
      







تشغيل المثال أولاً يعرض ملخصًا لجميع مجموعات البيانات الثلاثة ، ثم دقة كل نموذج أساسي في مجموعة الاختبار.



ملاحظة: قد تختلف نتائجك بسبب الطبيعة العشوائية للخوارزمية ، أو إجراء التقدير ، أو الاختلافات في الدقة العددية. جرب المثال عدة مرات وقارن النتيجة المتوسطة.



في هذه الحالة ، نرى أن أداء جميع الطرز أسوأ من المجموعة المختلطة. الشيء المثير للاهتمام هو أنه يمكننا أن نرى أن SVM قريب جدًا من تحقيق دقة 98،200٪ ، مقارنة بدقة 98،240٪ تم تحقيقها مع المجموعة المختلطة.



Train: (5000, 20), Test: (5000, 20)
>lr Accuracy: 87.800
>knn Accuracy: 97.380
>cart Accuracy: 88.200
>svm Accuracy: 98.200
>bayes Accuracy: 87.300
      
      





يمكننا اختيار مجموعة مختلطة كنموذج نهائي لدينا. يتضمن ذلك تدريب المجموعة على مجموعة بيانات التدريب بأكملها وعمل تنبؤات باستخدام أمثلة جديدة. على وجه الخصوص ، يتم تقسيم مجموعة التدريب بأكملها إلى مجموعات التدريب والتحقق من الصحة لتدريب القاعدة والنماذج المعدنية ، على التوالي ، ومن ثم يمكن استخدام المجموعة في التنبؤ. مثال كامل للتنبؤ ببيانات جديدة باستخدام مجموعة مختلطة للتصنيف يبدو كما يلي:



# example of making a prediction with a blending ensemble for classification
from numpy import hstack
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB

# get the dataset
def get_dataset():
X, y = make_classification(n_samples=10000, n_features=20, n_informative=15, n_redundant=5, random_state=7)
return X, y

# get a list of base models
def get_models():
models = list()
models.append(('lr', LogisticRegression()))
models.append(('knn', KNeighborsClassifier()))
models.append(('cart', DecisionTreeClassifier()))
models.append(('svm', SVC(probability=True)))
models.append(('bayes', GaussianNB()))
return models

# fit the blending ensemble
def fit_ensemble(models, X_train, X_val, y_train, y_val):
# fit all models on the training set and predict on hold out set
meta_X = list()
for _, model in models:
# fit in training set
model.fit(X_train, y_train)
# predict on hold out set
yhat = model.predict_proba(X_val)
# store predictions as input for blending
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# define blending model
blender = LogisticRegression()
# fit on predictions from base models
blender.fit(meta_X, y_val)
return blender

# make a prediction with the blending ensemble
def predict_ensemble(models, blender, X_test):
# make predictions with base models
meta_X = list()
for _, model in models:
# predict with base model
yhat = model.predict_proba(X_test)
# store prediction
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# predict
return blender.predict(meta_X)

# define dataset
X, y = get_dataset()
# split dataset set into train and validation sets
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.33, random_state=1)
# summarize data split
print('Train: %s, Val: %s' % (X_train.shape, X_val.shape))
# create the base models
models = get_models()
# train the blending ensemble
blender = fit_ensemble(models, X_train, X_val, y_train, y_val)
# make a prediction on a new row of data
row = [-0.30335011, 2.68066314, 2.07794281, 1.15253537, -2.0583897, -2.51936601, 0.67513028, -3.20651939, -1.60345385, 3.68820714, 0.05370913, 1.35804433, 0.42011397, 1.4732839, 2.89997622, 1.61119399, 7.72630965, -2.84089477, -1.83977415, 1.34381989]
yhat = predict_ensemble(models, blender, [row])
# summarize prediction
print('Predicted Class: %d' % (yhat))
      
      





يؤدي تشغيل المثال إلى تدريب نموذج مجموعة مختلط على مجموعة بيانات ثم استخدامه للتنبؤ بصف جديد من البيانات ، كما هو الحال في حالة استخدام النموذج في تطبيق ما.



Train: (6700, 20), Val: (3300, 20)
Predicted Class: 1
      
      





لنلق نظرة على كيفية تقييم مجموعة الانحدار المختلطة.



المجموعة المختلطة لمشكلة الانحدار



في هذا القسم ، سننظر في استخدام التجميع لمشكلة الانحدار. أولاً ، يمكننا استخدام الدالة make_regression () لإنشاء مشكلة انحدار تركيبي مع 10000 عينة و 20 ميزة إدخال. يتم عرض المثال بأكمله أدناه.



# test regression dataset
from sklearn.datasets import make_regression
# define dataset
X, y = make_regression(n_samples=10000, n_features=20, n_informative=10, noise=0.3, random_state=7)
# summarize the dataset
print(X.shape, y.shape)
      
      





يؤدي تشغيل المثال إلى إنشاء مجموعة بيانات ويلخص مكونات الإدخال والإخراج.



(10000, 20) (10000,)
      
      





بعد ذلك ، يمكنك تحديد قائمة بنماذج الانحدار لاستخدامها كخط أساس. في هذه الحالة ، نستخدم نماذج الانحدار الخطي و kNN وشجرة القرار ونماذج SVM.



# get a list of base models
def get_models():
models = list()
models.append(('lr', LinearRegression()))
models.append(('knn', KNeighborsRegressor()))
models.append(('cart', DecisionTreeRegressor()))
models.append(('svm', SVR()))
return models
      
      





لا تتغير وظيفة fit_ensemble () المستخدمة لتدريب المجموعة ، باستثناء أنه يجب تغيير النموذج المستخدم للخلط إلى الانحدار. هنا نستخدم نموذج الانحدار الخطي.



...
# define blending model
blender = LinearRegression()
      
      





بالنظر إلى أن هذه مشكلة انحدار ، سنقوم بتقييم أداء النموذج باستخدام مقياس الخطأ ، في هذه الحالة متوسط ​​الخطأ المطلق ، أو (مختصر) MAE.



...
# evaluate predictions
score = mean_absolute_error(y_test, yhat)
print('Blending MAE: %.3f' % score)
      
      





يظهر أدناه المثال الكامل للمجموعة المختلطة لمشكلة النمذجة التنبؤية للانحدار الاصطناعي:



# evaluate blending ensemble for regression
from numpy import hstack
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR

# get the dataset
def get_dataset():
X, y = make_regression(n_samples=10000, n_features=20, n_informative=10, noise=0.3, random_state=7)
return X, y

# get a list of base models
def get_models():
models = list()
models.append(('lr', LinearRegression()))
models.append(('knn', KNeighborsRegressor()))
models.append(('cart', DecisionTreeRegressor()))
models.append(('svm', SVR()))
return models

# fit the blending ensemble
def fit_ensemble(models, X_train, X_val, y_train, y_val):
# fit all models on the training set and predict on hold out set
meta_X = list()
for name, model in models:
# fit in training set
model.fit(X_train, y_train)
# predict on hold out set
yhat = model.predict(X_val)
# reshape predictions into a matrix with one column
yhat = yhat.reshape(len(yhat), 1)
# store predictions as input for blending
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# define blending model
blender = LinearRegression()
# fit on predictions from base models
blender.fit(meta_X, y_val)
return blender

# make a prediction with the blending ensemble
def predict_ensemble(models, blender, X_test):
# make predictions with base models
meta_X = list()
for name, model in models:
# predict with base model
yhat = model.predict(X_test)
# reshape predictions into a matrix with one column
yhat = yhat.reshape(len(yhat), 1)
# store prediction
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# predict
return blender.predict(meta_X)

# define dataset
X, y = get_dataset()
# split dataset into train and test sets
X_train_full, X_test, y_train_full, y_test = train_test_split(X, y, test_size=0.5, random_state=1)
# split training set into train and validation sets
X_train, X_val, y_train, y_val = train_test_split(X_train_full, y_train_full, test_size=0.33, random_state=1)
# summarize data split
print('Train: %s, Val: %s, Test: %s' % (X_train.shape, X_val.shape, X_test.shape))
# create the base models
models = get_models()
# train the blending ensemble
blender = fit_ensemble(models, X_train, X_val, y_train, y_val)
# make predictions on test set
yhat = predict_ensemble(models, blender, X_test)
# evaluate predictions
score = mean_absolute_error(y_test, yhat)
print('Blending MAE: %.3f' % score)
      
      





يطبع المثال أولاً ملخصًا لمجموعات البيانات الثلاث ثم MAE في مجموعة الاختبار.



ملاحظة: قد تختلف نتائجك بسبب الطبيعة العشوائية للخوارزمية أو إجراء التقدير ، أو الاختلافات في الدقة العددية. جرب المثال عدة مرات وقارن النتيجة المتوسطة.



هنا نرى أن المجموعة وصلت إلى MAE بحوالي 0.237 في مجموعة بيانات الاختبار.



Train: (3350, 20), Val: (1650, 20), Test: (5000, 20)
Blending MAE: 0.237
      
      





كما هو الحال مع التصنيف ، تكون المجموعة المختلطة مفيدة فقط إذا كانت تؤدي أداءً أفضل من أي من نماذج المجموعات الأساسية.



يمكننا اختبار ذلك من خلال تقييم كل نموذج أساسي على حدة ، وتدريبه أولاً على مجموعة التدريب بأكملها (بدلاً من المجموعة) ، وعمل تنبؤات على مجموعة بيانات الاختبار (كما في المجموعة). في المثال أدناه ، تم تقدير كل نموذج من النماذج الأساسية بمعزل عن مجموعة بيانات نمذجة الانحدار التنبئي التركيبية.



# evaluate base models in isolation on the regression dataset
from numpy import hstack
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR

# get the dataset
def get_dataset():
X, y = make_regression(n_samples=10000, n_features=20, n_informative=10, noise=0.3, random_state=7)
return X, y

# get a list of base models
def get_models():
models = list()
models.append(('lr', LinearRegression()))
models.append(('knn', KNeighborsRegressor()))
models.append(('cart', DecisionTreeRegressor()))
models.append(('svm', SVR()))
return models

# define dataset
X, y = get_dataset()
# split dataset into train and test sets
X_train_full, X_test, y_train_full, y_test = train_test_split(X, y, test_size=0.5, random_state=1)
# summarize data split
print('Train: %s, Test: %s' % (X_train_full.shape, X_test.shape))
# create the base models
models = get_models()
# evaluate standalone model
for name, model in models:
# fit the model on the training dataset
model.fit(X_train_full, y_train_full)
# make a prediction on the test dataset
yhat = model.predict(X_test)
# evaluate the predictions
score = mean_absolute_error(y_test, yhat)
# report the score
print('>%s MAE: %.3f' % (name, score))
      
      





يؤدي تشغيل المثال أولاً إلى تلخيص مجموعات التدريب والاختبار ثم MAE لكل نموذج أساسي في مجموعة بيانات الاختبار.



ملاحظة: قد تختلف نتائجك بسبب الطبيعة العشوائية للخوارزمية أو إجراء التقدير ، أو الاختلافات في الدقة العددية. جرب المثال عدة مرات وقارن النتيجة المتوسطة.



هنا يمكنك أن ترى أنه في الواقع كان أداء نموذج الانحدار الخطي أفضل قليلاً من المجموعة المختلطة ، حيث وصل إلى MAE 0.236 مقابل 0.237. قد يكون لهذا علاقة بكيفية بناء مجموعة البيانات الاصطناعية.



ومع ذلك ، في هذه الحالة ، نفضل استخدام نموذج الانحدار الخطي لهذه المهمة بالضبط. يؤكد هذا الموقف على أهمية التحقق من صحة أداء النماذج المساهمة قبل قبول نموذج المجموعة كنموذج نهائي.



Train: (5000, 20), Test: (5000, 20)
>lr MAE: 0.236
>knn MAE: 100.169
>cart MAE: 133.744
>svm MAE: 138.195
      
      





مرة أخرى ، يمكنك تطبيق المجموعة المختلطة كنموذج الانحدار النهائي. يتضمن النهج تقسيم مجموعة البيانات بأكملها إلى مجموعات تدريب واختبار من أجل تدريب خط الأساس والنماذج الوصفية عليها ، على التوالي ، ثم يمكن استخدام المجموعة للتنبؤ بصف بيانات جديد. فيما يلي مثال كامل للتنبؤ بالبيانات الجديدة باستخدام مجموعة مختلطة لمشكلة الانحدار.



# example of making a prediction with a blending ensemble for regression
from numpy import hstack
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.svm import SVR

# get the dataset
def get_dataset():
X, y = make_regression(n_samples=10000, n_features=20, n_informative=10, noise=0.3, random_state=7)
return X, y

# get a list of base models
def get_models():
models = list()
models.append(('lr', LinearRegression()))
models.append(('knn', KNeighborsRegressor()))
models.append(('cart', DecisionTreeRegressor()))
models.append(('svm', SVR()))
return models

# fit the blending ensemble
def fit_ensemble(models, X_train, X_val, y_train, y_val):
# fit all models on the training set and predict on hold out set
meta_X = list()
for _, model in models:
# fit in training set
model.fit(X_train, y_train)
# predict on hold out set
yhat = model.predict(X_val)
# reshape predictions into a matrix with one column
yhat = yhat.reshape(len(yhat), 1)
# store predictions as input for blending
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# define blending model
blender = LinearRegression()
# fit on predictions from base models
blender.fit(meta_X, y_val)
return blender

# make a prediction with the blending ensemble
def predict_ensemble(models, blender, X_test):
# make predictions with base models
meta_X = list()
for _, model in models:
# predict with base model
yhat = model.predict(X_test)
# reshape predictions into a matrix with one column
yhat = yhat.reshape(len(yhat), 1)
# store prediction
meta_X.append(yhat)
# create 2d array from predictions, each set is an input feature
meta_X = hstack(meta_X)
# predict
return blender.predict(meta_X)

# define dataset
X, y = get_dataset()
# split dataset set into train and validation sets
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.33, random_state=1)
# summarize data split
print('Train: %s, Val: %s' % (X_train.shape, X_val.shape))
# create the base models
models = get_models()
# train the blending ensemble
blender = fit_ensemble(models, X_train, X_val, y_train, y_val)
# make a prediction on a new row of data
row = [-0.24038754, 0.55423865, -0.48979221, 1.56074459, -1.16007611, 1.10049103, 1.18385406, -1.57344162, 0.97862519, -0.03166643, 1.77099821, 1.98645499, 0.86780193, 2.01534177, 2.51509494, -1.04609004, -0.19428148, -0.05967386, -2.67168985, 1.07182911]
yhat = predict_ensemble(models, blender, [row])
# summarize prediction
print('Predicted: %.3f' % (yhat[0]))
      
      





يؤدي تشغيل المثال إلى تدريب نموذج مجموعة على مجموعة بيانات ثم استخدامه للتنبؤ بصف جديد من البيانات ، كما هو الحال في حالة استخدام النموذج في أحد التطبيقات.



Train: (6700, 20), Val: (3300, 20)
Predicted: 359.986
      
      





يحتوي هذا القسم على موارد حول هذا الموضوع إذا كنت تريد التعمق فيه.














ولا تنسى الرمز الترويجي HABR الذي يضيف 10٪ للخصم على البانر.



صورة








المزيد من الدورات


مقالات مقترحة






All Articles