6.1. خطوط الأنابيب والمقدرات المركبة#
لبناء مقدر مركب، عادةً ما يتم دمج المحولات مع محولات أخرى أو مع المتنبئين (مثل المصنفات أو عوامل الانحدار).
الأداة الأكثر شيوعًا المستخدمة لتكوين المقدرات هي Pipeline.
تتطلب خطوط الأنابيب أن تكون جميع الخطوات باستثناء الأخيرة محول.
يمكن أن تكون الخطوة الأخيرة أي شيء، محول، متنبئ، أو مقدر تجميع قد يكون أو لا يحتوي على طريقة .predict(...)
.
يعرض خط الأنابيب جميع الطرق التي يوفرها المقدر الأخير: إذا كانت الخطوة الأخيرة توفر طريقة transform
، فسيكون لخط الأنابيب طريقة transform
ويتصرف مثل المحول.
إذا كانت الخطوة الأخيرة توفر طريقة predict
، فسيكشف خط الأنابيب عن تلك الطريقة، وبالنظر إلى البيانات X، استخدم جميع الخطوات باستثناء الأخيرة لتحويل البيانات، ثم أعط تلك البيانات المحولة إلى طريقة predict
للخطوة الأخيرة من خط الأنابيب.
غالبًا ما تُستخدم الفئة Pipeline
مع ColumnTransformer أو FeatureUnion التي تربط ناتج المحولات في مساحة ميزة مركبة.
يتعامل TransformedTargetRegressor مع تحويل الهدف (أي تحويل السجل y).
6.1.1. Pipeline: سلسلة المقدرات#
يمكن استخدام Pipeline
لسلسلة مقدرات متعددة في واحد.
هذا مفيد لأنه غالبًا ما يكون هناك تسلسل ثابت للخطوات في معالجة البيانات، على سبيل المثال اختيار الميزات والتطبيع والتصنيف. يخدم Pipeline
أغراضًا متعددة هنا:
- اختيار المعلمة المشتركة
يمكنك البحث في الشبكة على معلمات جميع المقدرات في خط الأنابيب في وقت واحد.
- الأمان
تساعد خطوط الأنابيب على تجنب تسريب الإحصائيات من بيانات الاختبار الخاصة بك إلى النموذج المدرب في التحقق المتبادل، من خلال ضمان استخدام نفس العينات لتدريب المحولات والمتنبئين.
يجب أن تكون جميع المقدرات في خط الأنابيب، باستثناء الأخير، محولات (أي يجب أن يكون لها طريقة transform). قد يكون المقدر الأخير من أي نوع (محول، مصنف، إلخ).
ملاحظة
إن استدعاء fit
على خط الأنابيب هو نفسه استدعاء fit
على كل مقدر بدوره، transform
الإدخال وتمريره إلى الخطوة التالية.
يحتوي خط الأنابيب على جميع الطرق التي يمتلكها المقدر الأخير في خط الأنابيب، أي إذا كان المقدر الأخير هو مصنف، فيمكن استخدام Pipeline
كمصنف.
إذا كان المقدر الأخير هو محول، مرة أخرى، كذلك هو خط الأنابيب.
6.1.1.1. الاستخدام#
6.1.1.1.1. بناء خط أنابيب#
يتم بناء Pipeline
باستخدام قائمة من أزواج (key, value)
، حيث key
عبارة عن سلسلة تحتوي على الاسم الذي تريد إعطائه لهذه الخطوة و value
هو كائن مقدر:
>>> from sklearn.pipeline import Pipeline
>>> from sklearn.svm import SVC
>>> from sklearn.decomposition import PCA
>>> estimators = [('reduce_dim', PCA()), ('clf', SVC())]
>>> pipe = Pipeline(estimators)
>>> pipe
Pipeline(steps=[('reduce_dim', PCA()), ('clf', SVC())])
إصدار مختصر باستخدام make_pipeline
#
دالة الأداة المساعدة make_pipeline
هي اختصار لبناء خطوط الأنابيب؛ يأخذ عددًا متغيرًا من المقدرات ويعيد خط أنابيب، مع ملء الأسماء تلقائيًا:
>>> from sklearn.pipeline import make_pipeline
>>> make_pipeline(PCA(), SVC())
Pipeline(steps=[('pca', PCA()), ('svc', SVC())])
6.1.1.1.2. الوصول إلى خطوات خط الأنابيب#
يتم تخزين مقدرات خط الأنابيب كقائمة في سمة steps
.
يمكن استخراج خط أنابيب فرعي باستخدام تدوين التقطيع المستخدم بشكل شائع لتسلسلات Python مثل القوائم أو السلاسل (على الرغم من أنه يُسمح بخطوة واحدة فقط).
هذا مناسب لأداء بعض التحويلات فقط (أو عكسها):
>>> pipe[:1]
Pipeline(steps=[('reduce_dim', PCA())])
>>> pipe[-1:]
Pipeline(steps=[('clf', SVC())])
الوصول إلى خطوة بالاسم أو الموضع#
يمكن أيضًا الوصول إلى خطوة محددة عن طريق الفهرس أو الاسم عن طريق فهرسة (مع [idx]
) خط الأنابيب:
>>> pipe.steps[0]
('reduce_dim', PCA())
>>> pipe[0]
PCA()
>>> pipe['reduce_dim']
PCA()
تسمح سمة named_steps
لـ Pipeline
بالوصول إلى الخطوات بالاسم مع إكمال علامة التبويب في البيئات التفاعلية:
>>> pipe.named_steps.reduce_dim is pipe['reduce_dim']
True
6.1.1.1.3. تتبع أسماء الميزات في خط أنابيب#
لتمكين فحص النموذج، Pipeline
لديه طريقة get_feature_names_out()
، تمامًا مثل جميع المحولات.
يمكنك استخدام تقطيع خط الأنابيب للحصول على أسماء الميزات التي تدخل في كل خطوة:
>>> from sklearn.datasets import load_iris
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.feature_selection import SelectKBest
>>> iris = load_iris()
>>> pipe = Pipeline(steps=[
... ('select', SelectKBest(k=2)),
... ('clf', LogisticRegression())])
>>> pipe.fit(iris.data, iris.target)
Pipeline(steps=[('select', SelectKBest(...)), ('clf', LogisticRegression(...))])
>>> pipe[:-1].get_feature_names_out()
array(['x2', 'x3'], ...)
تخصيص أسماء الميزات#
يمكنك أيضًا توفير أسماء ميزات مخصصة لبيانات الإدخال باستخدام get_feature_names_out
:
>>> pipe[:-1].get_feature_names_out(iris.feature_names)
array(['petal length (cm)', 'petal width (cm)'], ...)
6.1.1.1.4. الوصول إلى المعلمات المتداخلة#
من الشائع تعديل معلمات المقدر داخل خط الأنابيب.
لذلك يتم تداخل هذه المعلمة لأنها تنتمي إلى خطوة فرعية معينة.
يمكن الوصول إلى معلمات المقدرات في خط الأنابيب باستخدام بناء جملة <estimator>__<parameter>
:
>>> pipe = Pipeline(steps=[("reduce_dim", PCA()), ("clf", SVC())])
>>> pipe.set_params(clf__C=10)
Pipeline(steps=[('reduce_dim', PCA()), ('clf', SVC(C=10))])
متى يهم؟#
هذا مهم بشكل خاص لإجراء عمليات بحث الشبكة:
>>> from sklearn.model_selection import GridSearchCV
>>> param_grid = dict(reduce_dim__n_components=[2, 5, 10],
... clf__C=[0.1, 10, 100])
>>> grid_search = GridSearchCV(pipe, param_grid=param_grid)
يمكن أيضًا استبدال الخطوات الفردية كمعلمات، ويمكن تجاهل الخطوات غير النهائية عن طريق تعيينها على 'passthrough'
:
>>> param_grid = dict(reduce_dim=['passthrough', PCA(5), PCA(10)],
... clf=[SVC(), LogisticRegression()],
... clf__C=[0.1, 10, 100])
>>> grid_search = GridSearchCV(pipe, param_grid=param_grid)
شاهد أيضا
أمثلة
sphx_glr_auto_examples_feature_selection/plot_feature_selection_pipeline.py
sphx_glr_auto_examples_model_selection/plot_grid_search_text_feature_extraction.py
sphx_glr_auto_examples_compose/plot_digits_pipe.py
sphx_glr_auto_examples_miscellaneous/plot_kernel_approximation.py
sphx_glr_auto_examples_svm/plot_svm_anova.py
sphx_glr_auto_examples_compose/plot_compare_reduction.py
sphx_glr_auto_examples_miscellaneous/plot_pipeline_display.py
6.1.1.2. تخزين المحولات مؤقتًا: تجنب الحساب المتكرر#
قد يكون تركيب المحولات مكلفًا من الناحية الحسابية. مع تعيين معلمة memory
، سيقوم Pipeline
بتخزين كل محول مؤقتًا بعد استدعاء fit
.
تُستخدم هذه الميزة لتجنب حساب المحولات المناسبة داخل خط الأنابيب إذا كانت المعلمات وبيانات الإدخال متطابقة.
مثال نموذجي هو حالة بحث الشبكة حيث يمكن تركيب المحولات مرة واحدة فقط وإعادة استخدامها لكل تكوين.
لن يتم تخزين الخطوة الأخيرة مؤقتًا أبدًا، حتى لو كانت محولًا.
المعلمة memory
مطلوبة من أجل تخزين المحولات مؤقتًا.
يمكن أن يكون memory
إما سلسلة تحتوي على الدليل حيث يتم تخزين المحولات مؤقتًا أو كائن joblib.Memory:
>>> from tempfile import mkdtemp
>>> from shutil import rmtree
>>> from sklearn.decomposition import PCA
>>> from sklearn.svm import SVC
>>> from sklearn.pipeline import Pipeline
>>> estimators = [('reduce_dim', PCA()), ('clf', SVC())]
>>> cachedir = mkdtemp()
>>> pipe = Pipeline(estimators, memory=cachedir)
>>> pipe
Pipeline(memory=...,
steps=[('reduce_dim', PCA()), ('clf', SVC())])
>>> # امسح دليل التخزين المؤقت عندما لا تعود بحاجة إليه
>>> rmtree(cachedir)
الآثار الجانبية لتخزين المحولات مؤقتًا#
باستخدام Pipeline
بدون تمكين التخزين المؤقت، من الممكن فحص المثيل الأصلي مثل:
>>> from sklearn.datasets import load_digits
>>> X_digits, y_digits = load_digits(return_X_y=True)
>>> pca1 = PCA(n_components=10)
>>> svm1 = SVC()
>>> pipe = Pipeline([('reduce_dim', pca1), ('clf', svm1)])
>>> pipe.fit(X_digits, y_digits)
Pipeline(steps=[('reduce_dim', PCA(n_components=10)), ('clf', SVC())])
>>> # يمكن فحص مثيل pca مباشرة
>>> pca1.components_.shape
(10, 64)
يؤدي تمكين التخزين المؤقت إلى استنساخ المحولات قبل التركيب.
لذلك، لا يمكن فحص مثيل المحول المعطى لخط الأنابيب مباشرةً.
في المثال التالي، سيؤدي الوصول إلى مثيل PCA
pca2
إلى حدوث AttributeError
لأن pca2
سيكون محولًا غير مناسب.
بدلاً من ذلك، استخدم سمة named_steps
لفحص المقدرات داخل خط الأنابيب:
>>> cachedir = mkdtemp()
>>> pca2 = PCA(n_components=10)
>>> svm2 = SVC()
>>> cached_pipe = Pipeline([('reduce_dim', pca2), ('clf', svm2)],
... memory=cachedir)
>>> cached_pipe.fit(X_digits, y_digits)
Pipeline(memory=...,
steps=[('reduce_dim', PCA(n_components=10)), ('clf', SVC())])
>>> cached_pipe.named_steps['reduce_dim'].components_.shape
(10, 64)
>>> # إزالة دليل التخزين المؤقت
>>> rmtree(cachedir)
أمثلة
sphx_glr_auto_examples_compose/plot_compare_reduction.py
6.1.2. تحويل الهدف في الانحدار#
يقوم TransformedTargetRegressor
بتحويل الأهداف y
قبل ملاءمة نموذج الانحدار.
يتم تعيين التنبؤات مرة أخرى إلى المساحة الأصلية عبر تحويل عكسي.
يأخذ كوسيطة عامل الانحدار الذي سيتم استخدامه للتنبؤ، والمحول الذي سيتم تطبيقه على متغير الهدف:
>>> import numpy as np
>>> from sklearn.datasets import fetch_california_housing
>>> from sklearn.compose import TransformedTargetRegressor
>>> from sklearn.preprocessing import QuantileTransformer
>>> from sklearn.linear_model import LinearRegression
>>> from sklearn.model_selection import train_test_split
>>> X, y = fetch_california_housing(return_X_y=True)
>>> X, y = X[:2000, :], y[:2000] # حدد مجموعة فرعية من البيانات
>>> transformer = QuantileTransformer(output_distribution='normal')
>>> regressor = LinearRegression()
>>> regr = TransformedTargetRegressor(regressor=regressor,
... transformer=transformer)
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
>>> regr.fit(X_train, y_train)
TransformedTargetRegressor(...)
>>> print('R2 score: {0:.2f}'.format(regr.score(X_test, y_test)))
R2 score: 0.61
>>> raw_target_regr = LinearRegression().fit(X_train, y_train)
>>> print('R2 score: {0:.2f}'.format(raw_target_regr.score(X_test, y_test)))
R2 score: 0.59
بالنسبة للتحويلات البسيطة، بدلاً من كائن Transformer، زوج من يمكن تمرير الدوال، وتحديد التحويل وتعيينه العكسي:
>>> def func(x):
... return np.log(x)
>>> def inverse_func(x):
... return np.exp(x)
بعد ذلك، يتم إنشاء الكائن على النحو التالي:
>>> regr = TransformedTargetRegressor(regressor=regressor,
... func=func,
... inverse_func=inverse_func)
>>> regr.fit(X_train, y_train)
TransformedTargetRegressor(...)
>>> print('R2 score: {0:.2f}'.format(regr.score(X_test, y_test)))
R2 score: 0.51
افتراضيًا، يتم فحص الدوال المقدمة في كل ملاءمة لتكون معكوسة لبعضها البعض. ومع ذلك، من الممكن تجاوز هذا الفحص عن طريق تعيين check_inverse
على False
:
>>> def inverse_func(x):
... return x
>>> regr = TransformedTargetRegressor(regressor=regressor,
... func=func,
... inverse_func=inverse_func,
... check_inverse=False)
>>> regr.fit(X_train, y_train)
TransformedTargetRegressor(...)
>>> print('R2 score: {0:.2f}'.format(regr.score(X_test, y_test)))
R2 score: -1.57
ملاحظة
يمكن تشغيل التحويل عن طريق تعيين transformer
أو الزوج
من الدوال func
و inverse_func
. ومع ذلك، فإن تعيين كلا الخيارين سيرفع خطأ.
أمثلة
sphx_glr_auto_examples_compose/plot_transformed_target.py
6.1.3. FeatureUnion: مساحات ميزات مركبة#
يقوم FeatureUnion
بدمج العديد من كائنات المحول في محول جديد يجمع مخرجاتها.
يأخذ FeatureUnion
قائمة بكائنات المحول.
أثناء التركيب، يتم ملاءمة كل من هذه البيانات بشكل مستقل.
يتم تطبيق المحولات بالتوازي، ويتم ربط مصفوفات الميزات التي تُخرجها جنبًا إلى جنب في مصفوفة أكبر.
عندما تريد تطبيق تحويلات مختلفة على كل حقل من البيانات، انظر الفئة ذات الصلة ColumnTransformer
(انظر دليل المستخدم).
يخدم FeatureUnion
نفس أغراض Pipeline
- الراحة وتقدير المعلمات والتحقق من الصحة المشتركة.
يمكن دمج FeatureUnion
و Pipeline
لإنشاء نماذج معقدة.
(لا توجد طريقة لـ FeatureUnion
للتحقق مما إذا كان محولين قد ينتجان ميزات متطابقة.
ينتج اتحادًا فقط عندما تكون مجموعات الميزات منفصلة، والتأكد من أنها مسؤولية المتصل.)
6.1.3.1. الاستخدام#
يتم بناء FeatureUnion
باستخدام قائمة من أزواج (key, value)
، حيث key
هو الاسم الذي تريد إعطائه لتحويل معين (سلسلة عشوائية؛ فهو بمثابة معرف فقط) و value
هو كائن مقدر:
>>> from sklearn.pipeline import FeatureUnion
>>> from sklearn.decomposition import PCA
>>> from sklearn.decomposition import KernelPCA
>>> estimators = [('linear_pca', PCA()), ('kernel_pca', KernelPCA())]
>>> combined = FeatureUnion(estimators)
>>> combined
FeatureUnion(transformer_list=[('linear_pca', PCA()),
('kernel_pca', KernelPCA())])
مثل خطوط الأنابيب، تحتوي اتحادات الميزات على مُنشئ مختصر يسمى make_union
لا يتطلب تسمية صريحة للمكونات.
مثل Pipeline
، يمكن استبدال الخطوات الفردية باستخدام set_params
، وتجاهلها عن طريق التعيين على 'drop'
:
>>> combined.set_params(kernel_pca='drop')
FeatureUnion(transformer_list=[('linear_pca', PCA()),
('kernel_pca', 'drop')])
أمثلة
sphx_glr_auto_examples_compose/plot_feature_union.py
6.1.4. ColumnTransformer للبيانات غير المتجانسة#
تحتوي العديد من مجموعات البيانات على ميزات من أنواع مختلفة، على سبيل المثال النص والعوامات والتواريخ، حيث يتطلب كل نوع من الميزات خطوات معالجة مسبقة أو استخراج ميزات منفصلة. غالبًا ما يكون من الأسهل معالجة البيانات مسبقًا قبل تطبيق طرق scikit-learn، على سبيل المثال باستخدام pandas. قد تكون معالجة بياناتك قبل تمريرها إلى scikit-learn مشكلة لأحد الأسباب التالية:
دمج الإحصائيات من بيانات الاختبار في المعالجات المسبقة يجعل درجات التحقق المتبادل غير موثوقة (تُعرف باسم تسرب البيانات)، على سبيل المثال في حالة المقاييس أو إدخال القيم المفقودة.
قد ترغب في تضمين معلمات المعالجات المسبقة في بحث المعلمات.
يساعد ColumnTransformer
في إجراء تحويلات مختلفة لأعمدة مختلفة من البيانات، داخل Pipeline
آمن من تسرب البيانات ويمكن تحديد معلمات له.
يعمل ColumnTransformer
على المصفوفات والمصفوفات المتفرقة و pandas DataFrames.
يمكن تطبيق تحويل مختلف على كل عمود، مثل المعالجة المسبقة أو طريقة استخراج ميزات محددة:
>>> import pandas as pd
>>> X = pd.DataFrame(
... {'city': ['London', 'London', 'Paris', 'Sallisaw'],
... 'title': ["His Last Bow", "How Watson Learned the Trick",
... "A Moveable Feast", "The Grapes of Wrath"],
... 'expert_rating': [5, 3, 4, 5],
... 'user_rating': [4, 5, 4, 3]})
بالنسبة لهذه البيانات، قد نرغب في ترميز عمود 'city'
كمتغير فئوي باستخدام OneHotEncoder
ولكن تطبيق CountVectorizer
على عمود 'title'
.
نظرًا لأننا قد نستخدم طرق استخراج ميزات متعددة على نفس العمود، فإننا نعطي كل محول اسمًا فريدًا، على سبيل المثال 'city_category'
و 'title_bow'
.
افتراضيًا، يتم تجاهل أعمدة التصنيف المتبقية (remainder='drop'
):
>>> from sklearn.compose import ColumnTransformer
>>> from sklearn.feature_extraction.text import CountVectorizer
>>> from sklearn.preprocessing import OneHotEncoder
>>> column_trans = ColumnTransformer(
... [('categories', OneHotEncoder(dtype='int'), ['city']),
... ('title_bow', CountVectorizer(), 'title')],
... remainder='drop', verbose_feature_names_out=False)
>>> column_trans.fit(X)
ColumnTransformer(transformers=[('categories', OneHotEncoder(dtype='int'),
['city']),
('title_bow', CountVectorizer(), 'title')],
verbose_feature_names_out=False)
>>> column_trans.get_feature_names_out()
array(['city_London', 'city_Paris', 'city_Sallisaw', 'bow', 'feast',
'grapes', 'his', 'how', 'last', 'learned', 'moveable', 'of', 'the',
'trick', 'watson', 'wrath'], ...)
>>> column_trans.transform(X).toarray()
array([[1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0],
[0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1]]...)
في المثال أعلاه، يتوقع CountVectorizer
مصفوفة أحادية البعد كمدخل، وبالتالي تم تحديد الأعمدة كسلسلة ('title'
).
ومع ذلك، يتوقع OneHotEncoder
مثل معظم المحولات الأخرى بيانات ثنائية الأبعاد، لذلك في هذه الحالة تحتاج إلى تحديد العمود كقائمة من السلاسل (['city']
).
بصرف النظر عن العددية أو قائمة العناصر الفردية، يمكن تحديد اختيار العمود كقائمة من عناصر متعددة، أو مصفوفة عدد صحيح، أو شريحة، أو قناع منطقي، أو باستخدام make_column_selector
.
يتم استخدام make_column_selector
لتحديد الأعمدة بناءً على نوع البيانات أو اسم العمود:
>>> from sklearn.preprocessing import StandardScaler
>>> from sklearn.compose import make_column_selector
>>> ct = ColumnTransformer([
... ('scale', StandardScaler(),
... make_column_selector(dtype_include=np.number)),
... ('onehot',
... OneHotEncoder(),
... make_column_selector(pattern='city', dtype_include=object))])
>>> ct.fit_transform(X)
array([[ 0.904..., 0. , 1. , 0. , 0. ],
[-1.507..., 1.414..., 1. , 0. , 0. ],
[-0.301..., 0. , 0. , 1. , 0. ],
[ 0.904..., -1.414..., 0. , 0. , 1. ]])
يمكن أن تشير السلاسل إلى الأعمدة إذا كان الإدخال عبارة عن إطار بيانات، ويتم دائمًا تفسير الأعداد الصحيحة على أنها أعمدة موضعية.
يمكننا الاحتفاظ بأعمدة التصنيف المتبقية عن طريق تعيين remainder='passthrough'
.
يتم إلحاق القيم بنهاية التحويل:
>>> column_trans = ColumnTransformer(
... [('city_category', OneHotEncoder(dtype='int'),['city']),
... ('title_bow', CountVectorizer(), 'title')],
... remainder='passthrough')
>>> column_trans.fit_transform(X)
array([[1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 5, 4],
[1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 3, 5],
[0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, 4],
[0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 5, 3]]...)
يمكن تعيين معلمة remainder
إلى مقدر لتحويل أعمدة التصنيف المتبقية.
يتم إلحاق القيم المحولة بنهاية التحويل:
>>> from sklearn.preprocessing import MinMaxScaler
>>> column_trans = ColumnTransformer(
... [('city_category', OneHotEncoder(), ['city']),
... ('title_bow', CountVectorizer(), 'title')],
... remainder=MinMaxScaler())
>>> column_trans.fit_transform(X)[:, -2:]
array([[1. , 0.5],
[0. , 1. ],
[0.5, 0.5],
[1. , 0. ]])
تتوفر دالة make_column_transformer
لإنشاء كائن ColumnTransformer
بسهولة أكبر.
على وجه التحديد، سيتم إعطاء الأسماء تلقائيًا.
سيكون المكافئ للمثال أعلاه هو:
>>> from sklearn.compose import make_column_transformer
>>> column_trans = make_column_transformer(
... (OneHotEncoder(), ['city']),
... (CountVectorizer(), 'title'),
... remainder=MinMaxScaler())
>>> column_trans
ColumnTransformer(remainder=MinMaxScaler(),
transformers=[('onehotencoder', OneHotEncoder(), ['city']),
('countvectorizer', CountVectorizer(),
'title')])
إذا تم ملاءمة ColumnTransformer
بإطار بيانات وكان إطار البيانات يحتوي فقط على أسماء أعمدة سلسلة، فسيتم استخدام أسماء الأعمدة لتحديد الأعمدة عند تحويل إطار البيانات:
>>> ct = ColumnTransformer(
... [("scale", StandardScaler(), ["expert_rating"])]).fit(X)
>>> X_new = pd.DataFrame({"expert_rating": [5, 6, 1],
... "ignored_new_col": [1.2, 0.3, -0.1]})
>>> ct.transform(X_new)
array([[ 0.9...],
[ 2.1...],
[-3.9...]])
6.1.5. تصور المقدرات المركبة#
يتم عرض المقدرات بتمثيل HTML عند عرضها في دفتر ملاحظات jupyter. هذا مفيد لتشخيص أو تصور خط أنابيب مع العديد من المقدرات. يتم تنشيط هذا التصور افتراضيًا:
>>> column_trans
يمكن إلغاء تنشيطه عن طريق تعيين خيار display
في set_config
إلى "text"
>>> from sklearn import set_config
>>> set_config(display='text')
>>> # يعرض تمثيل النص في سياق jupyter
>>> column_trans
يمكن رؤية مثال على إخراج HTML في قسم HTML representation of Pipeline من sphx_glr_auto_examples_compose/plot_column_transformer_mixed_types.py.
كبديل، يمكن كتابة HTML إلى ملف باستخدام estimator_html_repr
:
>>> from sklearn.utils import estimator_html_repr
>>> with open('my_estimator.html', 'w') as f:
... f.write(estimator_html_repr(clf))
أمثلة
sphx_glr_auto_examples_compose/plot_column_transformer.py
sphx_glr_auto_examples_compose/plot_column_transformer_mixed_types.py