Scikit-learn: الباندا في الخارج ، الباندا بالخارج؟

تم إنشاؤها على ٢٢ أكتوبر ٢٠١٥  ·  59تعليقات  ·  مصدر: scikit-learn/scikit-learn

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

هذا ليس واضحًا تمامًا ، لأنه إذا كان Dataframe الخاص بك يحتوي على أعمدة ليست رقمية ، فإن المصفوفات الوسيطة الصغيرة ستتسبب في فشل sklearn ، لأنها ستكون dtype=object ، بدلاً من dtype=float . يمكن حل ذلك من خلال وجود محول Dataframe-> ndarray ، الذي يقوم بتعيين البيانات غير الرقمية إلى البيانات الرقمية (على سبيل المثال ، الأعداد الصحيحة التي تمثل الفئات / الفئات). يقوم sklearn-pandas بهذا بالفعل ، على الرغم من أنه لا يحتوي حاليًا

أشعر أن تحويلًا كهذا سيكون مفيدًا حقًا في sklearn - إنه نوع الشيء الذي قد يجده أي شخص يعمل مع مجموعات البيانات ذات أنواع البيانات المتعددة مفيدًا. ما الذي يتطلبه الأمر للحصول على شيء مثل هذا في sklearn؟

التعليق الأكثر فائدة

جميع المحولات الخاصة بي ترجع DataFrame s عند إعطائها DataFrame s.
عندما أقوم بإدخال 300 عمود DataFrame في Pipeline واستلم 500 عمود ndarray ، لا يمكنني تعلم الكثير منه بشكل فعال ، على سبيل المثال ، feature_selection ، لأنه ليس لدي أسماء الأعمدة بعد الآن. إذا أخبرني ، على سبيل المثال ، mutual_info_classif أن العمودين 30 و 75 فقط هما المهمان ، فلا يمكنني معرفة كيفية تبسيط Pipeline الأصلي للإنتاج.
وبالتالي ، من المهم بالنسبة لحالة الاستخدام الخاصة بي الاحتفاظ ببياناتي DataFrame .
شكرا لك.

ال 59 كومينتر

تم تصميم Scikit-Learn للعمل باستخدام تنسيق إدخال عام للغاية. ربما تغير العالم المحيط بـ scikit-Learn كثيرًا منذ ذلك الحين بطرق تجعل تكامل Pandas أكثر أهمية. لا يزال من الممكن توفيره إلى حد كبير بواسطة أغلفة تابعة لجهات خارجية.

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

  • يمكن لجميع الطرق نسخ الفهرس من الإدخال
  • يجب أن تخرج المحولات أعمدة ذات أسماء مناسبة
  • يمكن لـ توقع توقع_بروبا متعدد الفئات تسمية الأعمدة بأسماء الفئات

نعم ، من فوق رأسي:

  • يمكن أن يكون الفهرس مفيدًا حقًا ، على سبيل المثال لإنشاء متغيرات متأخرة بوقت (مثل تأخير يوم واحد ، على البيانات اليومية مع بعض الأيام المفقودة)
  • يمكن استخدام عوامل الانحدار sklearn بشفافية مع البيانات الفئوية (تمرير إطار البيانات المختلط ، وتحويل الأعمدة الفئوية باستخدام LabelBinarizer ، وتحويلها معكوسًا).
  • يوفر sklearn-pandas بالفعل واجهة لطيفة تسمح لك بتمرير إطار بيانات ، واستخدام مجموعة فرعية فقط من البيانات ، وتحويل الأعمدة الفردية بشكل تعسفي.

إذا كان هذا كله في حالة تحويل ، فلن يؤثر ذلك حقًا على كيفية عمل sklearn افتراضيًا.

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

في 22 أكتوبر 2015 الساعة 17:40 ، كتب naught101 [email protected] :

نعم ، من فوق رأسي:

  • يمكن أن يكون الفهرس مفيدًا حقًا ، على سبيل المثال لإنشاء تأخير زمني
    المتغيرات (مثل lag 1 day ، على البيانات اليومية مع بعض الأيام المفقودة)
  • يمكن استخدام عوامل الارتداد sklearn بشفافية مع البيانات الفئوية
    (قم بتمرير إطار البيانات المختلط ، وقم بتحويل الأعمدة الفئوية باستخدام LabelBinarizer ،
    inverse_transform ذلك مرة أخرى).
  • يوفر sklearn-pandas بالفعل واجهة لطيفة تتيح لك ذلك
    قم بتمرير إطار بيانات ، واستخدم فقط مجموعة فرعية من البيانات ، وبشكل تعسفي
    تحويل الأعمدة الفردية.

إذا كان هذا كله في تحول ، فلن يؤثر حقًا على كيفية تعلم sklearn
يعمل بشكل افتراضي.

-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/scikit-learn/scikit-learn/issues/5523#issuecomment -150123228
.

كان جعل "الباندا في" أفضل نوعًا من الفكرة وراء محول العمود PR # 3886. ربما كان عليّ أن ألقي نظرة فاحصة على ما يفعله sklearn-pandas بالفعل. لست متأكدًا تمامًا من أفضل طريقة للمضي قدمًا.

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

ذات الصلة # 4196

على الرغم من أنه سيتطلب عملية جراحية كبيرة مع التحقق من صحة الإدخال
يحفظ أسماء الأعمدة: - /

ليس فقط التحقق من صحة الإدخال: كل تحويل يجب أن يصف ما هو
يفعل لأعمدة الإدخال.

صحيح ، لكن أعتقد أنه سيكون لطيفًا ؛)

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

يمكنك دائمًا عمل خط أنابيب به شيء واحد فقط ، أليس كذلك؟ لذلك نحن _ نوع _ نتعامل مع جميع الحالات (على الرغم من أنه اختراق في حدود كائن واحد) عن طريق التقييد على خط الأنابيب فقط في البداية ...

+1. البدء بخط الأنابيب يبدو لطيفًا ، وقم بتغطية كل المحولات في الخطوة التالية.

لدي أيضًا أداة ضمنية مع تكامل الباندا و sklearn ، والتي يمكنها إرجاع معلومات الأعمدة عبر inverse_transform (الاختراق القذر رغم ذلك ...)

http://pandas-ml.readthedocs.org/en/latest/sklearn.html

• يمكن أن يكون الفهرس مفيدًا حقًا ، على سبيل المثال لإنشاء متغيرات متأخرة زمنيًا
(على سبيل المثال ، تأخر يوم واحد ، على البيانات اليومية مع فقدان بعض الأيام)

أنا غبي بعض الشيء ، لكنني لا أتحدث عن شيء ما في العينة
الاتجاه هنا ، بدلاً من اتجاه الميزة؟

• يمكن استخدام مسجلات الارتداد sklearn بشفافية مع البيانات الفئوية (تمرير
إطار بيانات مختلط ، قم بتحويل الأعمدة الفئوية باستخدام LabelBinarizer ، و
inverse_transform ذلك مرة أخرى).

• يوفر sklearn-pandas بالفعل واجهة لطيفة تسمح لك بتمرير ملف
dataframe ، واستخدم فقط مجموعة فرعية من البيانات ، وقم بالتحويل التعسفي
أعمدة فردية.

حسنًا ، ولكن هذا كله على مستوى محول واحد يأخذ Pandas في ،
ويعطي مصفوفة بيانات ، أليس كذلك؟ بدلاً من محاولة أ
التعديل على جميع كائنات scikit-Learn (وهو أمر محفوف بالمخاطر
مسعى) ، يمكننا أولاً تنفيذ هذا المحول (أعتقد ذلك
amueller لديه هذا في ذهنه).

عينة الاتجاه هنا ، بدلا من اتجاه الميزة؟

نعم.

حسنًا ، ولكن هذا كله على مستوى محول واحد يأخذ Pandas ويعطي مصفوفة بيانات ، أليس كذلك؟

نعم ، هذا ما كنت أفكر في البدء به. سأكون أكثر من سعيد بالغلاف الذي تعامل مع X و y كإطارات بيانات. لا أرى سببًا واضحًا للإفساد في العناصر الداخلية لـ sklearn.

OK, but that's all at the level of one transformer that takes Pandas in,
and gives a data matrix out, isn't it?

نعم ، هذا ما كنت أفكر في البدء به. سأكون أكثر من سعيد مع
غلاف يتعامل مع X و y كأطر بيانات. لا أرى سببا واضحا
للتغلب على الأجزاء الداخلية في sklearn.

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

الشيء الآخر الذي سيكون لطيفًا هو الاحتفاظ بأسماء الأعمدة في عمليات التحويل / تحديدها عند اختيار الميزة. لا أجد المشكلة حيث ناقشنا هذا الآن.

5172

ملاحظة: لقد تساءلت عما إذا كان المرء يرغب فقط في لف المقدر الخارجي في مجموعة لتوفير هذه الوظيفة للمستخدم. أعتقد أن الإجابة هي: لا ، يريد المرء أن يلتف المحولات الذرية أيضًا ، للسماح للمحولات المدركة لإطار البيانات داخل خط أنابيب (لماذا لا؟). بدون تنفيذ هذا كمزيج ، أعتقد أنك ستواجه مشكلات في إضافة المعلمات غير الضرورية أو مشاكل الاستنساخ (كما في # 5080).

: +1:

أردت فقط التخلص من الحل الذي أستخدمه:

def check_output(X, ensure_index=None, ensure_columns=None):
    """
    Joins X with ensure_index's index or ensure_columns's columns when avaialble
    """
    if ensure_index is not None:
        if ensure_columns is not None:
            if type(ensure_index) is pd.DataFrame and type(ensure_columns) is pd.DataFrame:
                X = pd.DataFrame(X, index=ensure_index.index, columns=ensure_columns.columns)
        else:
            if type(ensure_index) is pd.DataFrame:
                X = pd.DataFrame(X, index=ensure_index.index)
    return X

ثم أقوم بإنشاء أغلفة حول مقدرات sklearn التي تستدعي هذه الوظيفة على ناتج التحويل ، على سبيل المثال ،

from sklearn.preprocessing import StandardScaler as _StandardScaler 
class StandardScaler(_StandardScaler):
    def transform(self, X):
        Xt = super(StandardScaler, self).transform(X)
        return check_output(Xt, ensure_index=X, ensure_columns=X)

يمكن للمصنفات التي تحتاج إلى استخدام فهرس إطار بيانات الإدخال X فقط استخدام فهرسها (مفيد للسلاسل الزمنية كما تمت الإشارة إليه).

يتميز هذا النهج بأنه متوافق تمامًا مع تصميم sklearn الحالي مع الحفاظ أيضًا على سرعة الحساب (العمليات الحسابية والفهرسة على أطر البيانات أبطأ بمقدار 10x من المصفوفات غير المعقدة ، http://penandpants.com/2014/09/05 / أداء الباندا سلسلة مقابل صفائف numpy /). لسوء الحظ ، هناك الكثير من العمل الشاق لإضافته إلى كل مقدر يمكنه الاستفادة منه.

ربما يكون من الضروري فقط إنشاء متغير خط أنابيب بهذا السحر ...

في 15 يناير 2016 الساعة 02:30 ، كتب Dean Wyatte [email protected] :

أردت فقط التخلص من الحل الذي أستخدمه:

def check_output (X، sure_index = None، insurance_columns = لا شيء):
""
ينضم إلى X مع فهرس sure_index أو أعمدة التأكد من الأعمدة عند توفرها
""
إذا لم يتم التأكد من أن الفهرس بلا:
إذا لم يتم التأكد من عدم وجود أعمدة:
إذا كان النوع (sure_index) هو pd.DataFrame واكتب (sure_columns) هو pd.DataFrame:
X = pd.DataFrame (X ، index = definitely_index.index ، عمود = insurance_columns.columns)
آخر:
إذا كان النوع (sure_index) هو pd.DataFrame:
X = pd.DataFrame (X، index = definitely_index.index)
إرجاع X

ثم أقوم بإنشاء أغلفة حول مقدرات sklearn التي تسمي هذه الوظيفة
على ناتج التحويل ، على سبيل المثال ،

من sklearn.preprocessing استيراد StandardScaler كـ _StandardScaler
فئة MinMaxScaler (_MinMaxScaler):
تحويل def (ذاتي ، X):
Xt = سوبر (MinMaxScaler ، ذاتي). تحويل (X)
إرجاع check_output (Xt ، insurance_index = X ، insurance_columns = X)

يمكن للمصنفات التي تحتاج إلى استخدام فهرس إطار بيانات الإدخال X فقط
استخدام الفهرس الخاص به (مفيد للسلاسل الزمنية كما تمت الإشارة إليه).

هذا النهج له فائدة كونه متوافقًا تمامًا مع
تصميم sklearn الموجود مع الحفاظ أيضًا على سرعة الحساب
(العمليات الحسابية والفهرسة على أطر البيانات أبطأ بمقدار 10x من numpy
المصفوفات). لسوء الحظ ، هناك الكثير من العمل الشاق لإضافته إلى كل مقدر
يمكن أن تستفيد منه.

-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub
https://github.com/scikit-learn/scikit-learn/issues/5523#issuecomment -171674105
.

أو مجرد شيء يلف الأنبوب / المقدر ، أليس كذلك؟

لا أفهم حقًا سبب استدعاء وظيفة مثل هذه "check_ *" عندما تقوم بأكثر من مجرد التحقق من خلال ...

في 14 كانون الثاني (يناير) 2016 ، الساعة 10:45:44 صباحًا بتوقيت وسط أمريكا ، كتب Joel Nothman [email protected] :

ربما يكون من الضروري فقط إنشاء متغير خط أنابيب بهذا السحر ...

في 15 يناير 2016 الساعة 02:30 ، Dean Wyatte [email protected]
كتب:

أردت فقط التخلص من الحل الذي أستخدمه:

def check_output (X، sure_index = None، insurance_columns = لا شيء):
""
ينضم إلى X مع فهرس sure_index أو أعمدة warranty_columns
عندما تكون متاحة
""
إذا لم يتم التأكد من أن الفهرس بلا:
إذا لم يتم التأكد من عدم وجود أعمدة:
إذا كان النوع (sure_index) هو pd.DataFrame و
النوع (sure_columns) هو pd.DataFrame:
X = pd.DataFrame (X، index = definitely_index.index،
الأعمدة = sure_columns.columns)
آخر:
إذا كان النوع (sure_index) هو pd.DataFrame:
X = pd.DataFrame (X، index = definitely_index.index)
إرجاع X

ثم أقوم بإنشاء أغلفة حول مقدرات sklearn تسمي هذا
وظيفة
على ناتج التحويل ، على سبيل المثال ،

من sklearn.preprocessing استيراد StandardScaler كـ _StandardScaler
فئة MinMaxScaler (_MinMaxScaler):
تحويل def (ذاتي ، X):
Xt = سوبر (MinMaxScaler ، ذاتي). تحويل (X)
إرجاع check_output (Xt ، insurance_index = X ، insurance_columns = X)

يمكن للمصنفات التي تحتاج إلى استخدام فهرس إطار بيانات الإدخال X.
مجرد
استخدام الفهرس الخاص به (مفيد للسلاسل الزمنية كما تمت الإشارة إليه).

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

-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub

https://github.com/scikit-learn/scikit-learn/issues/5523#issuecomment -171674105
.


قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub:
https://github.com/scikit-learn/scikit-learn/issues/5523#issuecomment -171697542

مُرسَل من جهازي الذي يعمل بنظام Android مع K-9 Mail. عذرا على الاختصار.

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

هل دائمًا ما يتم حفظ n_rows لجميع المصفوفات أثناء التحويل؟ إذا كان الأمر كذلك ، فإن مجرد توريث فهرس الإدخال (إن وجد) يبدو آمنًا ، لكنني لست متأكدًا من أن الحصول على إطار بيانات بأسماء أعمدة افتراضية (على سبيل المثال ، [0 ، 1 ، 2 ، 3 ، ...]) أفضل من السلوك الحالي من منظور المستخدم النهائي ، ولكن إذا تم استخدام غلاف واضح / مقدر ميتا ، فسيعرف المستخدم على الأقل ما يمكن توقعه.

أيضًا ، وافقت على أن check_ * اسم ضعيف - كنت أقوم بإجراء المزيد من التحقق من الصحة في وظيفتي ، وقمت للتو بتجريد منطق إطار البيانات للنشر هنا.

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

يجب أن تخرج المحولات أعمدة ذات أسماء مناسبة

على الرغم من أنه سيتطلب عملية جراحية كبيرة مع التحقق من صحة الإدخال للحفاظ على أسماء الأعمدة: - / amueller

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

هل فكر أحد في آليات كيفية تمرير الأسماء ، من المحولات إلى المحولات ، وربما كيفية تتبع المصدر؟ أين يمكن تخزين هذا؟

يعاني صديق لي ،

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

ثم توصلنا أيضًا إلى فكرة تعديل خط الأنابيب لتتبع ذلك ، يجب عليك تغيير _fit () و _transform () وربما بعض الأشياء الأخرى. يبدو أن هذا هو أفضل خيار لدينا.

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

انظر # 6425 للفكرة الحالية.

كل ما تريده هو تعيين لكل محول (بما في ذلك خط أنابيب
محولات) ، من أسماء ميزات الإدخال إلى أسماء ميزات الإخراج (أو بعضها
التمثيل المنظم للتحولات ، التي أظن أنها أكثر
الهندسة مما سنحصل عليه). هذا ما يوفره # 6425.

في 8 أكتوبر 2016 الساعة 03:42 ، Andreas Mueller [email protected]
كتب:

راجع # 6425 https://github.com/scikit-learn/scikit-learn/issues/6425 من أجل
الفكرة الحالية.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/scikit-learn/scikit-learn/issues/5523#issuecomment -252301608 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AAEz65fBsMwqmkDq3DEjMSUC-W-nfn9zks5qxnZxgaJpZM4GThGc
.

سوف ننظر في هذا ، شكرا لك!

هل يمكن لأحد أن يقدم تحديثًا عامًا عن حالة العالم التي كتب عنها هذا الموضوع؟

هل سيكون دعم الباندا DataFrame دائمًا شيئًا من YMMV؟
سيكون من المفيد تقديم إرشادات حول ما يعتبر / لا يعتبر آمنًا للاستخدام مع الباندا DataFrame بدلاً من ndarray . ربما يكون هناك شيء على غرار ما يلي (MADE UP EXAMPLE TABLE):

وحدة / فئة | يمكن أن تستهلك Pandas DataFrame بأمان
- | -
sklearn.pipeline | آمن
sklearn.feature_selection | آمن
المنحدرات | YMMV
sklearn.feature_extraction | ليست آمنة ، لا توجد خطة للتنفيذ
إلخ | ...

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

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

كانت عملية تفكيري الأولية هي إنشاء كائن خط أنابيب بديل يمكنه استهلاك الباندا DataFrame الذي تم إنشاؤه تلقائيًا لمكونات scikit-Learn القياسية لتحويل المدخلات / المخرجات DataFrame كائنات إلى عدد ndarray كائنات حسب الضرورة. بهذه الطريقة يمكنني كتابة المحددات / المحولات المخصصة الخاصة بي حتى أتمكن من الاستفادة من الباندا DataFrame البدائيين ، لكن هذا يبدو صعبًا بعض الشيء. خاصة إذا كنا على أعتاب الحصول على دعم "رسمي" لهم.

لقد كنت أتابع عددًا قليلاً من العلاقات العامة المختلفة ، ولكن من الصعب معرفة أي منها تم التخلي عنه و / أو يعكس التفكير الحالي:
مثال:

6425 (تمت الإشارة إليه في أكتوبر 2016 أعلاه في هذا الموضوع)

9012 (تداخلات واضحة مع sklearn-pandas ، ولكن تم شرحها على أنها تجريبية؟)

3886 (حلت محلها # 9012؟)

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

أعتقد أن أي مقدر scikit-Learn يعيد إطار بيانات لأي عملية غير تافهة (أو ربما حتى تافهة) هو شيء قد لا يحدث أبدًا (على الرغم من رغبته في ذلك).

9012 سيحدث وسيصبح مستقرًا ، والعلاقات العامة هي التكرار الأول (أو التكرار العاشر ، إذا كنت تحسب التكرارات غير المدمجة ؛)

من المحتمل أن يحدث 6425 ، على الرغم من أنه لا يرتبط تمامًا بالباندا.

3886 هو بالفعل محل رقم 9012

يتم تنفيذ الوظيفة # 6425 حاليًا (لبعض المحولات و
قابلة للتوسيع للآخرين) عبر singledispatch in
https://codecov.io/gh/TeamHG-Memex/eli5 لما يستحق.

في 21 يونيو 2017 الساعة 13:25 ، كتب Andreas Mueller [email protected] :

9012 https://github.com/scikit-learn/scikit-learn/pull/9012 سوف

يحدث وسيصبح مستقرًا ، العلاقات العامة هي التكرار الأول.

6425 https://github.com/scikit-learn/scikit-learn/issues/6425 هو

من المحتمل أن يحدث ، على الرغم من أنه لا يرتبط تمامًا بالباندا.

3886 https://github.com/scikit-learn/scikit-learn/pull/3886 هو بالفعل

حل محله # 9012
https://github.com/scikit-learn/scikit-learn/pull/9012

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/scikit-learn/scikit-learn/issues/5523#issuecomment-309952467 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AAEz61lgGBW1AoukPm_87elBjF2NGOUwks5sGI0-gaJpZM4GThGc
.

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

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

أعتقد أن هذا جيد بما فيه الكفاية بالنسبة لنا.

نحن نستخدم خط أنابيب من المكونات المخصصة (أغلفة رفيعة حول الأدوات الحالية غير الملائمة لخطوط الأنابيب) لتحويل الأنواع المختلطة (سلاسل ، وعوامات ، و ints) إلى عوامات عبر الترميز / القياس قبل الوصول إلى مكونات scikit-Learn مثل المحددات أو النماذج.

جميع المحولات الخاصة بي ترجع DataFrame s عند إعطائها DataFrame s.
عندما أقوم بإدخال 300 عمود DataFrame في Pipeline واستلم 500 عمود ndarray ، لا يمكنني تعلم الكثير منه بشكل فعال ، على سبيل المثال ، feature_selection ، لأنه ليس لدي أسماء الأعمدة بعد الآن. إذا أخبرني ، على سبيل المثال ، mutual_info_classif أن العمودين 30 و 75 فقط هما المهمان ، فلا يمكنني معرفة كيفية تبسيط Pipeline الأصلي للإنتاج.
وبالتالي ، من المهم بالنسبة لحالة الاستخدام الخاصة بي الاحتفاظ ببياناتي DataFrame .
شكرا لك.

@ sam-s أتفق تماما. في المدى "القصير" ، ستتم معالجة ذلك من خلال https://github.com/scikit-learn/scikit-learn/pull/13307 و https://github.com/scikit-learn/enhancement_proposals/pull/18

لن تحصل على إطار بيانات الباندا ، ولكن ستحصل على اسم العمود لإنشاء واحد.

هل يمكنك إعطاء مثال أكثر واقعية ، مع ذلك؟ لأنه في حالة إرجاع جميع المحولات DataFrames ، يجب أن تعمل الأشياء (أو يتم إجراؤها للعمل بسهولة أكبر من المقترحات أعلاه).

تحديث طفيف عبر https://github.com/pandas-dev/pandas/issues/27211
مما يثبط آمالي. يبدو أننا لا نستطيع الوثوق في وجود رحلة ذهابًا وإيابًا بدون نسخ ، وبالتالي فإن التفافها وتفكيكها في الباندا سيؤدي إلى تكلفة باهظة.

تحديث طفيف عبر pandas-dev / pandas # 27211 مما يثبط آمالي. يبدو أننا لا نستطيع الوثوق في وجود رحلة ذهابًا وإيابًا بدون نسخ ، وبالتالي فإن التفافها وتفكيكها في الباندا سيؤدي إلى تكلفة باهظة.

نعم ، ولكن أعتقد أنه بمجرد تغطية الميزة وعينة الدعائم (أسماء الصفوف و "المؤشرات" كعينة نموذجية) ، سيتم تغطية معظم حالات الاستخدام ذات الصلة التي تحتاج نوعًا ما من الباندا الآن ، أليس كذلك؟

adrinjalali لست متأكدًا مما تقصده بعبارة "معظم حالات الاستخدام ذات الصلة بحاجات الباندا كيندا". لم أر هذه المشكلة في المقام الأول على أنها دعم الباندا لتنفيذ الميزات داخل scikit-Learn ، ولكن لجعل scikit-Learn يندمج بسهولة أكبر في سير العمل القائم على الباندا.

بدافع الفضول فقط ، هل هناك إطار زمني يُتوقع أن يصل خلاله توافق Pandas المحسن؟ أنا مهتم على وجه التحديد بـ Pandas in -> Pandas out for StandardScaler .

لدي حالة استخدام حيث أحتاج إلى الحفاظ على إطارات بيانات الباندا من خلال كل خطوة في Pipeline . على سبيل المثال ، خط أنابيب يحتوي على 1) ميزات ترشيح خطوة اختيار الميزة استنادًا إلى البيانات ، 2) خطوة تحويل البيانات ، 3) خطوة أخرى لاختيار الميزة للتصفية لأسماء أعمدة ميزة معينة أو مؤشرات أصلية ، 4) التوحيد ، 5) التصنيف.

الخطوة 3) أعتقد أنه غير ممكن حاليًا في sklearn ، حتى مع إدخال مصفوفة صغيرة ، لأن مؤشرات الميزات الأصلية لا معنى لها عندما تصل البيانات إلى 3) لأنه في 1) كانت هناك خطوة لاختيار الميزة. إذا تم الاحتفاظ بإطارات بيانات الباندا في خط الأنابيب ، فسيعمل ذلك لأنه يمكنني التصفية حسب اسم العمود في 3).

هل أنا مخطئ في التفكير في أنه لا توجد حاليًا طريقة للقيام بذلك حتى مع إدخال مصفوفة معقدة؟

أنت محق في أنه غير مدعوم ، وأن دعمه لن يكون تافهًا. فيما يتعلق بحالة الاستخدام الخاصة بك ، نحن نعمل على تمرير أسماء الميزات على طول خط الأنابيب (كما ترى في العلاقات العامة والمقترحات أعلاه). نأمل أن يساعد ذلك في قضيتك بمجرد الانتهاء. لست متأكدًا مما إذا كان سيساعدك ، ولكن يمكنك أيضًا إلقاء نظرة على https://github.com/scikit-learn-contrib/sklearn-pandas

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

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

لست متأكدًا مما إذا كان سيساعدك ، ولكن يمكنك أيضًا إلقاء نظرة على https://github.com/scikit-learn-contrib/sklearn-pandas

قرأت سابقًا مستنداتهم وربما لا أراها ولكن معظم (أو كل) ميزاتهم أصبحت قديمة الآن في scikit-Learn 0.21 مع sklearn.compose.ColumnTransformer ؟ كما لا يبدو أنهم يدعمون الباندا في الخارج يبدو وكأنه مصفوفات معقدة بعد التحولات.

(أتساءل عما إذا كان دعم Pandas في اختيار الميزة سينقطع
كثير...)

مجرد التحقق من الرمز لفترة وجيزة ، هناك جميع أنواع عمليات التحقق التي تحدث بشكل تعسفي في العديد من الأماكن ، باستخدام على سبيل المثال https://github.com/scikit-learn/scikit-learn/blob/939fa3cccefe708db7a81c5248db32a1d600bf8d/sklearn/utils/validation.py# L619

بالإضافة إلى أن العديد من العمليات تستخدم الفهرسة بطريقة غير دقيقة والتي لن تقبلها pandas dataframe.

سيكون إبقاء الباندا داخل / خارج أمرًا ضروريًا بالنسبة إلى IMO لعلوم البيانات اليومية ، ولكن يبدو أن scikit-Learn مصمم بطريقة تجعل من الصعب تنفيذها.

سيكون إبقاء الباندا داخل / خارج أمرًا ضروريًا لعلوم البيانات اليومية IMO ، ولكن
يبدو أن برنامج scikit-Learn مصمم بطريقة تجعل الأمر صعبًا
منفذ.

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

التعلم الآلي هو في الغالب عدد متعدد المتغيرات.

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

يجب أن يترك هذا القرار للمستخدم؟ من واقع خبرتي في استخدام scikit-Learn على نطاق واسع خلال العامين الماضيين ، أعتقد أن وظيفتين أساسيتين ومهمتين مفقودتين ويجب توفرهما لكثير من حالات استخدام ML هما دعم تمرير البيانات الوصفية للعينة والميزات. يعد الدعم الكامل لإطار بيانات الباندا طريقة طبيعية وأنيقة للتعامل مع بعض من هذا.

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

يجب أن يترك هذا القرار للمستخدم؟

حسنًا ، لا يقوم المستخدم بتنفيذ الخوارزمية.

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

mlr3 في R ، وأطر البيانات مختلفة تمامًا عن إطار بيانات الباندا.
ربما هذا يجعله أسهل في التنفيذ.

أوافق على تقديم دعم أفضل لأسماء الميزات والبيانات غير المتجانسة
أنواع مهمة. نحن نعمل على إيجاد حلول تقنية جيدة
التي لا تؤدي إلى فقدان الأداء والتعليمات البرمجية المعقدة بشكل مفرط.

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

أعتقد أن نهجك في التمسك بالمصفوفات غير الدقيقة وعلى الأقل دعم تمرير أسماء الميزات أو حتى البيانات الوصفية للميزات المتعددة الأفضل ستعمل مع العديد من حالات الاستخدام. لاجتياز نموذج البيانات الوصفية للتدريب ، فأنت تدعمها بالفعل بـ **fit_params وأعلم أن هناك جهدًا لتحسين التصميم. لكنني ذكرت في https://github.com/scikit-learn/enhancement_proposals/pull/16 أن هناك حالات استخدام حيث ستحتاج أيضًا إلى اختبار عينة البيانات الوصفية التي تم تمريرها إلى طرق transform وهذا غير مدعوم حاليًا .

mlr3 في R ، وأطر البيانات مختلفة تمامًا عن إطار بيانات الباندا.

عادة ما يكون العلماء الحسابيون في أبحاث علوم الحياة مرتاحين جدًا لكل من Python و R ويستخدمونهما معًا (بما في ذلك أنا). أنا متأكد من أن نسبة كبيرة من قاعدة مستخدمي scikit-Learn هم باحثون في علوم الحياة.

لا تقترب مكتبات ML الناضجة المتوفرة حاليًا في R IMHO من scikit-Learn من حيث توفير واجهة برمجة تطبيقات جيدة التصميم وجعل الأجزاء المفيدة من ML واضحة جدًا (خطوط الأنابيب ، البحث عن المعلمات الفائقة ، التسجيل ، إلخ) بينما في R مع هذه المكتبات ، يجب عليك ترميزها بنفسك. لكن mlr3 أرى أنها منافسة كبيرة مستقبلية لـ scikit-Learn حيث أنهم يصممونها من الألف إلى الياء بالطريقة الصحيحة.

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

ربما أفتقد شيئًا ما ، لكن ألن يكون من الممكن إلغاء تغليف إطار البيانات (باستخدام df.values ) ، قم بإجراء العمليات الحسابية ثم الالتفاف مرة أخرى إلى DataFrame جديد؟

هذا هو ما أفعله يدويًا بين الخطوات ، والشيء الوحيد الذي يمنع استخدام Pipeline .

ربما أفتقد شيئًا ما ، لكن ألن يكون من الممكن فك غلاف
DataFrame (باستخدام df.values) ، قم بإجراء العمليات الحسابية ثم التفت مرة أخرى إلى ملف
داتافريم؟

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

بشكل عام لا: قد لا يعمل (أعمدة غير متجانسة)

أعتقد أن محولات العمود ومثل هذه يمكنها التعامل معها بشكل دلالي.

سيؤدي إلى نسخ كثيرة من الذاكرة.

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

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

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

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

سيكون الأمر متروكًا للمستخدم ليقرر عدم استخدام سير العمل هذا عند تحسين الأداء.

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

لذلك نحن بحاجة إلى اتخاذ بعض الحذر هنا. لكننا بحاجة إلى الاستمرار في الحل
هذا كأولوية عالية.

أعتقد أن أفضل حل هو دعم إطارات بيانات الباندا للداخل والخارج للعينة وخصائص الميزة وتمريرها وتقطيعها بشكل صحيح في القطار واختبار الملاءمة / التحويل. من شأن ذلك أن يحل معظم حالات الاستخدام مع الحفاظ على سرعة مصفوفة البيانات X كمصفوفات فارغة.

إحدى النقاط المهمة المفقودة من هذه الوسيطات هي أن حيوانات الباندا تتحرك نحو التمثيل العمودي للبيانات ، بطريقة أن np.array(pd.DataFrame(numpy_data)) ستحتوي على نسختين _ مضمونة_ من الذاكرة. لهذا السبب ليس الأمر سهلاً مثل مجرد الاحتفاظ بإطار البيانات واستخدام values كلما احتجنا إلى السرعة.

إحدى النقاط المهمة المفقودة من هذه الوسيطات هي أن حيوانات الباندا تتحرك نحو التمثيل العمودي للبيانات ، بطريقة أن np.array(pd.DataFrame(numpy_data)) ستحتوي على نسختين _ مضمونة_ من الذاكرة. لهذا السبب ليس الأمر سهلاً مثل مجرد الاحتفاظ بإطار البيانات واستخدام values كلما احتجنا إلى السرعة.

آمل أن أكون واضحا في رسالتي السابقة. أعتقد أن scikit-Learn لا تحتاج حاليًا إلى دعم إطارات بيانات الباندا لبيانات X ، فاحتفظ بها كمصفوفات سريعة ومكتوبة. ولكن ما يمكن أن يحل العديد من حالات الاستخدام هو الدعم الكامل من خلال إطار عمل إطارات بيانات الباندا للبيانات الوصفية ، أي خصائص العينة وخصائص الميزة. لا ينبغي أن يكون هذا عبئًا على الأداء حتى بالنسبة لنسخ الذاكرة لأن بنيتي البيانات هاتين ستكونان ثانويتين مقارنةً بـ X ولن يتم فعلاً سوى التقسيم الجزئي لهذه النسخ.

نعم ، تساعد هذه التغييرات في العديد من حالات الاستخدام ، ونحن نعمل على حلها. لكن هذه المشكلة تتجاوز ذلك: https://github.com/scikit-learn/scikit-learn/issues/5523#issuecomment -508807755

hermidalc هل تقترح أن نسمح لـ X أن يكون مصفوفة عددية ، ونقوم بتعيين البيانات الوصفية في كائن (كائنات) dataframe الأخرى؟

hermidalc هل تقترح أن نسمح لـ X أن يكون مصفوفة عددية ، ونقوم بتعيين البيانات الوصفية في كائن (كائنات) dataframe الأخرى؟

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

لقد قرأت عن هذه المشكلة ويبدو أن هناك نوعان من الحاصرات الرئيسية هنا:

  1. https://github.com/pandas-dev/pandas/issues/27211
  2. لا يتعامل هذا الباندا مع مصفوفات ND.

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

X = np.arange(10).reshape(5, 2)
assert np.asarray(xr.DataArray(X)) is X
assert np.asarray(xr.Dataset({"data": (("samples", "features"), X)}).data).base is X.base

هناك حزمة تسمى sklearn-xarray : https://phausamann.github.io/sklearn-xarray/content/wrappers.html التي تغلف مقدرات scikit للتعامل مع xarrays كمدخلات ومخرجات ولكن يبدو أن ذلك لم يتم الحفاظ عليه من أجل سنوات. ومع ذلك ، أتساءل عما إذا كانت الأغلفة هي السبيل للذهاب إلى هنا.

xarray قيد النظر بنشاط. يتم وضع نموذج أولي له والعمل عليه هنا: https://github.com/scikit-learn/scikit-learn/pull/16772 هناك دفتر ملاحظات للاستخدام على شكل واجهة برمجة التطبيقات في العلاقات العامة.

(سأعود إليه بعد أن ننتهي بإصدار 0.23)

أنا أيضًا مهتم جدًا بهذه الميزة.
من شأنه أن يحل مشاكل لا حصر لها. هذا هو الحل الذي أستخدمه حاليًا.
لقد كتبت غلافًا حول الوحدة النمطية sklearn.preprocessing ، والتي أسميتها sklearn_wrapper

لذا فبدلاً من الاستيراد من sklearn.preprocessing أستورد من sklearn_wrapper .
على سبيل المثال:

# this
from sklearn.preprocessing import StandardScaler 
# becomes 
from sklearn_wrapper import StandardScaler

أدناه تنفيذ هذه الوحدة. جربه واسمحوا لي أن أعرف ما هو رأيكم يا رفاق

from functools import wraps
from itertools import chain

import pandas as pd
from sklearn import preprocessing, compose, feature_selection, decomposition
from sklearn.compose._column_transformer import _get_transformer_list

modules = (preprocessing, feature_selection, decomposition)


def base_wrapper(Parent):
    class Wrapper(Parent):

        def transform(self, X, **kwargs):
            result = super().transform(X, **kwargs)
            check = self.check_out(X, result)
            return check if check is not None else result

        def fit_transform(self, X, y=None, **kwargs):
            result = super().fit_transform(X, y, **kwargs)
            check = self.check_out(X, result)
            return check if check is not None else result

        def check_out(self, X, result):
            if isinstance(X, pd.DataFrame):
                result = pd.DataFrame(result, index=X.index, columns=X.columns)
                result = result.astype(X.dtypes.to_dict())
            return result

        def __repr__(self):
            name = Parent.__name__
            tmp = super().__repr__().split('(')[1]
            return f'{name}({tmp}'

    Wrapper.__name__ = Parent.__name__
    Wrapper.__qualname__ = Parent.__name__

    return Wrapper


def base_pca_wrapper(Parent):
    Parent = base_wrapper(Parent)

    class Wrapper(Parent):
        @wraps(Parent)
        def __init__(self, *args, **kwargs):
            self._prefix_ = kwargs.pop('prefix', 'PCA')
            super().__init__(*args, **kwargs)

        def check_out(self, X, result):
            if isinstance(X, pd.DataFrame):
                columns = [f'{self._prefix_}_{i}' for i in range(1, (self.n_components or X.shape[1]) + 1)]
                result = pd.DataFrame(result, index=X.index, columns=columns)
            return result

    return Wrapper


class ColumnTransformer(base_wrapper(compose.ColumnTransformer)):

    def check_out(self, X, result):
        if isinstance(X, pd.DataFrame):
            return pd.DataFrame(result, index=X.index, columns=self._columns[0]) if self._remainder[1] == 'drop' \
                else pd.DataFrame(result, index=X.index, columns=X.columns). \
                astype(self.dtypes.iloc[self._remainder[-1]].to_dict())


class SelectKBest(base_wrapper(feature_selection.SelectKBest)):

    def check_out(self, X, result):
        if isinstance(X, pd.DataFrame):
            return pd.DataFrame(result, index=X.index, columns=X.columns[self.get_support()]). \
                astype(X.dtypes[self.get_support()].to_dict())


def make_column_transformer(*transformers, **kwargs):
    n_jobs = kwargs.pop('n_jobs', None)
    remainder = kwargs.pop('remainder', 'drop')
    sparse_threshold = kwargs.pop('sparse_threshold', 0.3)
    verbose = kwargs.pop('verbose', False)
    if kwargs:
        raise TypeError('Unknown keyword arguments: "{}"'
                        .format(list(kwargs.keys())[0]))
    transformer_list = _get_transformer_list(transformers)
    return ColumnTransformer(transformer_list, n_jobs=n_jobs,
                             remainder=remainder,
                             sparse_threshold=sparse_threshold,
                             verbose=verbose)


def __getattr__(name):
    if name not in __all__:
        return

    for module in modules:
        Parent = getattr(module, name, None)
        if Parent is not None:
            break

    if Parent is None:
        return

    if module is decomposition:
        Wrapper = base_pca_wrapper(Parent)
    else:
        Wrapper = base_wrapper(Parent)

    return Wrapper


__all__ = [*[c for c in preprocessing.__all__ if c[0].istitle()],
           *[c for c in decomposition.__all__ if c[0].istitle()],
           'SelectKBest']


def __dir__():
    tmp = dir()
    tmp.extend(__all__)
    return tmp

قدم https://github.com/koaning/scikit-lego/issues/304 حلاً آخر عن طريق التثبيت السريع على sklearn.pipeline.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات