البرنامج التعليمي 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

ليس من الصعب جدًا استخدام 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 إلى قسمين:

  1. التعلم الآلي باستخدام scikit-Learn
  2. كيف تثق بنموذجك مع 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

سيقوم خط الأنابيب بإجراء عمليتين قبل تغذية المصنف اللوجستي:

  1. توحيد المتغير: `StandardScaler()"
  2. تحويل الميزات الفئوية: 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
بحث عشوائي البحث العشوائي