البرنامج التعليمي Scikit-Learn: كيفية التثبيت وأمثلة Scikit-Learn
ما هو سكيكيت ليرن؟
Scikit تعلم هو مصدر مفتوح Python مكتبة للتعلم الآلي. تدعم خوارزميات متطورة مثل KNN وXGBoost والغابة العشوائية وSVM. وهي مبنية على NumPy. تُستخدم Scikit-learn على نطاق واسع في مسابقة Kaggle وكذلك في شركات التكنولوجيا البارزة. تساعد في المعالجة المسبقة وتقليل الأبعاد (اختيار المعلمات) والتصنيف والانحدار والتجميع واختيار النموذج.
يتمتع Scikit-learn بأفضل التوثيق بين جميع المكتبات مفتوحة المصدر. فإنه يوفر لك الرسم البياني التفاعلي في https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html.
ليس من الصعب جدًا استخدام Scikit-learn ويوفر نتائج ممتازة. ومع ذلك، فإن scikit Learn لا يدعم الحسابات المتوازية. من الممكن تشغيل خوارزمية التعلم العميق بها ولكنها ليست الحل الأمثل، خاصة إذا كنت تعرف كيفية استخدام TensorFlow.
كيفية تنزيل وتثبيت Scikit-Learn
الآن في هذا Python البرنامج التعليمي Scikit-learn، سنتعلم كيفية تنزيل وتثبيت Scikit-learn:
الخيار 1: AWS
يمكن استخدام scikit-Learn عبر AWS. لو سمحت الرجوع صورة عامل الإرساء المثبت عليها scikit-Learn مسبقًا.
لاستخدام إصدار المطور، استخدم الأمر in Jupyter
import sys !{sys.executable} -m pip install git+git://github.com/scikit-learn/scikit-learn.git
الخيار 2: Mac أو Windows باستخدام اناكوندا
لمعرفة المزيد حول تثبيت اناكوندا، راجع https://www.guru99.com/download-install-tensorflow.html
مؤخرًا، أصدر مطورو scikit نسخة تطويرية تعالج المشكلة الشائعة التي تواجه الإصدار الحالي. لقد وجدنا أنه أكثر ملاءمة لاستخدام إصدار المطور بدلاً من الإصدار الحالي.
كيفية تثبيت scikit-learn مع بيئة Conda
إذا قمت بتثبيت scikit-learn مع بيئة conda، يرجى اتباع الخطوة للتحديث إلى الإصدار 0.20
الخطوة 1) تفعيل بيئة Tensorflow
source activate hello-tf
الخطوة 2) قم بإزالة scikit Lean باستخدام الأمر conda
conda remove scikit-learn
الخطوة 3) تثبيت نسخة المطور.
قم بتثبيت إصدار المطور scikit learn مع المكتبات الضرورية.
conda install -c anaconda git pip install Cython pip install h5py pip install git+git://github.com/scikit-learn/scikit-learn.git
NOTE: Windows سيحتاج المستخدم إلى التثبيت Microsoft مرئي C++ 14. يمكنك الحصول عليه من هنا
مثال Scikit-Learn مع التعلم الآلي
ينقسم هذا البرنامج التعليمي Scikit إلى قسمين:
- التعلم الآلي باستخدام scikit-Learn
- كيف تثق بنموذجك مع LIME
يتضمن الجزء الأول شرحًا تفصيليًا لكيفية بناء خط أنابيب وإنشاء نموذج وضبط المعلمات الفائقة بينما يقدم الجزء الثاني أحدث التقنيات فيما يتعلق باختيار النموذج.
الخطوة 1) استيراد البيانات
خلال هذا البرنامج التعليمي Scikit Learn، ستستخدم مجموعة بيانات البالغين.
للحصول على خلفية في مجموعة البيانات هذه، راجع إذا كنت مهتمًا بمعرفة المزيد عن الإحصائيات الوصفية، فيرجى استخدام أدوات الغوص والنظرة العامة.
الرجوع هذا البرنامج التعليمي تعرف على المزيد حول الغوص والنظرة العامة
يمكنك استيراد مجموعة البيانات باستخدام Pandas. لاحظ أنك تحتاج إلى تحويل نوع المتغيرات المستمرة إلى تنسيق عائم.
تتضمن مجموعة البيانات هذه ثمانية متغيرات فئوية:
يتم سرد المتغيرات الفئوية في CATE_FEATURES
- فئة العمل
- التعليم
- الزوجي
- احتلال
- صلة
- سباق
- جنس
- الوطن الأم
علاوة على ذلك، ستة متغيرات مستمرة:
يتم سرد المتغيرات المستمرة في CONTI_FEATURES
- السن
- com.fnlwgt
- education_num
- مكاسب رأس المال
- خسارة رأس المال
- ساعات_الاسبوع
لاحظ أننا نملأ القائمة يدويًا حتى يكون لديك فكرة أفضل عن الأعمدة التي نستخدمها. الطريقة الأسرع لإنشاء قائمة فئوية أو مستمرة هي استخدام:
## List Categorical CATE_FEATURES = df_train.iloc[:,:-1].select_dtypes('object').columns print(CATE_FEATURES) ## List continuous CONTI_FEATURES = df_train._get_numeric_data() print(CONTI_FEATURES)
إليك الكود لاستيراد البيانات:
# Import dataset import pandas as pd ## Define path data COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'label'] ### Define continuous list CONTI_FEATURES = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week'] ### Define categorical list CATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country'] ## Prepare the data features = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country'] PATH = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data" df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False) df_train[CONTI_FEATURES] =df_train[CONTI_FEATURES].astype('float64') df_train.describe()
السن | com.fnlwgt | education_num | مكاسب رأس المال | خسارة رأس المال | ساعات_الاسبوع | |
---|---|---|---|---|---|---|
عد | 32561.000000 | 3.256100e + 04 | 32561.000000 | 32561.000000 | 32561.000000 | 32561.000000 |
تعني | 38.581647 | 1.897784e + 05 | 10.080679 | 1077.648844 | 87.303830 | 40.437456 |
الأمراض المنقولة جنسيا | 13.640433 | 1.055500e + 05 | 2.572720 | 7385.292085 | 402.960219 | 12.347429 |
دقيقة | 17.000000 | 1.228500e + 04 | 1.000000 | 0.000000 | 0.000000 | 1.000000 |
25% | 28.000000 | 1.178270e + 05 | 9.000000 | 0.000000 | 0.000000 | 40.000000 |
50% | 37.000000 | 1.783560e + 05 | 10.000000 | 0.000000 | 0.000000 | 40.000000 |
75% | 48.000000 | 2.370510e + 05 | 12.000000 | 0.000000 | 0.000000 | 45.000000 |
ماكس | 90.000000 | 1.484705e + 06 | 16.000000 | 99999.000000 | 4356.000000 | 99.000000 |
يمكنك التحقق من عدد القيم الفريدة لميزات original_country. يمكنك أن ترى أن أسرة واحدة فقط تأتي من هولندا-هولندا. لن تقدم لنا هذه الأسرة أي معلومات، ولكنها ستفعل ذلك من خلال خطأ أثناء التدريب.
df_train.native_country.value_counts()
United-States 29170 Mexico 643 ? 583 Philippines 198 Germany 137 Canada 121 Puerto-Rico 114 El-Salvador 106 India 100 Cuba 95 England 90 Jamaica 81 South 80 China 75 Italy 73 Dominican-Republic 70 Vietnam 67 Guatemala 64 Japan 62 Poland 60 Columbia 59 Taiwan 51 Haiti 44 Iran 43 Portugal 37 Nicaragua 34 Peru 31 France 29 Greece 29 Ecuador 28 Ireland 24 Hong 20 Cambodia 19 Trinadad&Tobago 19 Thailand 18 Laos 18 Yugoslavia 16 Outlying-US(Guam-USVI-etc) 14 Honduras 13 Hungary 13 Scotland 12 Holand-Netherlands 1 Name: native_country, dtype: int64
يمكنك استبعاد هذا الصف غير المفيد من مجموعة البيانات
## Drop Netherland, because only one row df_train = df_train[df_train.native_country != "Holand-Netherlands"]
بعد ذلك، تقوم بتخزين موضع الميزات المستمرة في القائمة. سوف تحتاج إليها في الخطوة التالية لبناء خط الأنابيب.
سوف يتكرر الكود أدناه فوق جميع أسماء الأعمدة في CONTI_FEATURES ويحصل على موقعه (أي رقمه) ثم يلحقه بقائمة تسمى conti_features
## Get the column index of the categorical features conti_features = [] for i in CONTI_FEATURES: position = df_train.columns.get_loc(i) conti_features.append(position) print(conti_features)
[0, 2, 10, 4, 11, 12]
يقوم الكود أدناه بنفس الوظيفة المذكورة أعلاه ولكن للمتغير الفئوي. يكرر الكود أدناه ما قمت به سابقًا، باستثناء الميزات الفئوية.
## Get the column index of the categorical features categorical_features = [] for i in CATE_FEATURES: position = df_train.columns.get_loc(i) categorical_features.append(position) print(categorical_features)
[1, 3, 5, 6, 7, 8, 9, 13]
يمكنك إلقاء نظرة على مجموعة البيانات. لاحظ أن كل ميزة فئوية عبارة عن سلسلة. لا يمكنك تغذية نموذج بقيمة سلسلة. تحتاج إلى تحويل مجموعة البيانات باستخدام متغير وهمي.
df_train.head(5)
في الواقع، تحتاج إلى إنشاء عمود واحد لكل مجموعة في الميزة. أولاً، يمكنك تشغيل التعليمات البرمجية أدناه لحساب إجمالي عدد الأعمدة المطلوبة.
print(df_train[CATE_FEATURES].nunique(), 'There are',sum(df_train[CATE_FEATURES].nunique()), 'groups in the whole dataset')
workclass 9 education 16 marital 7 occupation 15 relationship 6 race 5 sex 2 native_country 41 dtype: int64 There are 101 groups in the whole dataset
تحتوي مجموعة البيانات بالكامل على 101 مجموعة كما هو موضح أعلاه. على سبيل المثال، تحتوي ميزات workclass على تسع مجموعات. يمكنك تصور اسم المجموعات باستخدام الرموز التالية
Unique() تُرجع القيم الفريدة للميزات الفئوية.
for i in CATE_FEATURES: print(df_train[i].unique())
['State-gov' 'Self-emp-not-inc' 'Private' 'Federal-gov' 'Local-gov' '?' 'Self-emp-inc' 'Without-pay' 'Never-worked'] ['Bachelors' 'HS-grad' '11th' 'Masters' '9th' 'Some-college' 'Assoc-acdm' 'Assoc-voc' '7th-8th' 'Doctorate' 'Prof-school' '5th-6th' '10th' '1st-4th' 'Preschool' '12th'] ['Never-married' 'Married-civ-spouse' 'Divorced' 'Married-spouse-absent' 'Separated' 'Married-AF-spouse' 'Widowed'] ['Adm-clerical' 'Exec-managerial' 'Handlers-cleaners' 'Prof-specialty' 'Other-service' 'Sales' 'Craft-repair' 'Transport-moving' 'Farming-fishing' 'Machine-op-inspct' 'Tech-support' '?' 'Protective-serv' 'Armed-Forces' 'Priv-house-serv'] ['Not-in-family' 'Husband' 'Wife' 'Own-child' 'Unmarried' 'Other-relative'] ['White' 'Black' 'Asian-Pac-Islander' 'Amer-Indian-Eskimo' 'Other'] ['Male' 'Female'] ['United-States' 'Cuba' 'Jamaica' 'India' '?' 'Mexico' 'South' 'Puerto-Rico' 'Honduras' 'England' 'Canada' 'Germany' 'Iran' 'Philippines' 'Italy' 'Poland' 'Columbia' 'Cambodia' 'Thailand' 'Ecuador' 'Laos' 'Taiwan' 'Haiti' 'Portugal' 'Dominican-Republic' 'El-Salvador' 'France' 'Guatemala' 'China' 'Japan' 'Yugoslavia' 'Peru' 'Outlying-US(Guam-USVI-etc)' 'Scotland' 'Trinadad&Tobago' 'Greece' 'Nicaragua' 'Vietnam' 'Hong' 'Ireland' 'Hungary']
لذلك، ستحتوي مجموعة بيانات التدريب على 101 + 7 أعمدة. الأعمدة السبعة الأخيرة هي الميزات المستمرة.
يمكن لـ Scikit-Learn أن يعتني بالتحويل. ويتم ذلك في خطوتين:
- أولاً، تحتاج إلى تحويل السلسلة إلى معرف. على سبيل المثال، سيكون لدى State-gov المعرف 1، ومعرف Self-emp-not-inc 2، وما إلى ذلك. تقوم وظيفة LabelEncoder بذلك نيابةً عنك
- انقل كل معرف إلى عمود جديد. وكما ذكرنا من قبل، تحتوي مجموعة البيانات على 101 معرف مجموعة. وبالتالي، سيكون هناك 101 عمودًا تلتقط جميع مجموعات ميزات الفئات. يحتوي Scikit-learn على وظيفة تسمى OneHotEncoder التي تقوم بهذه العملية
الخطوة 2) إنشاء مجموعة القطار/الاختبار
الآن بعد أن أصبحت مجموعة البيانات جاهزة، يمكننا تقسيمها بنسبة 80/20.
80 بالمائة لمجموعة التدريب و20 بالمائة لمجموعة الاختبار.
يمكنك استخدام Train_test_split. الوسيطة الأولى هي dataframe وهي الميزات والوسيطة الثانية هي dataframe التسمية. يمكنك تحديد حجم مجموعة الاختبار باستخدام test_size.
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(df_train[features], df_train.label, test_size = 0.2, random_state=0) X_train.head(5) print(X_train.shape, X_test.shape)
(26048, 14) (6512, 14)
الخطوة 3) بناء خط الأنابيب
يسهل المسار تغذية النموذج ببيانات متسقة.
الفكرة وراء ذلك هي وضع البيانات الخام في "خط أنابيب" لإجراء العمليات.
على سبيل المثال، مع مجموعة البيانات الحالية، تحتاج إلى توحيد المتغيرات المستمرة وتحويل البيانات التصنيفية. لاحظ أنه يمكنك إجراء أي عملية داخل خط الأنابيب. على سبيل المثال، إذا كان لديك "NA" في مجموعة البيانات، فيمكنك استبدالها بالمتوسط أو الوسيط. يمكنك أيضًا إنشاء متغيرات جديدة.
لديك الخيار؛ رمز الثابت للعمليتين أو إنشاء خط أنابيب. يمكن أن يؤدي الاختيار الأول إلى تسرب البيانات وخلق تناقضات مع مرور الوقت. الخيار الأفضل هو استخدام خط الأنابيب.
from sklearn.preprocessing import StandardScaler, OneHotEncoder, LabelEncoder from sklearn.compose import ColumnTransformer, make_column_transformer from sklearn.pipeline import make_pipeline from sklearn.linear_model import LogisticRegression
سيقوم خط الأنابيب بإجراء عمليتين قبل تغذية المصنف اللوجستي:
- توحيد المتغير: `StandardScaler()"
- تحويل الميزات الفئوية: OneHotEncoder(sparse=False)
يمكنك تنفيذ الخطوتين باستخدام make_column_transformer. هذه الوظيفة غير متوفرة في الإصدار الحالي من scikit-learn (0.19). ليس من الممكن في الإصدار الحالي تنفيذ برنامج تشفير الملصقات وجهاز تشفير ساخن واحد في خط الأنابيب. وهذا أحد أسباب قرارنا باستخدام إصدار المطور.
يعد استخدام make_column_transformer سهلاً. تحتاج إلى تحديد الأعمدة التي سيتم تطبيق التحويل عليها والتحويل الذي سيتم تشغيله. على سبيل المثال، لتوحيد الميزة المستمرة، يمكنك القيام بما يلي:
- conti_features، StandardScaler() داخل make_column_transformer.
- conti_features: قائمة بالمتغير المستمر
- StandardScaler: توحيد المتغير
يقوم الكائن OneHotEncoder داخل make_column_transformer بترميز التسمية تلقائيًا.
preprocess = make_column_transformer( (conti_features, StandardScaler()), ### Need to be numeric not string to specify columns name (categorical_features, OneHotEncoder(sparse=False)) )
يمكنك اختبار ما إذا كان خط الأنابيب يعمل مع fit_transform. يجب أن يكون لمجموعة البيانات الشكل التالي: 26048، 107
preprocess.fit_transform(X_train).shape
(26048, 107)
محول البيانات جاهز للاستخدام. يمكنك إنشاء خط الأنابيب باستخدام make_pipeline. بمجرد تحويل البيانات، يمكنك تغذية الانحدار اللوجستي.
model = make_pipeline( preprocess, LogisticRegression())
يعد تدريب النموذج باستخدام scikit-learn أمرًا تافهًا. تحتاج إلى استخدام ملاءمة الكائن المسبوقة بخط الأنابيب، أي النموذج. يمكنك طباعة الدقة باستخدام كائن النتيجة من مكتبة scikit-Learn
model.fit(X_train, y_train) print("logistic regression score: %f" % model.score(X_test, y_test))
logistic regression score: 0.850891
وأخيرًا، يمكنك التنبؤ بالفئات باستخدام Predict_proba. تقوم بإرجاع الاحتمالية لكل فئة. لاحظ أنه مجموع واحد.
model.predict_proba(X_test)
array([[0.83576663, 0.16423337], [0.94582765, 0.05417235], [0.64760587, 0.35239413], ..., [0.99639252, 0.00360748], [0.02072181, 0.97927819], [0.56781353, 0.43218647]])
الخطوة 4) استخدام خط الأنابيب الخاص بنا في بحث الشبكة
يمكن أن يكون ضبط المعلمة الفائقة (المتغيرات التي تحدد بنية الشبكة مثل الوحدات المخفية) أمرًا مملاً ومرهقًا.
إحدى طرق تقييم النموذج هي تغيير حجم مجموعة التدريب وتقييم الأداء.
يمكنك تكرار هذه الطريقة عشر مرات لرؤية مقاييس النتيجة. ومع ذلك، فهو كثير من العمل.
بدلاً من ذلك، يوفر scikit-Learn وظيفة لتنفيذ ضبط المعلمات والتحقق من الصحة.
عبر المصادقة
التحقق من الصحة يعني أنه أثناء التدريب، يتم تمرير مجموعة التدريب لعدد n من المرات في الطيات ثم تقييم النموذج n من الوقت. على سبيل المثال، إذا تم تعيين cv على 10، فسيتم تدريب مجموعة التدريب وتقييمها عشر مرات. في كل جولة، يختار المُصنف بشكل عشوائي تسعة طيات لتدريب النموذج، والطية العاشرة مخصصة للتقييم.
بحث الشبكة
يحتوي كل مصنف على معلمات تشعبية لضبطها. يمكنك تجربة قيم مختلفة، أو يمكنك تعيين شبكة المعلمات. إذا ذهبت إلى الموقع الرسمي لـ scikit-Learn، يمكنك أن ترى أن المصنف اللوجستي لديه معلمات مختلفة لضبطها. لجعل التدريب أسرع، اخترت ضبط المعلمة C. يتحكم في معلمة التنظيم. يجب أن تكون إيجابية. القيمة الصغيرة تعطي وزنًا أكبر للمنظم.
يمكنك استخدام الكائن GridSearchCV. تحتاج إلى إنشاء قاموس يحتوي على المعلمات الفائقة لضبطها.
تقوم بإدراج المعلمات الفائقة متبوعة بالقيم التي تريد تجربتها. على سبيل المثال، لضبط المعلمة C، يمكنك استخدام:
- 'logisticregression__C': [0.1, 1.0, 1.0]: يُسبق المعلمة اسم المُصنف، بأحرف صغيرة، وشرطتين سفليتين.
سيحاول النموذج أربع قيم مختلفة: 0.001 و0.01 و0.1 و1.
يمكنك تدريب النموذج باستخدام 10 طيات: cv=10
from sklearn.model_selection import GridSearchCV # Construct the parameter grid param_grid = { 'logisticregression__C': [0.001, 0.01,0.1, 1.0], }
يمكنك تدريب النموذج باستخدام GridSearchCV مع المعلمة gri وcv.
# Train the model grid_clf = GridSearchCV(model, param_grid, cv=10, iid=False) grid_clf.fit(X_train, y_train)
OUTPUT
GridSearchCV(cv=10, error_score='raise-deprecating', estimator=Pipeline(memory=None, steps=[('columntransformer', ColumnTransformer(n_jobs=1, remainder='drop', transformer_weights=None, transformers=[('standardscaler', StandardScaler(copy=True, with_mean=True, with_std=True), [0, 2, 10, 4, 11, 12]), ('onehotencoder', OneHotEncoder(categorical_features=None, categories=None,...ty='l2', random_state=None, solver='liblinear', tol=0.0001, verbose=0, warm_start=False))]), fit_params=None, iid=False, n_jobs=1, param_grid={'logisticregression__C': [0.001, 0.01, 0.1, 1.0]}, pre_dispatch='2*n_jobs', refit=True, return_train_score='warn', scoring=None, verbose=0)
للوصول إلى أفضل المعلمات، يمكنك استخدام best_params_
grid_clf.best_params_
OUTPUT
{'logisticregression__C': 1.0}
بعد تدريب النموذج باستخدام أربع قيم تنظيم مختلفة، تكون المعلمة المثالية هي
print("best logistic regression from grid search: %f" % grid_clf.best_estimator_.score(X_test, y_test))
أفضل انحدار لوجستي من بحث الشبكة: 0.850891
للوصول إلى الاحتمالات المتوقعة:
grid_clf.best_estimator_.predict_proba(X_test)
array([[0.83576677, 0.16423323], [0.9458291 , 0.0541709 ], [0.64760416, 0.35239584], ..., [0.99639224, 0.00360776], [0.02072033, 0.97927967], [0.56782222, 0.43217778]])
نموذج XGBoost مع scikit-Learn
دعونا نجرب أمثلة Scikit-Learn لتدريب أحد أفضل أدوات التصنيف في السوق. XGBoost هو تحسين على الغابة العشوائية. الخلفية النظرية للمصنف خارج نطاق هذا Python البرنامج التعليمي Scikit. ضع في اعتبارك أن XGBoost قد فاز بالعديد من مسابقات kaggle. مع متوسط حجم مجموعة البيانات، يمكن أن تؤدي أداءً جيدًا مثل خوارزمية التعلم العميق أو حتى أفضل.
يصعب تدريب المصنف لأنه يحتوي على عدد كبير من المعلمات التي يجب ضبطها. يمكنك بالطبع استخدام GridSearchCV لاختيار المعلمة المناسبة لك.
بدلاً من ذلك، دعونا نرى كيفية استخدام طريقة أفضل للعثور على المعلمات المثالية. يمكن أن يكون تدريب GridSearchCV مملاً وطويلًا جدًا إذا تجاوزت العديد من القيم. تنمو مساحة البحث مع عدد المعلمات. الحل المفضل هو استخدام RandomizedSearchCV. تتكون هذه الطريقة من اختيار قيم كل معلمة تشعبية بعد كل تكرار بشكل عشوائي. على سبيل المثال، إذا تم تدريب المصنف على أكثر من 1000 تكرار، فسيتم تقييم 1000 مجموعة. إنه يعمل بشكل أو بآخر. GridSearchCV
تحتاج إلى استيراد xgboost. إذا لم يتم تثبيت المكتبة، يرجى استخدام pip3 install xgboost أو
use import sys !{sys.executable} -m pip install xgboost
In Jupyter بيئة
المقبل،
import xgboost from sklearn.model_selection import RandomizedSearchCV from sklearn.model_selection import StratifiedKFold
الخطوة التالية في هذا Scikit Python يتضمن البرنامج التعليمي تحديد المعلمات لضبطها. يمكنك الرجوع إلى الوثائق الرسمية لرؤية كافة المعلمات لضبطها. من أجل Python البرنامج التعليمي Sklearn، يمكنك فقط اختيار معلمتين فائقتين بقيمتين لكل منهما. يستغرق XGBoost الكثير من الوقت للتدريب، وكلما زاد عدد المعلمات الفائقة في الشبكة، زاد الوقت الذي تحتاجه للانتظار.
params = { 'xgbclassifier__gamma': [0.5, 1], 'xgbclassifier__max_depth': [3, 4] }
يمكنك إنشاء خط أنابيب جديد باستخدام مصنف XGBoost. يمكنك اختيار تعريف 600 مقدر. لاحظ أن n_estimators عبارة عن معلمة يمكنك ضبطها. يمكن أن تؤدي القيمة العالية إلى الإفراط في التجهيز. يمكنك تجربة قيم مختلفة بنفسك ولكن كن على علم بأن الأمر قد يستغرق ساعات. يمكنك استخدام القيمة الافتراضية للمعلمات الأخرى
model_xgb = make_pipeline( preprocess, xgboost.XGBClassifier( n_estimators=600, objective='binary:logistic', silent=True, nthread=1) )
يمكنك تحسين التحقق المتقاطع باستخدام أداة التحقق المتقاطع Stratified K-Folds. يمكنك إنشاء ثلاثة طيات فقط هنا لتسريع الحساب ولكن مع خفض الجودة. قم بزيادة هذه القيمة إلى 5 أو 10 في المنزل لتحسين النتائج.
اخترت تدريب النموذج على أربع تكرارات.
skf = StratifiedKFold(n_splits=3, shuffle = True, random_state = 1001) random_search = RandomizedSearchCV(model_xgb, param_distributions=params, n_iter=4, scoring='accuracy', n_jobs=4, cv=skf.split(X_train, y_train), verbose=3, random_state=1001)
البحث العشوائي جاهز للاستخدام، يمكنك تدريب النموذج
#grid_xgb = GridSearchCV(model_xgb, params, cv=10, iid=False) random_search.fit(X_train, y_train)
Fitting 3 folds for each of 4 candidates, totalling 12 fits [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5 ............ [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5 ............ [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5 ............ [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5 ............ [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5, score=0.8759645283888057, total= 1.0min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5 ............ [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5, score=0.8729701715996775, total= 1.0min [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=0.5, score=0.8706519235199263, total= 1.0min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5 ............ [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1 .............. [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5, score=0.8735460094437406, total= 1.3min [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1 .............. [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1, score=0.8722791661868018, total= 57.7s [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1 .............. [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1, score=0.8753886905447426, total= 1.0min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1 .............. [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5, score=0.8697304768486523, total= 1.3min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1 .............. [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=0.5, score=0.8740066797189912, total= 1.4min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1 .............. [CV] xgbclassifier__max_depth=3, xgbclassifier__gamma=1, score=0.8707671043538355, total= 1.0min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1, score=0.8729701715996775, total= 1.2min [Parallel(n_jobs=4)]: Done 10 out of 12 | elapsed: 3.6min remaining: 43.5s [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1, score=0.8736611770125533, total= 1.2min [CV] xgbclassifier__max_depth=4, xgbclassifier__gamma=1, score=0.8692697535130154, total= 1.2min
[Parallel(n_jobs=4)]: Done 12 out of 12 | elapsed: 3.6min finished /Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/sklearn/model_selection/_search.py:737: DeprecationWarning: The default of the `iid` parameter will change from True to False in version 0.22 and will be removed in 0.24. This will change numeric results when test-set sizes are unequal. DeprecationWarning)
RandomizedSearchCV(cv=<generator object _BaseKFold.split at 0x1101eb830>, error_score='raise-deprecating', estimator=Pipeline(memory=None, steps=[('columntransformer', ColumnTransformer(n_jobs=1, remainder='drop', transformer_weights=None, transformers=[('standardscaler', StandardScaler(copy=True, with_mean=True, with_std=True), [0, 2, 10, 4, 11, 12]), ('onehotencoder', OneHotEncoder(categorical_features=None, categories=None,... reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None, silent=True, subsample=1))]), fit_params=None, iid='warn', n_iter=4, n_jobs=4, param_distributions={'xgbclassifier__gamma': [0.5, 1], 'xgbclassifier__max_depth': [3, 4]}, pre_dispatch='2*n_jobs', random_state=1001, refit=True, return_train_score='warn', scoring='accuracy', verbose=3)
كما ترون، حصل XGBoost على نتيجة أفضل من الانحدار logisitc السابق.
print("أفضل parameter", random_search.best_params_) print("best logistic regression from grid search: %f" % random_search.best_estimator_.score(X_test, y_test))
أفضل parameter {'xgbclassifier__max_depth': 3, 'xgbclassifier__gamma': 0.5} best logistic regression from grid search: 0.873157
random_search.best_estimator_.predict(X_test)
array(['<=50K', '<=50K', '<=50K', ..., '<=50K', '>50K', '<=50K'], dtype=object)
قم بإنشاء DNN باستخدام MLPClassifier في scikit-learn
أخيرًا، يمكنك تدريب خوارزمية التعلم العميق باستخدام scikit-learn. الطريقة هي نفس المصنف الآخر. المصنف متاح في MLPClassifier.
from sklearn.neural_network import MLPClassifier
قم بتحديد خوارزمية التعلم العميق التالية:
- آدم حلال
- وظيفة تفعيل ريلو
- ألفا = 0.0001
- حجم الدفعة 150
- طبقتان مخفيتان تحتويان على 100 و50 خلية عصبية على التوالي
model_dnn = make_pipeline( preprocess, MLPClassifier(solver='adam', alpha=0.0001, activation='relu', batch_size=150, hidden_layer_sizes=(200, 100), random_state=1))
يمكنك تغيير عدد الطبقات لتحسين النموذج
model_dnn.fit(X_train, y_train) print("DNN regression score: %f" % model_dnn.score(X_test, y_test))
درجة انحدار DNN: 0.821253
لايم: ثق بنموذجك
الآن بعد أن أصبح لديك نموذج جيد، فأنت بحاجة إلى أداة تثق به. تعلم الآلة من المعروف أن الخوارزميات، وخاصة الغابات العشوائية والشبكات العصبية، هي خوارزميات صندوق أسود. وبعبارة أخرى، فهي تعمل ولكن لا أحد يعرف السبب.
توصل ثلاثة باحثين إلى أداة رائعة لمعرفة كيف يقوم الكمبيوتر بالتنبؤ. الورقة بعنوان لماذا يجب أن أثق بك؟
لقد طوروا خوارزمية اسمها التفسيرات المحلية المحايدة النموذجية القابلة للتفسير (LIME).
خذ مثالا:
في بعض الأحيان لا تعرف ما إذا كان بإمكانك الوثوق بتنبؤات التعلم الآلي:
فالطبيب، على سبيل المثال، لا يستطيع أن يثق في التشخيص لمجرد أن الكمبيوتر قال ذلك. تحتاج أيضًا إلى معرفة ما إذا كان بإمكانك الوثوق بالنموذج قبل وضعه في مرحلة الإنتاج.
تخيل أننا نستطيع أن نفهم لماذا يقوم أي مصنف بالتنبؤ حتى بالنماذج المعقدة بشكل لا يصدق مثل الشبكات العصبية أو الغابات العشوائية أو svms مع أي نواة
سيصبح من السهل الوثوق بالتنبؤ إذا تمكنا من فهم الأسباب الكامنة وراءه. من المثال مع الطبيب، إذا أخبره العارض بالأعراض الأساسية التي ستثق بها، فمن الأسهل أيضًا معرفة ما إذا كان يجب عليك عدم الوثوق بالنموذج.
يمكن أن يخبرك Lime بالميزات التي تؤثر على قرارات المصنف
تحضير البيانات
هناك بعض الأشياء التي تحتاج إلى تغييرها لتشغيل LIME بها الثعبان. بادئ ذي بدء، تحتاج إلى تثبيت الجير في المحطة. يمكنك استخدام الجير لتثبيت البيب
يستخدم Lime كائن LimeTabularExplainer لتقريب النموذج محليًا. يتطلب هذا الكائن:
- مجموعة بيانات بتنسيق numpy
- اسم الميزات: feature_names
- اسم الفئات: class_names
- فهرس عمود الميزات الفئوية: categorical_features
- اسم المجموعة لكل ميزة فئوية: categorical_names
إنشاء مجموعة قطار numpy
يمكنك نسخ وتحويل df_train من الباندا إلى نمباي سهل جدا
df_train.head(5) # Create numpy data df_lime = df_train df_lime.head(3)
احصل على اسم الفصل يمكن الوصول إلى التسمية باستخدام الكائن الفريد (). يجب أن ترى:
- "<= 50 ألف"
- "> 50 ألفًا"
# Get the class name class_names = df_lime.label.unique() class_names
array(['<=50K', '>50K'], dtype=object)
فهرس عمود الميزات الفئوية
يمكنك استخدام الطريقة التي تعلمتها من قبل للحصول على اسم المجموعة. يمكنك ترميز الملصق باستخدام LabelEncoder. ثم تكرر العملية على جميع الميزات الفئوية.
## import sklearn.preprocessing as preprocessing categorical_names = {} for feature in CATE_FEATURES: le = preprocessing.LabelEncoder() le.fit(df_lime[feature]) df_lime[feature] = le.transform(df_lime[feature]) categorical_names[feature] = le.classes_ print(categorical_names)
{'workclass': array(['?', 'Federal-gov', 'Local-gov', 'Never-worked', 'Private', 'Self-emp-inc', 'Self-emp-not-inc', 'State-gov', 'Without-pay'], dtype=object), 'education': array(['10th', '11th', '12th', '1st-4th', '5th-6th', '7th-8th', '9th', 'Assoc-acdm', 'Assoc-voc', 'Bachelors', 'Doctorate', 'HS-grad', 'Masters', 'Preschool', 'Prof-school', 'Some-college'], dtype=object), 'marital': array(['Divorced', 'Married-AF-spouse', 'Married-civ-spouse', 'Married-spouse-absent', 'Never-married', 'Separated', 'Widowed'], dtype=object), 'occupation': array(['?', 'Adm-clerical', 'Armed-Forces', 'Craft-repair', 'Exec-managerial', 'Farming-fishing', 'Handlers-cleaners', 'Machine-op-inspct', 'Other-service', 'Priv-house-serv', 'Prof-specialty', 'Protective-serv', 'Sales', 'Tech-support', 'Transport-moving'], dtype=object), 'relationship': array(['Husband', 'Not-in-family', 'Other-relative', 'Own-child', 'Unmarried', 'Wife'], dtype=object), 'race': array(['Amer-Indian-Eskimo', 'Asian-Pac-Islander', 'Black', 'Other', 'White'], dtype=object), 'sex': array(['Female', 'Male'], dtype=object), 'native_country': array(['?', 'Cambodia', 'Canada', 'China', 'Columbia', 'Cuba', 'Dominican-Republic', 'Ecuador', 'El-Salvador', 'England', 'France', 'Germany', 'Greece', 'Guatemala', 'Haiti', 'Honduras', 'Hong', 'Hungary', 'India', 'Iran', 'Ireland', 'Italy', 'Jamaica', 'Japan', 'Laos', 'Mexico', 'Nicaragua', 'Outlying-US(Guam-USVI-etc)', 'Peru', 'Philippines', 'Poland', 'Portugal', 'Puerto-Rico', 'Scotland', 'South', 'Taiwan', 'Thailand', 'Trinadad&Tobago', 'United-States', 'Vietnam', 'Yugoslavia'], dtype=object)} df_lime.dtypes
age float64 workclass int64 fnlwgt float64 education int64 education_num float64 marital int64 occupation int64 relationship int64 race int64 sex int64 capital_gain float64 capital_loss float64 hours_week float64 native_country int64 label object dtype: object
الآن بعد أن أصبحت مجموعة البيانات جاهزة، يمكنك إنشاء مجموعة بيانات مختلفة كما هو موضح في أمثلة Scikit Learn أدناه. أنت تقوم بالفعل بتحويل البيانات خارج المسار لتجنب الأخطاء مع LIME. يجب أن تكون مجموعة التدريب في LimeTabularExplainer عبارة عن مصفوفة عددية بدون سلسلة. باستخدام الطريقة المذكورة أعلاه، يكون لديك مجموعة بيانات تدريب تم تحويلها بالفعل.
from sklearn.model_selection import train_test_split X_train_lime, X_test_lime, y_train_lime, y_test_lime = train_test_split(df_lime[features], df_lime.label, test_size = 0.2, random_state=0) X_train_lime.head(5)
يمكنك إنشاء خط الأنابيب باستخدام المعلمات المثالية من XGBoost
model_xgb = make_pipeline( preprocess, xgboost.XGBClassifier(max_depth = 3, gamma = 0.5, n_estimators=600, objective='binary:logistic', silent=True, nthread=1)) model_xgb.fit(X_train_lime, y_train_lime)
/Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py:351: FutureWarning: The handling of integer data will change in version 0.22. Currently, the categories are determined based on the range [0, max(values)], while in the future they will be determined based on the unique values. If you want the future behavior and silence this warning, you can specify "categories='auto'."In case you used a LabelEncoder before this OneHotEncoder to convert the categories to integers, then you can now use the OneHotEncoder directly. warnings.warn(msg, FutureWarning)
Pipeline(memory=None, steps=[('columntransformer', ColumnTransformer(n_jobs=1, remainder='drop', transformer_weights=None, transformers=[('standardscaler', StandardScaler(copy=True, with_mean=True, with_std=True), [0, 2, 10, 4, 11, 12]), ('onehotencoder', OneHotEncoder(categorical_features=None, categories=None,... reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None, silent=True, subsample=1))])
ستتلقى تحذيرًا. يوضح التحذير أنك لست بحاجة إلى إنشاء مشفر تسمية قبل خط الأنابيب. إذا كنت لا تريد استخدام LIME، فلا بأس من استخدام الطريقة من الجزء الأول من البرنامج التعليمي Machine Learning with Scikit-learn. بخلاف ذلك، يمكنك الاستمرار في هذه الطريقة، أولاً قم بإنشاء مجموعة بيانات مشفرة، واضبط الحصول على المشفر الأكثر شيوعًا داخل خط الأنابيب.
print("best logistic regression from grid search: %f" % model_xgb.score(X_test_lime, y_test_lime))
best logistic regression from grid search: 0.873157
model_xgb.predict_proba(X_test_lime)
array([[7.9646105e-01, 2.0353897e-01], [9.5173013e-01, 4.8269872e-02], [7.9344827e-01, 2.0655173e-01], ..., [9.9031430e-01, 9.6856682e-03], [6.4581633e-04, 9.9935418e-01], [9.7104281e-01, 2.8957171e-02]], dtype=float32)
قبل استخدام LIME في العمل، دعنا ننشئ مصفوفة numpy بخصائص التصنيف الخاطئ. يمكنك استخدام هذه القائمة لاحقًا للحصول على فكرة حول ما يضلّل المصنف.
temp = pd.concat([X_test_lime, y_test_lime], axis= 1) temp['predicted'] = model_xgb.predict(X_test_lime) temp['wrong']= temp['label'] != temp['predicted'] temp = temp.query('wrong==True').drop('wrong', axis=1) temp= temp.sort_values(by=['label']) temp.shape
(826، 16)
يمكنك إنشاء دالة لامدا لاسترداد التنبؤ من النموذج الذي يحتوي على البيانات الجديدة. سوف تحتاج إليها قريبا.
predict_fn = lambda x: model_xgb.predict_proba(x).astype(float) X_test_lime.dtypes
age float64 workclass int64 fnlwgt float64 education int64 education_num float64 marital int64 occupation int64 relationship int64 race int64 sex int64 capital_gain float64 capital_loss float64 hours_week float64 native_country int64 dtype: object
predict_fn(X_test_lime)
array([[7.96461046e-01, 2.03538969e-01], [9.51730132e-01, 4.82698716e-02], [7.93448269e-01, 2.06551731e-01], ..., [9.90314305e-01, 9.68566816e-03], [6.45816326e-04, 9.99354184e-01], [9.71042812e-01, 2.89571714e-02]])
يمكنك تحويل إطار بيانات الباندا إلى صفيف numpy
X_train_lime = X_train_lime.values X_test_lime = X_test_lime.values X_test_lime
array([[4.00000e+01, 5.00000e+00, 1.93524e+05, ..., 0.00000e+00, 4.00000e+01, 3.80000e+01], [2.70000e+01, 4.00000e+00, 2.16481e+05, ..., 0.00000e+00, 4.00000e+01, 3.80000e+01], [2.50000e+01, 4.00000e+00, 2.56263e+05, ..., 0.00000e+00, 4.00000e+01, 3.80000e+01], ..., [2.80000e+01, 6.00000e+00, 2.11032e+05, ..., 0.00000e+00, 4.00000e+01, 2.50000e+01], [4.40000e+01, 4.00000e+00, 1.67005e+05, ..., 0.00000e+00, 6.00000e+01, 3.80000e+01], [5.30000e+01, 4.00000e+00, 2.57940e+05, ..., 0.00000e+00, 4.00000e+01, 3.80000e+01]])
model_xgb.predict_proba(X_test_lime)
array([[7.9646105e-01, 2.0353897e-01], [9.5173013e-01, 4.8269872e-02], [7.9344827e-01, 2.0655173e-01], ..., [9.9031430e-01, 9.6856682e-03], [6.4581633e-04, 9.9935418e-01], [9.7104281e-01, 2.8957171e-02]], dtype=float32)
print(features, class_names, categorical_features, categorical_names)
['age', 'workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country'] ['<=50K' '>50K'] [1, 3, 5, 6, 7, 8, 9, 13] {'workclass': array(['?', 'Federal-gov', 'Local-gov', 'Never-worked', 'Private', 'Self-emp-inc', 'Self-emp-not-inc', 'State-gov', 'Without-pay'], dtype=object), 'education': array(['10th', '11th', '12th', '1st-4th', '5th-6th', '7th-8th', '9th', 'Assoc-acdm', 'Assoc-voc', 'Bachelors', 'Doctorate', 'HS-grad', 'Masters', 'Preschool', 'Prof-school', 'Some-college'], dtype=object), 'marital': array(['Divorced', 'Married-AF-spouse', 'Married-civ-spouse', 'Married-spouse-absent', 'Never-married', 'Separated', 'Widowed'], dtype=object), 'occupation': array(['?', 'Adm-clerical', 'Armed-Forces', 'Craft-repair', 'Exec-managerial', 'Farming-fishing', 'Handlers-cleaners', 'Machine-op-inspct', 'Other-service', 'Priv-house-serv', 'Prof-specialty', 'Protective-serv', 'Sales', 'Tech-support', 'Transport-moving'], dtype=object), 'relationship': array(['Husband', 'Not-in-family', 'Other-relative', 'Own-child', 'Unmarried', 'Wife'], dtype=object), 'race': array(['Amer-Indian-Eskimo', 'Asian-Pac-Islander', 'Black', 'Other', 'White'], dtype=object), 'sex': array(['Female', 'Male'], dtype=object), 'native_country': array(['?', 'Cambodia', 'Canada', 'China', 'Columbia', 'Cuba', 'Dominican-Republic', 'Ecuador', 'El-Salvador', 'England', 'France', 'Germany', 'Greece', 'Guatemala', 'Haiti', 'Honduras', 'Hong', 'Hungary', 'India', 'Iran', 'Ireland', 'Italy', 'Jamaica', 'Japan', 'Laos', 'Mexico', 'Nicaragua', 'Outlying-US(Guam-USVI-etc)', 'Peru', 'Philippines', 'Poland', 'Portugal', 'Puerto-Rico', 'Scotland', 'South', 'Taiwan', 'Thailand', 'Trinadad&Tobago', 'United-States', 'Vietnam', 'Yugoslavia'], dtype=object)}
import lime import lime.lime_tabular ### Train should be label encoded not one hot encoded explainer = lime.lime_tabular.LimeTabularExplainer(X_train_lime , feature_names = features, class_names=class_names, categorical_features=categorical_features, categorical_names=categorical_names, kernel_width=3)
دعنا نختار أسرة عشوائية من مجموعة الاختبار ونرى التنبؤ بالنموذج وكيف قام الكمبيوتر باختياره.
import numpy as np np.random.seed(1) i = 100 print(y_test_lime.iloc[i]) >50K
X_test_lime[i]
array([4.20000e+01, 4.00000e+00, 1.76286e+05, 7.00000e+00, 1.20000e+01, 2.00000e+00, 4.00000e+00, 0.00000e+00, 4.00000e+00, 1.00000e+00, 0.00000e+00, 0.00000e+00, 4.00000e+01, 3.80000e+01])
يمكنك استخدام الشرح مع الشرح للتحقق من الشرح الموجود خلف النموذج
exp = explainer.explain_instance(X_test_lime[i], predict_fn, num_features=6) exp.show_in_notebook(show_all=False)
يمكننا أن نرى أن المصنف تنبأ بالأسرة بشكل صحيح. والواقع أن الدخل يتجاوز 50 ألفًا.
أول شيء يمكننا قوله هو أن المُصنِّف ليس متأكدًا من الاحتمالات المتوقعة. تتنبأ الآلة بأن دخل الأسرة يتجاوز 50 ألف دولار باحتمال 64%. تتكون هذه النسبة 64% من مكاسب رأس المال والزواج. يساهم اللون الأزرق سلبًا في الفئة الإيجابية والخط البرتقالي، بشكل إيجابي.
إن المصنف مشوش لأن مكاسب رأس المال لهذه الأسرة معدومة، في حين أن مكاسب رأس المال عادة ما تكون مؤشراً جيداً للثروة. فضلاً عن ذلك، تعمل الأسرة أقل من 40 ساعة في الأسبوع. ويساهم العمر والمهنة والجنس بشكل إيجابي في المصنف.
إذا كانت الحالة الاجتماعية عازبة، فإن المصنف كان ليتوقع دخلاً أقل من 50 ألف دولار (0.64-0.18 = 0.46)
يمكننا أن نحاول مع أسرة أخرى تم تصنيفها بشكل خاطئ
temp.head(3) temp.iloc[1,:-2]
age 58 workclass 4 fnlwgt 68624 education 11 education_num 9 marital 2 occupation 4 relationship 0 race 4 sex 1 capital_gain 0 capital_loss 0 hours_week 45 native_country 38 Name: 20931, dtype: object
i = 1 print('This observation is', temp.iloc[i,-2:])
This observation is label <=50K predicted >50K Name: 20931, dtype: object
exp = explainer.explain_instance(temp.iloc[1,:-2], predict_fn, num_features=6) exp.show_in_notebook(show_all=False)
وتوقع المصنف دخلاً أقل من 50 ألفًا وهو غير صحيح. هذه الأسرة تبدو غريبة. ليس لديها مكاسب رأسمالية، ولا خسارة رأسمالية. وهو مطلق ويبلغ من العمر 60 عامًا، وهو من الأشخاص المتعلمين، أي رقم التعليم > 12. ووفقًا للنمط العام، يجب أن تحصل هذه الأسرة، كما أوضح المصنف، على دخل أقل من 50 ألفًا.
تحاول اللعب مع LIME. ستلاحظ أخطاء جسيمة من المصنف.
يمكنك التحقق من GitHub الخاص بصاحب المكتبة. أنها توفر وثائق إضافية لتصنيف الصور والنصوص.
الملخص
فيما يلي قائمة ببعض الأوامر المفيدة مع إصدار scikit learn >=0.20
إنشاء مجموعة بيانات التدريب/الاختبار | انقسام المتدربين |
بناء خط أنابيب | |
حدد العمود وقم بتطبيق التحويل | com.makecolumntransformer |
نوع التحول | |
توحيد | مقياس قياسي |
الحد الأدنى - الحد الأقصى | MinMaxScaler |
تطبيع | عادي |
إسناد القيمة المفقودة | نسب |
تحويل الفئوية | OneHotEncoder |
ملاءمة البيانات وتحويلها | fit_transform |
اصنع خط الانابيب | make_pipeline |
النموذج الأساسي | |
الانحدار اللوجستي | الانحدار اللوجستي |
XGBoost | XGBClassifier |
الشبكة العصبية | MLPC التصنيف |
بحث الشبكة | GridSearchCV |
بحث عشوائي | البحث العشوائي |