.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/compose/plot_column_transformer.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_compose_plot_column_transformer.py: ================================================== محول الأعمدة مع مصادر بيانات غير متجانسة ================================================== يمكن أن تحتوي مجموعات البيانات غالبًا على مكونات تتطلب معالجة واستخراج مميزات مختلفة. قد يحدث هذا السيناريو عندما: 1. تتكون مجموعة البيانات الخاصة بك من أنواع بيانات غير متجانسة (مثل صور نقطية ونصوص توضيحية)، 2. يتم تخزين مجموعة البيانات الخاصة بك في :class:`pandas.DataFrame` وتتطلب أعمدة مختلفة خطوط أنابيب معالجة مختلفة. يوضح هذا المثال كيفية استخدام :class:`~sklearn.compose.ColumnTransformer` على مجموعة بيانات تحتوي على أنواع مختلفة من الميزات. اختيار الميزات ليس مفيدًا بشكل خاص، ولكنه يخدم لتوضيح التقنية. .. GENERATED FROM PYTHON SOURCE LINES 16-32 .. code-block:: Python # Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause import numpy as np from sklearn.compose import ColumnTransformer from sklearn.datasets import fetch_20newsgroups from sklearn.decomposition import PCA from sklearn.feature_extraction import DictVectorizer from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics import classification_report from sklearn.pipeline import Pipeline from sklearn.preprocessing import FunctionTransformer from sklearn.svm import LinearSVC .. GENERATED FROM PYTHON SOURCE LINES 33-40 مجموعة بيانات 20 مجموعة أخبار --------------------- سنستخدم :ref:`مجموعة بيانات 20 مجموعة أخبار <20newsgroups_dataset>`، والتي تتألف من منشورات من مجموعات أخبار حول 20 موضوعًا. يتم تقسيم مجموعة البيانات هذه إلى مجموعات فرعية للتدريب والاختبار بناءً على الرسائل المنشورة قبل وبعد تاريخ محدد. سنستخدم فقط المنشورات من فئتين لتسريع وقت التشغيل. .. GENERATED FROM PYTHON SOURCE LINES 40-57 .. code-block:: Python categories = ["sci.med", "sci.space"] X_train, y_train = fetch_20newsgroups( random_state=1, subset="train", categories=categories, remove=("footers", "quotes"), return_X_y=True, ) X_test, y_test = fetch_20newsgroups( random_state=1, subset="test", categories=categories, remove=("footers", "quotes"), return_X_y=True, ) .. GENERATED FROM PYTHON SOURCE LINES 58-60 تتضمن كل ميزة معلومات وصفية حول هذا المنشور، مثل الموضوع، ونص منشور الأخبار. .. GENERATED FROM PYTHON SOURCE LINES 60-63 .. code-block:: Python print(X_train[0]) .. rst-class:: sphx-glr-script-out .. code-block:: none From: mccall@mksol.dseg.ti.com (fred j mccall 575-3539) Subject: Re: Metric vs English Article-I.D.: mksol.1993Apr6.131900.8407 Organization: Texas Instruments Inc Lines: 31 American, perhaps, but nothing military about it. I learned (mostly) slugs when we talked English units in high school physics and while the teacher was an ex-Navy fighter jock the book certainly wasn't produced by the military. [Poundals were just too flinking small and made the math come out funny; sort of the same reason proponents of SI give for using that.] -- "Insisting on perfect safety is for people who don't have the balls to live in the real world." -- Mary Shafer, NASA Ames Dryden .. GENERATED FROM PYTHON SOURCE LINES 64-72 إنشاء المحولات --------------------- أولاً، نريد محولًا يستخرج الموضوع و نص كل منشور. نظرًا لأن هذا تحويل عديم الحالة (لا يتطلب معلومات الحالة من بيانات التدريب)، يمكننا تحديد دالة تقوم بتحويل البيانات ثم استخدام :class:`~sklearn.preprocessing.FunctionTransformer` لإنشاء محول scikit-learn. .. GENERATED FROM PYTHON SOURCE LINES 72-98 .. code-block:: Python def subject_body_extractor(posts): # بناء مصفوفة من نوع كائن مع عمودين # العمود الأول = 'subject' والعمود الثاني = 'body' features = np.empty(shape=(len(posts), 2), dtype=object) for i, text in enumerate(posts): # المتغير المؤقت `_` يخزن '\n\n' headers, _, body = text.partition("\n\n") # تخزين نص الجسم في العمود الثاني features[i, 1] = body prefix = "Subject:" sub = "" # حفظ النص بعد 'Subject:' في العمود الأول for line in headers.split("\n"): if line.startswith(prefix): sub = line[len(prefix):] break features[i, 0] = sub return features subject_body_transformer = FunctionTransformer(subject_body_extractor) .. GENERATED FROM PYTHON SOURCE LINES 99-101 سننشئ أيضًا محولًا يستخرج طول النص وعدد الجمل. .. GENERATED FROM PYTHON SOURCE LINES 101-109 .. code-block:: Python def text_stats(posts): return [{"length": len(text), "num_sentences": text.count(".")} for text in posts] text_stats_transformer = FunctionTransformer(text_stats) .. GENERATED FROM PYTHON SOURCE LINES 110-119 خط أنابيب التصنيف ----------------------- يستخرج خط الأنابيب أدناه الموضوع والنص من كل منشور باستخدام ``SubjectBodyExtractor``، مما ينتج عنه مصفوفة (n_samples، 2). يتم استخدام هذه المصفوفة بعد ذلك لحساب ميزات حقيبة الكلمات القياسية للموضوع والنص بالإضافة إلى طول النص وعدد الجمل في النص، باستخدام ``ColumnTransformer``. نقوم بدمجها، مع أوزان، ثم ندرب مصنفًا على مجموعة الميزات المجمعة. .. GENERATED FROM PYTHON SOURCE LINES 119-175 .. code-block:: Python pipeline = Pipeline( [ # استخراج الموضوع والنص ("subjectbody", subject_body_transformer), # استخدام ColumnTransformer لدمج ميزات الموضوع والنص ( "union", ColumnTransformer( [ # حقيبة الكلمات للموضوع (العمود 0) ("subject", TfidfVectorizer(min_df=50), 0), # حقيبة الكلمات مع التحليل للنص (العمود 1) ( "body_bow", Pipeline( [ ("tfidf", TfidfVectorizer()), ("best", PCA(n_components=50, svd_solver="arpack")), ] ), 1, ), # خط أنابيب لسحب إحصائيات النص من نص المنشور ( "body_stats", Pipeline( [ ( "stats", text_stats_transformer, ), # يُرجع قائمة من القواميس ( "vect", DictVectorizer(), ), # قائمة القواميس -> مصفوفة الميزات ] ), 1, ), ], # وزن ميزات ColumnTransformer أعلاه transformer_weights={ "subject": 0.8, "body_bow": 0.5, "body_stats": 1.0, }, ), ), # استخدام مصنف SVC على الميزات المجمعة ("svc", LinearSVC(dual=False)), ], verbose=True, ) .. GENERATED FROM PYTHON SOURCE LINES 176-178 أخيرًا، نقوم بملاءمة خط الأنابيب الخاص بنا على بيانات التدريب ونستخدمه للتنبؤ بالموضوعات لـ ``X_test``. ثم تتم طباعة مقاييس أداء خط الأنابيب الخاص بنا. .. GENERATED FROM PYTHON SOURCE LINES 178-183 .. code-block:: Python pipeline.fit(X_train, y_train) y_pred = pipeline.predict(X_test) print("Classification report:\n\n{}".format( classification_report(y_test, y_pred))) .. rst-class:: sphx-glr-script-out .. code-block:: none [Pipeline] ....... (step 1 of 3) Processing subjectbody, total= 0.0s [Pipeline] ............. (step 2 of 3) Processing union, total= 0.5s [Pipeline] ............... (step 3 of 3) Processing svc, total= 0.0s Classification report: precision recall f1-score support 0 0.84 0.87 0.86 396 1 0.87 0.84 0.85 394 accuracy 0.86 790 macro avg 0.86 0.86 0.86 790 weighted avg 0.86 0.86 0.86 790 .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 2.969 seconds) .. _sphx_glr_download_auto_examples_compose_plot_column_transformer.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/compose/plot_column_transformer.ipynb :alt: Launch binder :width: 150 px .. container:: lite-badge .. image:: images/jupyterlite_badge_logo.svg :target: ../../lite/lab/index.html?path=auto_examples/compose/plot_column_transformer.ipynb :alt: Launch JupyterLite :width: 150 px .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_column_transformer.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_column_transformer.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_column_transformer.zip ` .. include:: plot_column_transformer.recommendations .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_