1.13. اختيار الميزات#
يمكن استخدام الفئات في وحدة sklearn.feature_selection
لـ
اختيار الميزات / تقليل الأبعاد على مجموعات العينات، إما لـ
تحسين درجات دقة المُقدِّرات أو لتعزيز أدائها على مجموعات البيانات
عالية الأبعاد للغاية.
1.13.1. إزالة الميزات ذات التباين المنخفض#
VarianceThreshold
هو نهج أساسي بسيط لاختيار الميزات.
إنه يُزيل جميع الميزات التي لا يُلبي تباينها عتبة مُعينة.
افتراضيًا، يُزيل جميع الميزات ذات التباين الصفري،
أي الميزات التي لها نفس القيمة في جميع العينات.
على سبيل المثال، لنفترض أن لدينا مجموعة بيانات ذات ميزات منطقية، ونُريد إزالة جميع الميزات التي تكون إما واحدًا أو صفرًا (مُشغَّلة أو مُطفأة) في أكثر من 80% من العينات. الميزات المنطقية هي متغيرات عشوائية برنولي، ويتم إعطاء تباين هذه المتغيرات بواسطة
حتى نتمكن من الاختيار باستخدام العتبة .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
):
للانحدار:
r_regression
وf_regression
وmutual_info_regression
للتصنيف:
chi2
وf_classif
وmutual_info_classif
تُقدِّر الأساليب القائمة على اختبار 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)
أمثلة
أهمية الميزات باستخدام غابة من الأشجار: مثال على البيانات الاصطناعية يُظهر استرداد الميزات ذات المعنى الفعلية.
sphx_glr_auto_examples_ensemble_plot_forest_importances_faces.py: مثال على بيانات التعرف على الوجه.
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
يُجري دائمًا ملاءمة واحدة فقط
ولا يتطلب أي تكرارات.
المراجع
Ferri et al, دراسة مقارنة لتقنيات اختيار الميزات واسع النطاق.
أمثلة
1.13.6. اختيار الميزات كجزء من خط أنابيب#
عادةً ما يُستخدم اختيار الميزات كخطوة مُعالجة مُسبقة قبل القيام
بالتعلم الفعلي. الطريقة المُوصى بها للقيام بذلك في scikit-learn
هي استخدام Pipeline
:
clf = Pipeline([
('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
('classification', RandomForestClassifier())
])
clf.fit(X, y)
في هذا المقتطف، نستخدم LinearSVC
مقترنًا بـ SelectFromModel
لتقييم أهمية الميزات وتحديد أهم الميزات.
ثم، يتم تدريب RandomForestClassifier
على
الإخراج المُحوَّل، أي باستخدام الميزات ذات الصلة فقط. يمكنك تنفيذ
عمليات مُشابهة مع أساليب اختيار الميزات الأخرى وأيضًا
المُصنِّفات التي تُوفر طريقة لتقييم أهمية الميزات بالطبع.
راجع أمثلة Pipeline
لمزيد من التفاصيل.