1.13. اختيار الميزات#

يمكن استخدام الفئات في وحدة sklearn.feature_selection لـ اختيار الميزات / تقليل الأبعاد على مجموعات العينات، إما لـ تحسين درجات دقة المُقدِّرات أو لتعزيز أدائها على مجموعات البيانات عالية الأبعاد للغاية.

1.13.1. إزالة الميزات ذات التباين المنخفض#

VarianceThreshold هو نهج أساسي بسيط لاختيار الميزات. إنه يُزيل جميع الميزات التي لا يُلبي تباينها عتبة مُعينة. افتراضيًا، يُزيل جميع الميزات ذات التباين الصفري، أي الميزات التي لها نفس القيمة في جميع العينات.

على سبيل المثال، لنفترض أن لدينا مجموعة بيانات ذات ميزات منطقية، ونُريد إزالة جميع الميزات التي تكون إما واحدًا أو صفرًا (مُشغَّلة أو مُطفأة) في أكثر من 80% من العينات. الميزات المنطقية هي متغيرات عشوائية برنولي، ويتم إعطاء تباين هذه المتغيرات بواسطة

\[\mathrm{Var}[X] = p(1 - p)\]

حتى نتمكن من الاختيار باستخدام العتبة .8 * (1 - .8):

>>> from sklearn.feature_selection import VarianceThreshold
>>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
>>> sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
>>> sel.fit_transform(X)
array([[0, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 0],
       [1, 1]])

كما هو مُتوقع، أزال VarianceThreshold العمود الأول، الذي يحتوي على احتمال \(p = 5/6 > .8\) لاحتواء صفر.

1.13.2. اختيار الميزات أحادية المتغير#

يعمل اختيار الميزات أحادية المتغير عن طريق اختيار أفضل الميزات بناءً على الاختبارات الإحصائية أحادية المتغير. يمكن اعتباره خطوة مُعالجة مُسبقة لمُقدِّر. يُظهِر Scikit-learn إجراءات اختيار الميزات ككائنات تُطبق أسلوب transform:

  • SelectKBest يُزيل كل شيء باستثناء \(k\) أعلى الميزات درجة

  • SelectPercentile يُزيل كل شيء باستثناء أعلى نسبة مُحددة من قبل المستخدم من الميزات درجة

  • استخدام الاختبارات الإحصائية أحادية المتغير الشائعة لكل ميزة: مُعدل الإيجابيات الخاطئة SelectFpr، مُعدل الاكتشاف الخاطئ SelectFdr، أو خطأ العائلة الحكيم SelectFwe.

  • GenericUnivariateSelect يسمح بإجراء اختيار ميزات أحادي المتغير باستخدام إستراتيجية قابلة للتكوين. هذا يسمح باختيار أفضل إستراتيجية اختيار أحادي المتغير باستخدام مُقدِّر بحث المعلمات الفائقة.

على سبيل المثال، يمكننا استخدام اختبار F لاسترداد الاثنين من أفضل الميزات لمجموعة بيانات على النحو التالي:

>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import f_classif
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> X_new = SelectKBest(f_classif, k=2).fit_transform(X, y)
>>> X_new.shape
(150, 2)

تأخذ هذه الكائنات كمدخلات دالة تسجيل تُعيد درجات أحادية المتغير وقيم p (أو درجات فقط لـ SelectKBest و SelectPercentile):

تُقدِّر الأساليب القائمة على اختبار F درجة التبعية الخطية بين متغيرين عشوائيين. من ناحية أخرى، يمكن لأساليب المعلومات المتبادلة التقاط أي نوع من التبعية الإحصائية، ولكن نظرًا لكونها غير بارامترية، فإنها تتطلب المزيد من العينات للتقدير الدقيق. لاحظ أنه يجب تطبيق اختبار \(\chi^2\) فقط على الميزات غير السالبة، مثل الترددات.

تحذير

احذر من عدم استخدام دالة تسجيل انحدار مع مشكلة تصنيف، ستحصل على نتائج غير مُجدية.

ملاحظة

يدعم SelectPercentile و SelectKBest اختيار الميزات غير الخاضع للإشراف أيضًا. يحتاج المرء إلى توفير score_func حيث y = None. يجب أن تستخدم score_func داخليًا X لحساب الدرجات.

أمثلة

1.13.3. إزالة الميزات التكراري#

بالنظر إلى مُقدِّر خارجي يُعيِّن أوزانًا للميزات (على سبيل المثال، معاملات نموذج خطي)، فإن هدف إزالة الميزات التكراري (RFE) هو تحديد الميزات عن طريق النظر بشكل متكرر في مجموعات أصغر وأصغر من الميزات. أولاً، يتم تدريب المُقدِّر على المجموعة الأولية من الميزات و يتم الحصول على أهمية كل ميزة إما من خلال أي سمة مُحددة (مثل coef_ أو feature_importances_) أو دالة قابلة للاستدعاء. ثم، يتم تشذيب أقل الميزات أهمية من المجموعة الحالية من الميزات. يتم تكرار هذا الإجراء بشكل متكرر على المجموعة المُشذَّبة حتى يتم الوصول إلى العدد المطلوب من الميزات التي سيتم تحديدها في النهاية.

RFECV يُجري RFE في حلقة تحقق متبادل للعثور على العدد الأمثل للميزات. بمزيد من التفصيل، يتم ضبط عدد الميزات المحددة تلقائيًا عن طريق ملاءمة مُحدد RFE على تقسيمات التحقق المتبادل المختلفة (التي تُوفرها معلمة cv). يتم تقييم أداء مُحدد RFE باستخدام scorer لعدد مختلف من الميزات المحددة ويتم تجميعها معًا. أخيرًا، يتم حساب متوسط الدرجات عبر الطيات ويتم تعيين عدد الميزات المحددة على عدد الميزات التي تُعظِّم درجة التحقق المتبادل.

أمثلة

1.13.4. اختيار الميزات باستخدام SelectFromModel#

SelectFromModel هو مُحوِّل تعريف يمكن استخدامه جنبًا إلى جنب مع أي مُقدِّر يُعيِّن أهمية لكل ميزة من خلال سمة مُحددة (مثل coef_ أو feature_importances_) أو عبر دالة importance_getter قابلة للاستدعاء بعد الملاءمة. تُعتبر الميزات غير مهمة ويتم إزالتها إذا كانت أهمية قيم الميزات المُقابلة أقل من معلمة threshold المُقدمة. بصرف النظر عن تحديد العتبة عدديًا، هناك استدلالات مُدمجة للعثور على عتبة باستخدام وسيطة سلسلة. الاستدلالات المتاحة هي "mean" و "median" ومُضاعفات عائمة لهذه مثل "0.1 * mean". بالاقتران مع معيار threshold، يمكن للمرء استخدام معلمة max_features لتعيين حد لعدد الميزات المراد تحديدها.

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

أمثلة

1.13.4.1. اختيار الميزات القائم على L1#

النماذج الخطية المُعاقبة بقاعدة L1 لها حلول متفرقة: العديد من معاملاتها المُقدَّرة تساوي صفرًا. عندما يكون الهدف هو تقليل أبعاد البيانات لاستخدامها مع مُصنف آخر، يمكن استخدامها مع SelectFromModel لاختيار المعاملات غير الصفرية. على وجه الخصوص، المُقدِّرات المتفرقة المفيدة لهذا الغرض هي Lasso للانحدار، و LogisticRegression و LinearSVC للتصنيف:

>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
>>> model = SelectFromModel(lsvc, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape
(150, 3)

مع SVMs والانحدار اللوجستي، تتحكم المعلمة C في التفرق: كلما صغرت C، قل عدد الميزات المحددة. مع Lasso، كلما ارتفعت معلمة alpha، قل عدد الميزات المحددة.

أمثلة

استرداد L1 والاستشعار المضغوط#

لاختيار جيد لـ alpha، يمكن لـ Lasso استرداد مجموعة المتغيرات غير الصفرية الدقيقة باستخدام عدد قليل من الملاحظات، بشرط استيفاء شروط مُحددة. على وجه الخصوص، يجب أن يكون عدد العينات "كبيرًا بما يكفي"، أو أن نماذج L1 ستعمل بشكل عشوائي، حيث يعتمد "كبير بما يكفي" على عدد المعاملات غير الصفرية، ولوغاريتم عدد الميزات، وكمية الضوضاء، وأصغر قيمة مُطلقة للمعاملات غير الصفرية، و هيكل مصفوفة التصميم X. بالإضافة إلى ذلك، يجب أن تُظهر مصفوفة التصميم خصائص مُحددة، مثل عدم كونها مُرتبطة للغاية.

لا توجد قاعدة عامة لاختيار معلمة alpha لاسترداد المعاملات غير الصفرية. يمكن ضبطها عن طريق التحقق المتبادل (LassoCV أو LassoLarsCV)، على الرغم من أن هذا قد يؤدي إلى نماذج مُعاقبة بشكل ناقص: تضمين عدد صغير من المتغيرات غير ذات الصلة ليس ضارًا بنتيجة التنبؤ. BIC (LassoLarsIC) يميل، على العكس من ذلك، إلى تعيين قيم عالية لـ alpha.

المراجع

Richard G. Baraniuk "الاستشعار المضغوط", IEEE Signal Processing Magazine [120] يوليو 2007 http://users.isr.ist.utl.pt/~aguiar/CS_notes.pdf

1.13.4.2. اختيار الميزات القائم على الشجرة#

يمكن استخدام المُقدِّرات القائمة على الشجرة (انظر وحدة sklearn.tree و غابة الأشجار في وحدة sklearn.ensemble) لحساب أهمية الميزات القائمة على النجاسة، والتي بدورها يمكن استخدامها لتجاهل الميزات غير ذات الصلة (عند اقترانها بـ مُحوِّل التعريف SelectFromModel):

>>> from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> clf = ExtraTreesClassifier(n_estimators=50)
>>> clf = clf.fit(X, y)
>>> clf.feature_importances_  
array([ 0.04...,  0.05...,  0.4...,  0.4...])
>>> model = SelectFromModel(clf, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape               
(150, 2)

أمثلة

1.13.5. اختيار الميزات المتسلسل#

يتوفر اختيار الميزات المتسلسل [sfs] (SFS) في مُحوِّل SequentialFeatureSelector. يمكن أن يكون SFS إما للأمام أو للخلف:

Forward-SFS هو إجراء جشع يجد بشكل متكرر أفضل ميزة جديدة لإضافتها إلى مجموعة الميزات المحددة. بشكل ملموس، نبدأ في البداية بصفر ميزات ونجد الميزة الواحدة التي تُعظِّم درجة مُتحققة بشكل متبادل عندما يتم تدريب مُقدِّر على هذه الميزة الفردية. بمجرد تحديد هذه الميزة الأولى، نُكرر الإجراء عن طريق إضافة ميزة جديدة إلى مجموعة الميزات المحددة. يتوقف الإجراء عندما يتم الوصول إلى العدد المطلوب من الميزات المحددة، كما هو مُحدد بواسطة معلمة n_features_to_select.

يتبع Backward-SFS نفس الفكرة ولكنه يعمل في الاتجاه المُعاكس: بدلاً من البدء بدون ميزات وإضافة الميزات بشكل جشع، نبدأ بـ جميع الميزات و نزيل الميزات بشكل جشع من المجموعة. تتحكم معلمة direction فيما إذا كان يتم استخدام SFS للأمام أو للخلف.

تفاصيل حول اختيار الميزات المتسلسل#

بشكل عام، لا يُعطي الاختيار الأمامي والخلفي نتائج مُكافئة. أيضًا، قد يكون أحدهما أسرع بكثير من الآخر اعتمادًا على العدد المطلوب من الميزات المحددة: إذا كان لدينا 10 ميزات ونطلب 7 ميزات محددة، فسيحتاج الاختيار الأمامي إلى إجراء 7 تكرارات بينما الاختيار الخلفي سيحتاج فقط إلى إجراء 3.

يختلف SFS عن RFE و SelectFromModel من حيث أنه لا يتطلب أن يُظهر النموذج الأساسي سمة coef_ أو feature_importances_. ومع ذلك، قد يكون أبطأ مع الأخذ في الاعتبار أنه يجب تقييم المزيد من النماذج، مُقارنةً بالطرق الأخرى. على سبيل المثال، في الاختيار الخلفي، يتطلب التكرار من m ميزات إلى m - 1 ميزات باستخدام التحقق المتبادل k-fold ملاءمة m * k نماذج، بينما RFE سيتطلب ملاءمة واحدة فقط، و SelectFromModel يُجري دائمًا ملاءمة واحدة فقط ولا يتطلب أي تكرارات.

المراجع

أمثلة

1.13.6. اختيار الميزات كجزء من خط أنابيب#

عادةً ما يُستخدم اختيار الميزات كخطوة مُعالجة مُسبقة قبل القيام بالتعلم الفعلي. الطريقة المُوصى بها للقيام بذلك في scikit-learn هي استخدام Pipeline:

clf = Pipeline([
  ('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
  ('classification', RandomForestClassifier())
])
clf.fit(X, y)

في هذا المقتطف، نستخدم LinearSVC مقترنًا بـ SelectFromModel لتقييم أهمية الميزات وتحديد أهم الميزات. ثم، يتم تدريب RandomForestClassifier على الإخراج المُحوَّل، أي باستخدام الميزات ذات الصلة فقط. يمكنك تنفيذ عمليات مُشابهة مع أساليب اختيار الميزات الأخرى وأيضًا المُصنِّفات التي تُوفر طريقة لتقييم أهمية الميزات بالطبع. راجع أمثلة Pipeline لمزيد من التفاصيل.