.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/ensemble/plot_stack_predictors.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. or to run this example in your browser via JupyterLite or Binder .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_ensemble_plot_stack_predictors.py: ================================= دمج المتنبئات باستخدام التكديس ================================= .. currentmodule:: sklearn يشير التكديس إلى طريقة لمزج المقدرات. في هذه الاستراتيجية، يتم ملاءمة بعض المقدرات بشكل فردي على بعض بيانات التدريب بينما يتم تدريب مقدر نهائي باستخدام التنبؤات المكدسة لهذه المقدرات الأساسية. في هذا المثال، نوضح حالة الاستخدام التي يتم فيها تكديس مُنحدرات مختلفة معًا ويتم استخدام مُنحدِر خطي مُعاقَب نهائي لإخراج التنبؤ. نقارن أداء كل مُنحدِر فردي مع استراتيجية التكديس. يحسن التكديس الأداء العام بشكل طفيف. .. GENERATED FROM PYTHON SOURCE LINES 18-22 .. code-block:: Python # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause .. GENERATED FROM PYTHON SOURCE LINES 23-39 تنزيل مجموعة البيانات #################### سنستخدم مجموعة بيانات `Ames Housing`_ التي تم تجميعها لأول مرة بواسطة Dean De Cock وأصبحت أكثر شهرة بعد استخدامها في تحدي Kaggle. إنها مجموعة من 1460 منزلًا سكنيًا في Ames، Iowa، كل منها موصوف بـ 80 ميزة. سنستخدمها للتنبؤ بالسعر اللوغاريتمي النهائي للمنازل. في هذا المثال، سنستخدم 20 ميزة فقط من أكثر الميزات إثارة للاهتمام تم اختيارها باستخدام GradientBoostingRegressor () ونحد من عدد الإدخالات (لن نتطرق هنا إلى التفاصيل حول كيفية تحديد الميزات الأكثر إثارة للاهتمام). لا يتم شحن مجموعة بيانات Ames Housing مع scikit-learn، وبالتالي سنقوم بجلبها من `OpenML`_. .. _`Ames Housing`: http://jse.amstat.org/v19n3/decock.pdf .. _`OpenML`: https://www.openml.org/d/42165 .. GENERATED FROM PYTHON SOURCE LINES 39-84 .. code-block:: Python import numpy as np from sklearn.datasets import fetch_openml from sklearn.utils import shuffle def load_ames_housing(): df = fetch_openml(name="house_prices", as_frame=True) X = df.data y = df.target features = [ "YrSold", "HeatingQC", "Street", "YearRemodAdd", "Heating", "MasVnrType", "BsmtUnfSF", "Foundation", "MasVnrArea", "MSSubClass", "ExterQual", "Condition2", "GarageCars", "GarageType", "OverallQual", "TotalBsmtSF", "BsmtFinSF1", "HouseStyle", "MiscFeature", "MoSold", ] X = X.loc[:, features] X, y = shuffle(X, y, random_state=0) X = X.iloc[:600] y = y.iloc[:600] return X, np.log(y) X, y = load_ames_housing() .. GENERATED FROM PYTHON SOURCE LINES 85-91 إنشاء خط أنابيب لمعالجة البيانات مسبقًا #################################### قبل أن نتمكن من استخدام مجموعة بيانات Ames، ما زلنا بحاجة إلى إجراء بعض المعالجة المسبقة. أولاً، سنحدد الأعمدة الفئوية والرقمية لمجموعة البيانات لإنشاء الخطوة الأولى من خط الأنابيب. .. GENERATED FROM PYTHON SOURCE LINES 91-98 .. code-block:: Python from sklearn.compose import make_column_selector cat_selector = make_column_selector(dtype_include=object) num_selector = make_column_selector(dtype_include=np.number) cat_selector(X) .. rst-class:: sphx-glr-script-out .. code-block:: none ['HeatingQC', 'Street', 'Heating', 'MasVnrType', 'Foundation', 'ExterQual', 'Condition2', 'GarageType', 'HouseStyle', 'MiscFeature'] .. GENERATED FROM PYTHON SOURCE LINES 99-101 .. code-block:: Python num_selector(X) .. rst-class:: sphx-glr-script-out .. code-block:: none ['YrSold', 'YearRemodAdd', 'BsmtUnfSF', 'MasVnrArea', 'MSSubClass', 'GarageCars', 'OverallQual', 'TotalBsmtSF', 'BsmtFinSF1', 'MoSold'] .. GENERATED FROM PYTHON SOURCE LINES 102-111 بعد ذلك، سنحتاج إلى تصميم خطوط أنابيب المعالجة المسبقة التي تعتمد على المُنحدِر النهائي. إذا كان المُنحدِر النهائي نموذجًا خطيًا، فيجب على المرء ترميز الفئات بترميز واحد ساخن. إذا كان المُنحدِر النهائي نموذجًا قائمًا على الشجرة، فسيكون المُرمز الترتيبي كافيًا. إلى جانب ذلك، يجب توحيد القيم الرقمية للنموذج الخطي بينما يمكن معالجة البيانات الرقمية الأولية كما هي بواسطة نموذج قائم على الشجرة. ومع ذلك، يحتاج كلا النموذجين إلى أداة إكمال للتعامل مع القيم المفقودة. سنقوم أولاً بتصميم خط الأنابيب المطلوب للنماذج القائمة على الشجرة. .. GENERATED FROM PYTHON SOURCE LINES 111-130 .. code-block:: Python from sklearn.compose import make_column_transformer from sklearn.impute import SimpleImputer from sklearn.pipeline import make_pipeline from sklearn.preprocessing import OrdinalEncoder cat_tree_processor = OrdinalEncoder( handle_unknown="use_encoded_value", unknown_value=-1, encoded_missing_value=-2, ) num_tree_processor = SimpleImputer(strategy="mean", add_indicator=True) tree_preprocessor = make_column_transformer( (num_tree_processor, num_selector), (cat_tree_processor, cat_selector) ) tree_preprocessor .. raw:: html
ColumnTransformer(transformers=[('simpleimputer',
                                     SimpleImputer(add_indicator=True),
                                     <sklearn.compose._column_transformer.make_column_selector object at 0x7f22787a7850>),
                                    ('ordinalencoder',
                                     OrdinalEncoder(encoded_missing_value=-2,
                                                    handle_unknown='use_encoded_value',
                                                    unknown_value=-1),
                                     <sklearn.compose._column_transformer.make_column_selector object at 0x7f22787a7790>)])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.


.. GENERATED FROM PYTHON SOURCE LINES 131-133 بعد ذلك، سنحدد الآن المعالج المسبق المستخدم عندما يكون المُنحدِر النهائي نموذجًا خطيًا. .. GENERATED FROM PYTHON SOURCE LINES 133-146 .. code-block:: Python from sklearn.preprocessing import OneHotEncoder, StandardScaler cat_linear_processor = OneHotEncoder(handle_unknown="ignore") num_linear_processor = make_pipeline( StandardScaler(), SimpleImputer(strategy="mean", add_indicator=True) ) linear_preprocessor = make_column_transformer( (num_linear_processor, num_selector), (cat_linear_processor, cat_selector) ) linear_preprocessor .. raw:: html
ColumnTransformer(transformers=[('pipeline',
                                     Pipeline(steps=[('standardscaler',
                                                      StandardScaler()),
                                                     ('simpleimputer',
                                                      SimpleImputer(add_indicator=True))]),
                                     <sklearn.compose._column_transformer.make_column_selector object at 0x7f22787a7850>),
                                    ('onehotencoder',
                                     OneHotEncoder(handle_unknown='ignore'),
                                     <sklearn.compose._column_transformer.make_column_selector object at 0x7f22787a7790>)])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.


.. GENERATED FROM PYTHON SOURCE LINES 147-165 مكدس المتنبئات على مجموعة بيانات واحدة ######################################## يكون من الممل في بعض الأحيان العثور على النموذج الذي سيكون أفضل أداءً على مجموعة بيانات معينة. يوفر التكديس بديلاً عن طريق دمج مخرجات العديد من المتعلمين، دون الحاجة إلى اختيار نموذج محدد. عادة ما يكون أداء التكديس قريبًا من أفضل نموذج، وأحيانًا يمكن أن يتفوق على أداء التنبؤ لكل نموذج فردي. هنا، نقوم بدمج 3 متعلمين (خطي وغير خطي) ونستخدم مُنحدِر ريدج لدمج مخرجاتهم معًا. .. note:: على الرغم من أننا سننشئ خطوط أنابيب جديدة مع المعالجات التي كتبناها في القسم السابق للمتعلمين الثلاثة، فإن المقدر النهائي :class:`~sklearn.linear_model.RidgeCV()` لا يحتاج إلى معالجة مسبقة للبيانات لأنه سيتم تغذيته بالمخرجات المعالجة مسبقًا من المتعلمين الثلاثة. .. GENERATED FROM PYTHON SOURCE LINES 165-173 .. code-block:: Python from sklearn.linear_model import LassoCV lasso_pipeline = make_pipeline(linear_preprocessor, LassoCV()) lasso_pipeline .. raw:: html
Pipeline(steps=[('columntransformer',
                     ColumnTransformer(transformers=[('pipeline',
                                                      Pipeline(steps=[('standardscaler',
                                                                       StandardScaler()),
                                                                      ('simpleimputer',
                                                                       SimpleImputer(add_indicator=True))]),
                                                      <sklearn.compose._column_transformer.make_column_selector object at 0x7f22787a7850>),
                                                     ('onehotencoder',
                                                      OneHotEncoder(handle_unknown='ignore'),
                                                      <sklearn.compose._column_transformer.make_column_selector object at 0x7f22787a7790>)])),
                    ('lassocv', LassoCV())])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.


.. GENERATED FROM PYTHON SOURCE LINES 174-179 .. code-block:: Python from sklearn.ensemble import RandomForestRegressor rf_pipeline = make_pipeline(tree_preprocessor, RandomForestRegressor(random_state=42)) rf_pipeline .. raw:: html
Pipeline(steps=[('columntransformer',
                     ColumnTransformer(transformers=[('simpleimputer',
                                                      SimpleImputer(add_indicator=True),
                                                      <sklearn.compose._column_transformer.make_column_selector object at 0x7f22787a7850>),
                                                     ('ordinalencoder',
                                                      OrdinalEncoder(encoded_missing_value=-2,
                                                                     handle_unknown='use_encoded_value',
                                                                     unknown_value=-1),
                                                      <sklearn.compose._column_transformer.make_column_selector object at 0x7f22787a7790>)])),
                    ('randomforestregressor',
                     RandomForestRegressor(random_state=42))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.


.. GENERATED FROM PYTHON SOURCE LINES 180-187 .. code-block:: Python from sklearn.ensemble import HistGradientBoostingRegressor gbdt_pipeline = make_pipeline( tree_preprocessor, HistGradientBoostingRegressor(random_state=0) ) gbdt_pipeline .. raw:: html
Pipeline(steps=[('columntransformer',
                     ColumnTransformer(transformers=[('simpleimputer',
                                                      SimpleImputer(add_indicator=True),
                                                      <sklearn.compose._column_transformer.make_column_selector object at 0x7f22787a7850>),
                                                     ('ordinalencoder',
                                                      OrdinalEncoder(encoded_missing_value=-2,
                                                                     handle_unknown='use_encoded_value',
                                                                     unknown_value=-1),
                                                      <sklearn.compose._column_transformer.make_column_selector object at 0x7f22787a7790>)])),
                    ('histgradientboostingregressor',
                     HistGradientBoostingRegressor(random_state=0))])
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.


.. GENERATED FROM PYTHON SOURCE LINES 188-200 .. code-block:: Python from sklearn.ensemble import StackingRegressor from sklearn.linear_model import RidgeCV estimators = [ ("الغابة العشوائية", rf_pipeline), ("Lasso", lasso_pipeline), ("التعزيز المتدرج", gbdt_pipeline), ] stacking_regressor = StackingRegressor(estimators=estimators, final_estimator=RidgeCV()) stacking_regressor .. raw:: html
StackingRegressor(estimators=[('الغابة العشوائية',
                                   Pipeline(steps=[('columntransformer',
                                                    ColumnTransformer(transformers=[('simpleimputer',
                                                                                     SimpleImputer(add_indicator=True),
                                                                                     <sklearn.compose._column_transformer.make_column_selector object at 0x7f22787a7850>),
                                                                                    ('ordinalencoder',
                                                                                     OrdinalEncoder(encoded_missing_value=-2,
                                                                                                    handle_unknown='use_encoded_value',
                                                                                                    unknow...
                                                                                     <sklearn.compose._column_transformer.make_column_selector object at 0x7f22787a7850>),
                                                                                    ('ordinalencoder',
                                                                                     OrdinalEncoder(encoded_missing_value=-2,
                                                                                                    handle_unknown='use_encoded_value',
                                                                                                    unknown_value=-1),
                                                                                     <sklearn.compose._column_transformer.make_column_selector object at 0x7f22787a7790>)])),
                                                   ('histgradientboostingregressor',
                                                    HistGradientBoostingRegressor(random_state=0))]))],
                      final_estimator=RidgeCV())
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.


.. GENERATED FROM PYTHON SOURCE LINES 201-207 قياس ورسم النتائج ############################ الآن يمكننا استخدام مجموعة بيانات Ames Housing لإجراء التنبؤات. نتحقق من أداء كل متنبئ فردي بالإضافة إلى مكدس المُنحدرات. .. GENERATED FROM PYTHON SOURCE LINES 207-261 .. code-block:: Python import time import matplotlib.pyplot as plt from sklearn.metrics import PredictionErrorDisplay from sklearn.model_selection import cross_val_predict, cross_validate fig, axs = plt.subplots(2, 2, figsize=(9, 7)) axs = np.ravel(axs) for ax, (name, est) in zip( axs, estimators + [("مُنحدِر التكديس", stacking_regressor)] ): scorers = {"R2": "r2", "MAE": "neg_mean_absolute_error"} start_time = time.time() scores = cross_validate( est, X, y, scoring=list(scorers.values()), n_jobs=-1, verbose=0 ) elapsed_time = time.time() - start_time y_pred = cross_val_predict(est, X, y, n_jobs=-1, verbose=0) scores = { key: ( f"{np.abs(np.mean(scores[f'test_{value}'])):.2f} +- " f"{np.std(scores[f'test_{value}']):.2f}" ) for key, value in scorers.items() } display = PredictionErrorDisplay.from_predictions( y_true=y, y_pred=y_pred, kind="actual_vs_predicted", ax=ax, scatter_kwargs={"alpha": 0.2, "color": "tab:blue"}, line_kwargs={"color": "tab:red"}, ) ax.set_title(f"{name}\nالتقييم في {elapsed_time:.2f} ثانية") for name, score in scores.items(): ax.plot([], [], " ", label=f"{name}: {score}") ax.legend(loc="upper left") plt.suptitle("المتنبئات الفردية مقابل المتنبئات المكدسة") plt.tight_layout() plt.subplots_adjust(top=0.9) plt.show() .. image-sg:: /auto_examples/ensemble/images/sphx_glr_plot_stack_predictors_001.png :alt: المتنبئات الفردية مقابل المتنبئات المكدسة, الغابة العشوائية التقييم في 1.53 ثانية, Lasso التقييم في 0.44 ثانية, التعزيز المتدرج التقييم في 0.51 ثانية, مُنحدِر التكديس التقييم في 10.65 ثانية :srcset: /auto_examples/ensemble/images/sphx_glr_plot_stack_predictors_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 262-265 سيجمع مُنحدِر التكديس نقاط القوة لمختلف المُنحدرات. ومع ذلك، نرى أيضًا أن تدريب مُنحدِر التكديس مكلف حسابيًا أكثر. .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 26.930 seconds) .. _sphx_glr_download_auto_examples_ensemble_plot_stack_predictors.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: binder-badge .. image:: images/binder_badge_logo.svg :target: https://mybinder.org/v2/gh/scikit-learn/scikit-learn/main?urlpath=lab/tree/notebooks/auto_examples/ensemble/plot_stack_predictors.ipynb :alt: Launch binder :width: 150 px .. container:: lite-badge .. image:: images/jupyterlite_badge_logo.svg :target: ../../lite/lab/index.html?path=auto_examples/ensemble/plot_stack_predictors.ipynb :alt: Launch JupyterLite :width: 150 px .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_stack_predictors.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_stack_predictors.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_stack_predictors.zip ` .. include:: plot_stack_predictors.recommendations .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_