.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/model_selection/plot_grid_search_text_feature_extraction.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_model_selection_plot_grid_search_text_feature_extraction.py: ========================================================== مثال على خط أنابيب لاستخراج ميزات النص وتقييمها ========================================================== مجموعة البيانات المستخدمة في هذا المثال هي :ref:`20newsgroups_dataset` والتي سيتم تنزيلها تلقائيًا وتخزينها مؤقتًا وإعادة استخدامها لمثال تصنيف المستند. في هذا المثال، نقوم بضبط معلمات نموذج معين باستخدام :class:`~sklearn.model_selection.RandomizedSearchCV`. لمشاهدة أداء بعض المصنفات الأخرى، راجع :ref:`sphx_glr_auto_examples_text_plot_document_classification_20newsgroups.py` دفتر الملاحظات. .. GENERATED FROM PYTHON SOURCE LINES 14-18 .. code-block:: Python # المؤلفون: مطوري scikit-learn # معرف الترخيص: BSD-3-Clause .. GENERATED FROM PYTHON SOURCE LINES 19-24 تحميل البيانات ------------ نقوم بتحميل فئتين من مجموعة التدريب. يمكنك ضبط عدد الفئات عن طريق إضافة أسمائها إلى القائمة أو تعيين `categories=None` عند استدعاء محمل مجموعة البيانات :func:`~sklearn.datasets.fetch_20newsgroups` للحصول على 20 منها. .. GENERATED FROM PYTHON SOURCE LINES 24-52 .. code-block:: Python from sklearn.datasets import fetch_20newsgroups categories = [ "alt.atheism", "talk.religion.misc", ] data_train = fetch_20newsgroups( subset="train", categories=categories, shuffle=True, random_state=42, remove=("headers", "footers", "quotes"), ) data_test = fetch_20newsgroups( subset="test", categories=categories, shuffle=True, random_state=42, remove=("headers", "footers", "quotes"), ) print(f"تحميل مجموعة بيانات 20 newsgroups لـ {len(data_train.target_names)} فئات:") print(data_train.target_names) print(f"{len(data_train.data)} وثائق") .. rst-class:: sphx-glr-script-out .. code-block:: none تحميل مجموعة بيانات 20 newsgroups لـ 2 فئات: ['alt.atheism', 'talk.religion.misc'] 857 وثائق .. GENERATED FROM PYTHON SOURCE LINES 53-58 خط أنابيب مع ضبط المعلمات ----------------------------------- نحن نحدد خط أنابيب يجمع بين مستخرج ميزات النص مع مصنف بسيط ولكن فعال لتصنيف النص. .. GENERATED FROM PYTHON SOURCE LINES 58-71 .. code-block:: Python from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import ComplementNB from sklearn.pipeline import Pipeline pipeline = Pipeline( [ ("vect", TfidfVectorizer()), ("clf", ComplementNB()), ] ) pipeline .. raw:: html
Pipeline(steps=[('vect', TfidfVectorizer()), ('clf', ComplementNB())])
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 72-81 نحن نحدد شبكة من المعلمات ليتم استكشافها بواسطة :class:`~sklearn.model_selection.RandomizedSearchCV`. استخدام :class:`~sklearn.model_selection.GridSearchCV` بدلاً من ذلك سيستكشف جميع المجموعات الممكنة على الشبكة، والتي يمكن أن تكون مكلفة في الحساب، في حين أن المعلمة `n_iter` من :class:`~sklearn.model_selection.RandomizedSearchCV` تتحكم في عدد المجموعات العشوائية المختلفة التي يتم تقييمها. لاحظ أن تعيين `n_iter` أكبر من عدد المجموعات الممكنة في الشبكة سيؤدي إلى تكرار المجموعات التي تم استكشافها بالفعل. نبحث عن أفضل مجموعة من المعلمات لكل من استخراج الميزات (`vect__`) والمصنف (`clf__`). .. GENERATED FROM PYTHON SOURCE LINES 81-92 .. code-block:: Python import numpy as np parameter_grid = { "vect__max_df": (0.2, 0.4, 0.6, 0.8, 1.0), "vect__min_df": (1, 3, 5, 10), "vect__ngram_range": ((1, 1), (1, 2)), # كلمات مفردة أو ثنائية "vect__norm": ("l1", "l2"), "clf__alpha": np.logspace(-6, 6, 13), } .. GENERATED FROM PYTHON SOURCE LINES 93-97 في هذه الحالة، `n_iter=40` ليس بحثًا شاملًا لشبكة المعلمات. في الواقع، سيكون من المثير للاهتمام زيادة المعلمة `n_iter` للحصول على تحليل أكثر إفادة. ونتيجة لذلك، يزيد وقت الحساب. يمكننا تقليله عن طريق الاستفادة من التوازي على تقييم مجموعات المعلمات عن طريق زيادة عدد وحدات المعالجة المركزية المستخدمة عبر المعلمة `n_jobs`. .. GENERATED FROM PYTHON SOURCE LINES 97-115 .. code-block:: Python from pprint import pprint from sklearn.model_selection import RandomizedSearchCV random_search = RandomizedSearchCV( estimator=pipeline, param_distributions=parameter_grid, n_iter=40, random_state=0, n_jobs=2, verbose=1, ) print("أداء البحث الشبكي...") print("معلمات ليتم تقييمها:") pprint(parameter_grid) .. rst-class:: sphx-glr-script-out .. code-block:: none أداء البحث الشبكي... معلمات ليتم تقييمها: {'clf__alpha': array([1.e-06, 1.e-05, 1.e-04, 1.e-03, 1.e-02, 1.e-01, 1.e+00, 1.e+01, 1.e+02, 1.e+03, 1.e+04, 1.e+05, 1.e+06]), 'vect__max_df': (0.2, 0.4, 0.6, 0.8, 1.0), 'vect__min_df': (1, 3, 5, 10), 'vect__ngram_range': ((1, 1), (1, 2)), 'vect__norm': ('l1', 'l2')} .. GENERATED FROM PYTHON SOURCE LINES 116-122 .. code-block:: Python from time import time t0 = time() random_search.fit(data_train.data, data_train.target) print(f"تم الانتهاء في {time() - t0:.3f}s") .. rst-class:: sphx-glr-script-out .. code-block:: none Fitting 5 folds for each of 40 candidates, totalling 200 fits تم الانتهاء في 35.163s .. GENERATED FROM PYTHON SOURCE LINES 123-128 .. code-block:: Python print("أفضل مجموعة من المعلمات التي تم العثور عليها:") best_parameters = random_search.best_estimator_.get_params() for param_name in sorted(parameter_grid.keys()): print(f"{param_name}: {best_parameters[param_name]}") .. rst-class:: sphx-glr-script-out .. code-block:: none أفضل مجموعة من المعلمات التي تم العثور عليها: clf__alpha: 0.01 vect__max_df: 0.2 vect__min_df: 1 vect__ngram_range: (1, 1) vect__norm: l1 .. GENERATED FROM PYTHON SOURCE LINES 129-136 .. code-block:: Python test_accuracy = random_search.score(data_test.data, data_test.target) print( "دقة أفضل المعلمات باستخدام CV الداخلي لـ " f"البحث العشوائي: {random_search.best_score_:.3f}" ) print(f"الدقة على مجموعة الاختبار: {test_accuracy:.3f}") .. rst-class:: sphx-glr-script-out .. code-block:: none دقة أفضل المعلمات باستخدام CV الداخلي لـ البحث العشوائي: 0.816 الدقة على مجموعة الاختبار: 0.709 .. GENERATED FROM PYTHON SOURCE LINES 137-140 البادئات `vect` و `clf` مطلوبة لتجنب الغموض المحتمل في خط الأنابيب، ولكنها غير ضرورية لعرض النتائج. بسبب هذا، نحن نحدد دالة ستعيد تسمية المعلمات التي تم ضبطها وتحسين قابلية القراءة. .. GENERATED FROM PYTHON SOURCE LINES 140-154 .. code-block:: Python import pandas as pd def shorten_param(param_name): """إزالة بادئات المكونات في param_name.""" if "__" in param_name: return param_name.rsplit("__", 1)[1] return param_name cv_results = pd.DataFrame(random_search.cv_results_) cv_results = cv_results.rename(shorten_param, axis=1) .. GENERATED FROM PYTHON SOURCE LINES 155-160 يمكننا استخدام `plotly.express.scatter `_ لعرض المقايضة بين وقت التسجيل ومتوسط درجة الاختبار (أي "درجة CV"). تمرير المؤشر فوق نقطة معينة يعرض المعلمات المقابلة. أشرطة الخطأ تقابل انحرافًا معياريًا واحدًا كما تم حسابه في الطيات المختلفة للتحقق المتقاطع. .. GENERATED FROM PYTHON SOURCE LINES 160-188 .. code-block:: Python import plotly.express as px param_names = [shorten_param(name) for name in parameter_grid.keys()] labels = { "mean_score_time": "وقت درجة CV (ثانية)", "mean_test_score": "درجة CV (الدقة)", } fig = px.scatter( cv_results, x="mean_score_time", y="mean_test_score", error_x="std_score_time", error_y="std_test_score", hover_data=param_names, labels=labels, ) fig.update_layout( title={ "text": "المقايضة بين وقت التسجيل ومتوسط درجة الاختبار", "y": 0.95, "x": 0.5, "xanchor": "center", "yanchor": "top", } ) fig .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 189-204 لاحظ أن مجموعة النماذج في الركن العلوي الأيسر من الرسم البياني لها أفضل مقايضة بين الدقة ووقت التسجيل. في هذه الحالة، يؤدي استخدام الكلمات الثنائية إلى زيادة وقت التسجيل المطلوب دون تحسين دقة خط الأنابيب بشكل كبير. .. note:: للحصول على مزيد من المعلومات حول كيفية تخصيص ضبط تلقائي لتحقيق أقصى قدر من الدقة وتقليل وقت التسجيل، راجع دفتر الملاحظات المثال: :ref:`sphx_glr_auto_examples_model_selection_plot_grid_search_digits.py`. يمكننا أيضًا استخدام `plotly.express.parallel_coordinates `_ لعرض متوسط درجة الاختبار كدالة للمعلمات التي تم ضبطها. يساعد هذا في العثور على التفاعلات بين أكثر من معلمتين وتوفير الحدس حول أهميتها لتحسين أداء خط الأنابيب. نطبق تحويل `math.log10` على محور "alpha" لنشر النطاق النشط وتحسين قابلية قراءة الرسم البياني. يتم فهم القيمة :math:`x` على المحور المذكور على أنها :math:`10^x`. .. GENERATED FROM PYTHON SOURCE LINES 204-234 .. code-block:: Python import math column_results = param_names + ["mean_test_score", "mean_score_time"] transform_funcs = dict.fromkeys(column_results, lambda x: x) # استخدام مقياس لوغاريتمي لـ alpha transform_funcs["alpha"] = math.log10 # يتم تعيين المعايير L1 إلى الفهرس 1، والمعايير L2 إلى الفهرس 2 transform_funcs["norm"] = lambda x: 2 if x == "l2" else 1 # يتم تعيين الكلمات المفردة إلى الفهرس 1 والكلمات الثنائية إلى الفهرس 2 transform_funcs["ngram_range"] = lambda x: x[1] fig = px.parallel_coordinates( cv_results[column_results].apply(transform_funcs), color="mean_test_score", color_continuous_scale=px.colors.sequential.Viridis_r, labels=labels, ) fig.update_layout( title={ "text": "رسم تنسيق متوازي لخط أنابيب مصنف النص", "y": 0.99, "x": 0.5, "xanchor": "center", "yanchor": "top", } ) fig .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 235-250 يعرض رسم التنسيق المتوازي قيم المعلمات على أعمدة مختلفة في حين يتم ترميز مقياس الأداء بالألوان. من الممكن تحديد نطاق من النتائج عن طريق النقر والضغط على أي محور من رسم التنسيق المتوازي. يمكنك بعد ذلك تحريك (نقل) نطاق التحديد والتقاطع بين نطاقين لمشاهدة التقاطعات. يمكنك إلغاء تحديد عن طريق النقر مرة أخرى على نفس المحور. على وجه الخصوص لهذا البحث عن المعلمات، من المثير للاهتمام ملاحظة أن النماذج ذات الأداء الأعلى لا تعتمد على المعيار `norm`، ولكنها تعتمد على المقايضة بين `max_df`، و`min_df`، وقوة المعايرة `alpha`. والسبب هو أن تضمين الميزات الضجيجية (أي `max_df` قريب من :math:`1.0` أو `min_df` قريب من :math:`0`) يميل إلى الإفراط في التكيف وبالتالي يتطلب معايرة أقوى للتعويض. وجود ميزات أقل تتطلب معايرة أقل ووقت تسجيل أقل. يتم الحصول على أفضل درجات الدقة عندما تكون `alpha` بين :math:`10^{-6}` و :math:`10^0`، بغض النظر عن المعلمة `norm`. .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 38.440 seconds) .. _sphx_glr_download_auto_examples_model_selection_plot_grid_search_text_feature_extraction.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/model_selection/plot_grid_search_text_feature_extraction.ipynb :alt: Launch binder :width: 150 px .. container:: lite-badge .. image:: images/jupyterlite_badge_logo.svg :target: ../../lite/lab/index.html?path=auto_examples/model_selection/plot_grid_search_text_feature_extraction.ipynb :alt: Launch JupyterLite :width: 150 px .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_grid_search_text_feature_extraction.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_grid_search_text_feature_extraction.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_grid_search_text_feature_extraction.zip ` .. include:: plot_grid_search_text_feature_extraction.recommendations .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_