مقدمة عن تعلم الآلة بإستخدام scikit-learn (الجزء الاول)

517

تعلم الآلة Machine Learning هو فرع في علوم الكمبيوتر يدرس تصميم الخوارزميات التي تُمكن الآلة من أن تتعلم بنفسها.

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

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

في هذا المقال نتحدث عن scikit-learn و هي مكتبة برمجية بلغة Python للMachine Learning:

  •  ستتعلم كيفية استخدام Python ومكتباتها لاستكشاف بياناتك بمساعدة Matplotlib وتحليل المكون الرئيسي (PCA).
  • تجهيز بياناتك مسبقًا مع ترتيبها وتقسيم بياناتك إلى مجموعات تدريب واختبار.
  • التعامل مع خوارزمية K Means المعروفة لبناء نموذج غير خاضع للإشراف، وتكيًف هذا النموذج مع بياناتك، وتنبؤ بالقيم، والتحقق من صحة النموذج الذي قمت ببنائه.
  • وكإضافة، سترى أيضًا كيف يمكنك أيضًا استخدام خوارزمية (Support Vector Machines (SVM لإنشاء نموذج آخر لتصنيف بياناتك.

تحميل مجموعة البيانات الخاصة بك

الخطوة الأولى نحو أي شيء في علم البيانات هي تحميل البيانات الخاصة بك. هذا هو أيضا نقطة انطلاق هذا المقال.

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

إذا كنت جديدًا على هذا, فقد يمثل العثور على مجموعات البيانات هذه تحديًا. ومع ذلك، يمكنك عادةً العثور على مجموعات بيانات جيدة في مستودع بيانات UCI Machine Learning أو على موقع  Kaggle. راجع أيضًا قائمة KD Nuggets.

في الوقت الحالي، يجب عليك الاحماء، لا تقلق بشأن العثور على أي بيانات من قبل نفسك وتحميل فقط في مجموعة البيانات الرقمية digits التي تأتي مع مكتبة Python البرمجية – scikit-learn.

لتحميل البيانات، نقوم باستيراد وحدة datasets من sklearn. بعد ذلك، يمكنك استخدام الأسلوب()load_digits من مجموعات البيانات للتحميل :

# Import `datasets` from `sklearn`
from sklearn import datasets

# Load in the `digits` data
digits = datasets.load_digits()

# Print the `digits` data 
print(digits)

النتيجة.

{'target_names': array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), 'target': array([0, 1, 2, ..., 8, 9, 8]), 'data': array([[  0.,   0.,   5., ...,   0.,   0.,   0.],
           [  0.,   0.,   0., ...,  10.,   0.,   0.],
           [  0.,   0.,   0., ...,  16.,   9.,   0.],
           ..., 
           [  0.,   0.,   1., ...,   6.,   0.,   0.],
           [  0.,   0.,   2., ...,  12.,   0.,   0.],
           [  0.,   0.,  10., ...,  12.,   1.,   0.]]), 'DESCR': "Optical Recognition of Handwritten Digits Data Set\n===================================================\n\nNotes\n-----\nData Set Characteristics:\n    :Number of Instances: 5620\n    :Number of Attributes: 64\n    :Attribute Information: 8x8 image of integer pixels in the range 0..16.\n    :Missing Attribute Values: None\n    :Creator: E. Alpaydin (alpaydin '@' boun.edu.tr)\n    :Date: July; 1998\n\nThis is a copy of the test set of the UCI ML hand-written digits datasets\nhttp://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits\n\nThe data set contains images of hand-written digits: 10 classes where\neach class refers to a digit.\n\nPreprocessing programs made available by NIST were used to extract\nnormalized bitmaps of handwritten digits from a preprinted form. From a\ntotal of 43 people, 30 contributed to the training set and different 13\nto the test set. 32x32 bitmaps are divided into nonoverlapping blocks of\n4x4 and the number of on pixels are counted in each block. This generates\nan input matrix of 8x8 where each element is an integer in the range\n0..16. This reduces dimensionality and gives invariance to small\ndistortions.\n\nFor info on NIST preprocessing routines, see M. D. Garris, J. L. Blue, G.\nT. Candela, D. L. Dimmick, J. Geist, P. J. Grother, S. A. Janet, and C.\nL. Wilson, NIST Form-Based Handprint Recognition System, NISTIR 5469,\n1994.\n\nReferences\n----------\n  - C. Kaynak (1995) Methods of Combining Multiple Classifiers and Their\n    Applications to Handwritten Digit Recognition, MSc Thesis, Institute of\n    Graduate Studies in Science and Engineering, Bogazici University.\n  - E. Alpaydin, C. Kaynak (1998) Cascading Classifiers, Kybernetika.\n  - Ken Tang and Ponnuthurai N. Suganthan and Xi Yao and A. Kai Qin.\n    Linear dimensionalityreduction using relevance weighted LDA. School of\n    Electrical and Electronic Engineering Nanyang Technological University.\n    2005.\n  - Claudio Gentile. A New Approximate Maximal Margin Classification\n    Algorithm. NIPS. 2000.\n", 
 'images': array([[[  0.,   0.,   5., ...,   1.,   0.,   0.],
            [  0.,   0.,  13., ...,  15.,   5.,   0.],
            [  0.,   3.,  15., ...,  11.,   8.,   0.],
            ..., 
            [  0.,   4.,  11., ...,  12.,   7.,   0.],
            [  0.,   2.,  14., ...,  12.,   0.,   0.],
            [  0.,   0.,   6., ...,   0.,   0.,   0.]],
    
           [[  0.,   0.,   0., ...,   5.,   0.,   0.],
            [  0.,   0.,   0., ...,   9.,   0.,   0.],
            [  0.,   0.,   3., ...,   6.,   0.,   0.],
            ..., 
            [  0.,   0.,   1., ...,   6.,   0.,   0.],
            [  0.,   0.,   1., ...,   6.,   0.,   0.],
            [  0.,   0.,   0., ...,  10.,   0.,   0.]],
    
           [[  0.,   0.,   0., ...,  12.,   0.,   0.],
            [  0.,   0.,   3., ...,  14.,   0.,   0.],
            [  0.,   0.,   8., ...,  16.,   0.,   0.],
            ..., 
            [  0.,   9.,  16., ...,   0.,   0.,   0.],
            [  0.,   3.,  13., ...,  11.,   5.,   0.],
            [  0.,   0.,   0., ...,  16.,   9.,   0.]],
    
           ..., 
           [[  0.,   0.,   1., ...,   1.,   0.,   0.],
            [  0.,   0.,  13., ...,   2.,   1.,   0.],
            [  0.,   0.,  16., ...,  16.,   5.,   0.],
            ..., 
            [  0.,   0.,  16., ...,  15.,   0.,   0.],
            [  0.,   0.,  15., ...,  16.,   0.,   0.],
            [  0.,   0.,   2., ...,   6.,   0.,   0.]],
    
           [[  0.,   0.,   2., ...,   0.,   0.,   0.],
            [  0.,   0.,  14., ...,  15.,   1.,   0.],
            [  0.,   4.,  16., ...,  16.,   7.,   0.],
            ..., 
            [  0.,   0.,   0., ...,  16.,   2.,   0.],
            [  0.,   0.,   4., ...,  16.,   2.,   0.],
            [  0.,   0.,   5., ...,  12.,   0.,   0.]],
    
           [[  0.,   0.,  10., ...,   1.,   0.,   0.],
            [  0.,   2.,  16., ...,   1.,   0.,   0.],
            [  0.,   0.,  15., ...,  15.,   0.,   0.],
            ..., 
            [  0.,   4.,  16., ...,  16.,   6.,   0.],
            [  0.,   8.,  16., ...,  16.,   8.,   0.],
            [  0.,   1.,   8., ...,  12.,   1.,   0.]]])}

لاحظ أن وحدة datasets تحتوي أساليب أخرى لتحميل وجلب مجموعات البيانات، ويمكنك أيضا الاعتماد على هذه الوحدة في حال كنت بحاجة لتوليد البيانات الاصطناعية. بالإضافة إلى ذلك، تتوفر مجموعة البيانات هذه أيضًا من خلال مستودع UCI المذكور أعلاه: يمكنك العثور على البيانات هنا.

إذا كنت قد قررت سحب البيانات من المستودع، فستبدو عملية استيراد البيانات كما يلي:

# Import the `pandas` library as `pd`
import pandas as pd

# Load in the data with `read_csv()`
digits = pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/optdigits/optdigits.tra", header=None)

# Print out `digits`
print(digits)

النتيجة.

output:
          0   1   2   3   4   5   6   7   8   9  ...  55  56  57  58  59  60  61  \
    0      0   1   6  15  12   1   0   0   0   7 ...   0   0   0   6  14   7   1   
    1      0   0  10  16   6   0   0   0   0   7 ...   0   0   0  10  16  15   3   
    2      0   0   8  15  16  13   0   0   0   1 ...   0   0   0   9  14   0   0   
    3      0   0   0   3  11  16   0   0   0   0 ...   0   0   0   0   1  15   2   
    4      0   0   5  14   4   0   0   0   0   0 ...   0   0   0   4  12  14   7   
    5      0   0  11  16  10   1   0   0   0   4 ...   3   0   0  10  16  16  16   
    6      0   0   1  11  13  11   7   0   0   0 ...   0   0   0   1  13   5   0   
    7      0   0   8  10   8   7   2   0   0   1 ...   0   0   0   4  13   8   0   
    8      0   0  15   2  14  13   2   0   0   0 ...   0   0   0  10  12   5   0   
    9      0   0   3  13  13   2   0   0   0   6 ...   0   0   0   3  15  11   6   
    10     0   0   6  14  14  16  16   8   0   0 ...   0   0   0  10  12   0   0   
    11     0   0   0   3  16  11   1   0   0   0 ...   0   0   0   0   2  14  14   
    12     0   0   0   4  13  16  16   3   0   0 ...   0   0   0   0   5  15   4   
    13     0   0   7  12   6   2   0   0   0   0 ...   0   0   0   5  16   9   0   
    14     0   0   7  11  11   6   0   0   0   9 ...   0   0   0  14  16  12  10   
    15     0   1  10  15   8   0   0   0   0   6 ...   0   0   0   9  15   8   0   
    16     0   0   0   1  11   7   0   0   0   0 ...   0   0   0   0   3  15   0   
    17     0   0   5  12  16  16   3   0   0   0 ...   0   0   0   8  12   0   0   
    18     0   0   1   8  13  13   2   0   0   4 ...   0   0   0   1  13  12   4   
    19     0   0   0   2  13  12   4   0   0   0 ...   0   0   0   0   0  15   3   
    20     0   0   4  11  15  16  15   0   0   0 ...   0   0   0   6  14   2   0   
    21     0   0   4  10  13  11   1   0   0   2 ...   0   0   0   6  13  11   1   
    22     0   0   3  11  13  14   6   0   0   0 ...   0   0   0   3  13  10   0   
    23     0   0   1   4  11  13   7   0   0   2 ...   0   0   0   0   1  14   3   
    24     0   0   9  13   1   0   0   0   0   0 ...   5   0   0   4  15  16  16   
    25     0   0   9  16  11   0   0   0   0   4 ...   1   0   0  10  16   9   9   
    26     0   0   2  13   9   0   0   0   0   0 ...   0   0   0   3  16  14   4   
    27     0   0   0  10  12   0   0   0   0   0 ...   0   0   0   1  11  14  12   
    28     0   0   0   0  10  13   0   0   0   0 ...   0   0   0   0   0   8  15   
    29     0   0   7   9  13  11   2   0   0   6 ...   0   0   0  13  12   8   1   
    ...   ..  ..  ..  ..  ..  ..  ..  ..  ..  .. ...  ..  ..  ..  ..  ..  ..  ..   
    3793   0   0  15  15  16  14   1   0   0   3 ...   0   0   0  15  16  12   0   
    3794   0   0   2  13  16  15   4   0   0   0 ...   0   0   0   3  14   1   0   
    3795   0   0  12  16   7   0   0   0   0   2 ...   0   0   0  11  16  16  16   
    3796   0   0   0   3  13   0   0   0   0   0 ...   0   0   0   0   6  12   0   
    3797   0   0   0  12   8   0   0   0   0   0 ...   0   0   0   0  14   6   0   
    3798   0   0   0   9  12   0   0   0   0   0 ...   0   0   0   0  10  11   0   
    3799   0   0   5  16  13   1   0   0   0   0 ...   0   0   1   6  10  12  12   
    3800   0   0   6  16   8   0   0   0   0   2 ...   0   0   0   7  13  16  13   
    3801   0   0   5  16  11   0   0   0   0   1 ...   0   0   0   4  14  12   2   
    3802   0   1  12  16  14   4   0   0   0   8 ...   0   0   0  13  15  15  10   
    3803   0   0   3  14  13   3   0   0   0   0 ...   0   0   0   3  13  13   6   
    3804   0   0  12  16  16  10   1   0   0   0 ...   0   0   1  10  16  16  16   
    3805   0   0   0   8  11   0   0   0   0   0 ...   0   0   0   0   7  12   0   
    3806   0   1   9  16  14   6   0   0   0   5 ...   0   0   0  11  16   7   0   
    3807   0   0   4  14  15   3   0   0   0   0 ...   0   0   0   3  14  14   6   
    3808   0   2  15  16  15   1   0   0   0   3 ...   0   0   0  14  13  16  11   
    3809   0   0   5  15  16   6   0   0   0   0 ...   0   0   0   5  15  16  15   
    3810   0   0   4  16  11   1   0   0   0   0 ...   0   0   0   2  12  16  11   
    3811   0   0   0   0   7  11   1   0   0   0 ...   0   0   0   2   0   7  11   
    3812   0   0   0   6  13   0   0   0   0   0 ...   0   0   0   0   6   9   0   
    3813   0   0   0   6   8   0   0   0   0   0 ...   0   0   1   4   9   8   0   
    3814   0   0   9  16   6   0   0   0   0   2 ...   0   0   0  10  13   1   0   
    3815   0   0   9  16  12   1   0   0   0   3 ...   0   0   0   8  16  16  16   
    3816   0   1  10  16  16   4   0   0   0   8 ...   0   0   2  13  16  12   5   
    3817   0   0   6  16  11   0   0   0   0   1 ...   0   0   1   7  14  16  12   
    3818   0   0   5  13  11   2   0   0   0   2 ...   0   0   0   8  13  15  10   
    3819   0   0   0   1  12   1   0   0   0   0 ...   0   0   0   0   4   9   0   
    3820   0   0   3  15   0   0   0   0   0   0 ...   0   0   0   4  14  16   9   
    3821   0   0   6  16   2   0   0   0   0   0 ...   0   0   0   5  16  16  16   
    3822   0   0   2  15  16  13   1   0   0   0 ...   0   0   0   4  14   1   0   
    
          62  63  64  
    0      0   0   0  
    1      0   0   0  
    2      0   0   7  
    3      0   0   4  
    4      0   0   6  
    5     16   6   2  
    6      0   0   5  
    7      0   0   5  
    8      0   0   0  
    9      0   0   8  
    10     0   0   7  
    11     1   0   1  
    12     0   0   9  
    13     0   0   5  
    14     1   0   3  
    15     0   0   0  
    16     0   0   4  
    17     0   0   7  
    18     0   0   8  
    19     0   0   4  
    20     0   0   7  
    21     0   0   8  
    22     0   0   5  
    23     0   0   9  
    24    16  16   1  
    25    13   6   2  
    26     0   0   0  
    27     1   0   6  
    28     2   0   1  
    29     0   0   8  
    ...   ..  ..  ..  
    3793   0   0   5  
    3794   0   0   7  
    3795  16   8   2  
    3796   0   0   4  
    3797   0   0   4  
    3798   0   0   4  
    3799   2   0   9  
    3800   9   0   9  
    3801   0   0   0  
    3802   2   0   3  
    3803   0   0   0  
    3804   7   0   3  
    3805   0   0   4  
    3806   0   0   8  
    3807   0   0   0  
    3808   1   0   3  
    3809   1   0   0  
    3810   1   0   1  
    3811   0   0   1  
    3812   0   0   4  
    3813   0   0   4  
    3814   0   0   8  
    3815   8   0   9  
    3816   0   0   3  
    3817   1   0   9  
    3818   1   0   9  
    3819   0   0   4  
    3820   0   0   6  
    3821   5   0   6  
    3822   0   0   7  
    
    [3823 rows x 65 columns]

لاحظ أنه إذا قمت بتنزيل البيانات مثل هذه، فإن البيانات مقسمة بالفعل الي مجموعات, مجموعة التدريب ومجموعة الاختبار، يشار إليها بواسطة الامتداد tra. و tes. , ستحتاج إلى تحميل كلا الملفين لإتمام مشروعك. باستخدام الأمر الموضح أعلاه.

استكشف بياناتك

عند البدء باستخدام مجموعة بيانات لأول مرة، من الأفضل دائمًا الاطلاع على وصف البيانات. عندما يتعلق الأمر بscikit-learn هذه المعلومات لا تتوفر على الفور، ولكن في حالة استيراد البيانات من مصدر آخر، عادة ما يكون هناك وصف للبيانات، والذي سيكون بالفعل كمية كافية من المعلومات لاستكشاف بياناتك.

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

جمع المعلومات الأساسية عن بياناتك

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

عند طباعة بيانات الأرقام بعد تحميلها بمساعدة وحدة datasets، ستلاحظ أن هناك الكثير من المعلومات المتاحة بالفعل, مثل القيم المستهدفة ووصف بياناتك. ويمكنك الوصول إلى بيانات الأرقام من خلال رمز البيانات data. وبالمثل، يمكنك أيضًا الوصول إلى القيم المستهدفة من خلال رمز الهدف target والوصف من خلال رمز الوصف DESCR.

لمعرفة الرموز المتاحة للتعرف على البيانات الخاصة بك، يمكنك فقط تشغيل ()digits.keys .

# Get the keys of the `digits` data
print(digits.keys())

# Print out the data
print(digits.data)

# Print out the target values
print(digits.target)

# Print out the description of the `digits` data
print(digits.DESCR)

النتيجة.

output:
    dict_keys(['target', 'images', 'DESCR', 'target_names', 'data'])
    [[  0.   0.   5. ...,   0.   0.   0.]
     [  0.   0.   0. ...,  10.   0.   0.]
     [  0.   0.   0. ...,  16.   9.   0.]
     ..., 
     [  0.   0.   1. ...,   6.   0.   0.]
     [  0.   0.   2. ...,  12.   0.   0.]
     [  0.   0.  10. ...,  12.   1.   0.]]
    [0 1 2 ..., 8 9 8]
    Optical Recognition of Handwritten Digits Data Set
    ===================================================
    
    Notes
    -----
    Data Set Characteristics:
        :Number of Instances: 5620
        :Number of Attributes: 64
        :Attribute Information: 8x8 image of integer pixels in the range 0..16.
        :Missing Attribute Values: None
        :Creator: E. Alpaydin (alpaydin '@' boun.edu.tr)
        :Date: July; 1998
    
    This is a copy of the test set of the UCI ML hand-written digits datasets
    http://archive.ics.uci.edu/ml/datasets/Optical+Recognition+of+Handwritten+Digits
    
    The data set contains images of hand-written digits: 10 classes where
    each class refers to a digit.
    
    Preprocessing programs made available by NIST were used to extract
    normalized bitmaps of handwritten digits from a preprinted form. From a
    total of 43 people, 30 contributed to the training set and different 13
    to the test set. 32x32 bitmaps are divided into nonoverlapping blocks of
    4x4 and the number of on pixels are counted in each block. This generates
    an input matrix of 8x8 where each element is an integer in the range
    0..16. This reduces dimensionality and gives invariance to small
    distortions.
    
    For info on NIST preprocessing routines, see M. D. Garris, J. L. Blue, G.
    T. Candela, D. L. Dimmick, J. Geist, P. J. Grother, S. A. Janet, and C.
    L. Wilson, NIST Form-Based Handprint Recognition System, NISTIR 5469,
    1994.
    
    References
    ----------
      - C. Kaynak (1995) Methods of Combining Multiple Classifiers and Their
        Applications to Handwritten Digit Recognition, MSc Thesis, Institute of
        Graduate Studies in Science and Engineering, Bogazici University.
      - E. Alpaydin, C. Kaynak (1998) Cascading Classifiers, Kybernetika.
      - Ken Tang and Ponnuthurai N. Suganthan and Xi Yao and A. Kai Qin.
        Linear dimensionalityreduction using relevance weighted LDA. School of
        Electrical and Electronic Engineering Nanyang Technological University.
        2005.
      - Claudio Gentile. A New Approximate Maximal Margin Classification
        Algorithm. NIPS. 2000.
    

الشيء التالي الذي يمكنك (مضاعفة) التحقق منه هو نوع بياناتك.

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

ومع ذلك ، لنفترض أنك تستخدم بيانات المكتبة البرمجية وأن التعرف على نوع المتغير في البيانات ليس بهذه البساطة. اذا نظرت إلى نتيجة المثال الاول أعلاه. سترى أن البيانات تحتوي فعليًا على numpy arrays!

بالفعل هذه المعلومات هامة. ولكن كيف يمكنك الوصول إلى هذه arrays؟ الأمر سهل للغاية ، في الواقع: تستخدم الرموز للوصول إلى arrays ذات الصلة.

تذكر أنك قمت بالفعل بروية أي الرمزو متوفرة عند طباعة ()digits.keys . على سبيل المثال ، لديك رمز DATA لعزل البيانات ، و TARGET لرؤية القيم المستهدفة وDESCR للوصف ، …

لكن ماذا بعد؟

أول شيء يجب أن تعرفه عن array هو شكله. بمعنى ، عدد الأبعاد والعناصر الموجودة ضمن array. شكل array هو مجموعة من الأعداد الصحيحة التي تحدد حجم كل بُعد. وبعبارة أخرى ، إذا كان لديك array ثلاثي الأبعاد مثل ((y = np.zeros ((2 ، 3 ، 4 ، سيكون شكله (2،3،4).

نحاول الآن معرفة شكل هذه arrays الثلاث ذات الرموز (البيانات والهدف والوصف).

استخدم أولاً رمز DATA لعزل numpy array من مجموعة البيانات، ثم استخدم رمز Shape لمعرفة المزيد. يمكنك القيام بنفس الشيء للهدف وللوصف. هناك أيضًا رمز الصور ، وهي الصور الموجودة في البيانات.

# Isolate the `digits` data
digits_data = digits.data

# Inspect the shape
print(digits_data.shape)

# Isolate the target values with `target`
digits_target = digits.target

# Inspect the shape
print(digits_target.shape)

# Print the number of unique labels
number_digits = len(np.unique(digits.target))

# Isolate the `images`
digits_images = digits.images

# Inspect the shape
print(digits_images.shape)

النتيجة.

output:
    (1797, 64)
    (1797,)
    (1797, 8, 8)

للتلخيص: من خلال فحص digits.data ، سترى أن هناك 1797 عينة وأن هناك 64 خاصية. نظرًا لأن لديك 1797 نموذجًا ، فسيكون لديك أيضًا 1797 هدفًا.

لكن كل هذه القيم المستهدفة تحتوي على 10 قيم فريدة ، وهي من 0 إلى 9. وبعبارة أخرى ، تتكون جميع القيم المستهدفة 1797 من أرقام تقع بين 0 و 9. وهذا يعني أن الأرقام التي سيتعين على نموذجك التعرف عليها هي الأرقام من 0 إلى 9.

وأخيرًا ، سترى أن بيانات الصور تحتوي على ثلاثة أبعاد: هناك 1797 نسخة بحجم 8 × 8 بكسل. يمكنك التحقق بصريًا من ارتباط الصور والبيانات بإعادة تشكيل array الصور إلى بعدين: ((digits.images.reshape ((1797 ، 64.

ولكن إذا كنت تريد أن تكون متأكدا تماما ، من الأفضل أن تحقق مع

print(np.all(digits.images.reshape((1797,64)) == digits.data))

تصور صور البيانات الخاصة بك مع matplotlib

بعد ذلك ، يمكنك استكشاف أعمالك من خلال عرض المخططات التي ستعمل معها. يمكنك استخدام إحدى مكتبات التمثيل البصري للبيانات في Python ، مثل matplotlib ، لهذا الغرض:

# Import matplotlib
import matplotlib.pyplot as plt

# Figure size (width, height) in inches
fig = plt.figure(figsize=(6, 6))

# Adjust the subplots 
fig.subplots_adjust(left=0, right=1, bottom=0, top=1, hspace=0.05, wspace=0.05)

# For each of the 64 images
for i in range(64):
    # Initialize the subplots: add a subplot in the grid of 8 by 8, at the i+1-th position
    ax = fig.add_subplot(8, 8, i + 1, xticks=[], yticks=[])
    # Display an image at the i-th position
    ax.imshow(digits.images[i], cmap=plt.cm.binary, interpolation='nearest')
    # label the image with the target value
    ax.text(0, 7, str(digits.target[i]))

# Show the plot
plt.show()
  • تقوم باستيراد matplotlib.pyplot
  • بعد ذلك ، قمت بإعداد لوحة بحجم 6 بوصات و6 بوصات. هذه هي لوحة الرسم الفارغة حيث ستظهر كل المخططات الفرعية التي تحتوي على الصور.
  • ثم تذهب إلى مستوى المخططات الفرعية لتعديل بعض العوامل المتغيرة parameters: تقوم بتعيين الجانب الأيسر من المخططات الفرعية إلى 0 ، الجانب الأيمن من المخططات الفرعية  إلى 1 ، القاع إلى 0 والأعلى إلى 1. يتم تعيين ارتفاع المسافة الفارغة بين المخططات الفرعية في 0.005 ويتم تعيين العرض في 0.05. هذه مجرد تعديلات تنسيقية.
  • بعد ذلك ، تبدأ في ملء اللوحة التي قمت بإنشائها بمساعدة for loop.
  • يمكنك تهيئة المخططات الفرعية واحدة تلو الأخرى ، إضافة واحد في كل موقف في الشبكة التي هي  صوره 8*8.
  • تقوم بعرض كل مرة واحدة من الصور في كل موضع في الشبكة. كخريطة ملونة ، فإنك تأخذ ألوانًا ثنائية ، والتي في هذه الحالة ستؤدي إلى ظهور قيم سوداء ورمادية وألوان بيضاء. طريقة التوليد interpolation التي تستخدمها لانتاج الصور هنا هي “التقريب” ، مما يعني أن البيانات الخاصة بك يتم تقريبها نسبة إلى pixels القريبة منها فقط فتنتج صورة ليست حادة وواضحة. يمكنك رؤية تأثير أساليب interpolation المختلفة هنا.
  • الكرز على الكعكة هنا هو إضافة نص إلى المخططات الفرعية. تتم طباعة التسميات المستهدفة في إحداثيات (0،7) من كل مخطط فرعي ، والتي تعني عمليًا أنها ستظهر في الجزء السفلي الأيسر من كل مخطط فرعي.
  • لا تنس أن تظهر المخطط مع ()plt.show .

في النهاية ، سترى ما يلي:

يمكنك أيضًا عرض التسميات المستهدفة مع صورة ، تمامًا كما يلي:

# Import matplotlib
import matplotlib.pyplot as plt 

# Join the images and target labels in a list
images_and_labels = list(zip(digits.images, digits.target))

# for every element in the list
for index, (image, label) in enumerate(images_and_labels[:8]):
    # initialize a subplot of 2X4 at the i+1-th position
    plt.subplot(2, 4, index + 1)
    # Don't plot any axes
    plt.axis('off')
    # Display images in all subplots 
    plt.imshow(image, cmap=plt.cm.gray_r,interpolation='nearest')
    # Add a title to each subplot
    plt.title('Training: ' + str(label))

# Show the plot
plt.show()

لاحظ أنه في هذه الحالة ، بعد استيراد matplotlib.pyplot ، تمكنك ضغط 2 arrays متشابكين معًا وحفظهم في متغير جديد يسمى images_and_labels. سترى الآن أن هذه القائمة تحتوي على digits.images وقيمة digits.target مقابلة لها معا.

بعد ذلك ، بالنسبة إلى العناصر الثمانية الأولى من images_and_labels ، لاحظ أن الفهرس يبدأ عند 0! – ، يمكنك تهيئة المخططات الفرعية في شبكة من 2 × 4 في كل موضع. تقوم باخفاء محاور الرسم وتعرض صورًا في كل المخططات الفرعية مع خريطة ملونة plt.cm.gray_r (والتي تُرجع كل الألوان الرمادية) وأسلوب interpolation المستخدم هو “التقريب”. أنت تعطي عنوانًا لكل مخطط فرعي ، وتعرضه.

ليس من الصعب جدا ، هاه؟ والآن قد تكون تعرفت جيدًا عن البيانات التي ستعمل معها.

تصور البيانات الخاصة بك: تحليل المكون الرئيسي (PCA)

ولكن هل هناك طريقة أخرى لتصور البيانات؟

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

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

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

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

أن كل ذلك يفسر لماذا أنت بصدد تصوير البيانات بمساعدة إحدى تقنيات تقليل الأبعاد ، بالتحليل الأساسي للمكونات (PCA). الفكرة في PCA هي العثور على مجموعة خطية linear من المتغيرين يتضمنها معظم المعلومات. وهذا المتغير الجديد أو “المكون الأساسي” يمكن أن يحل محل المتغيرين الأصليين.

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

يمكنك بسهولة تطبيق PCA القيام ببياناتك بمساعدة scikit-learn:

# Create a Randomized PCA model that takes two components
randomized_pca = RandomizedPCA(n_components=2)

# Fit and transform the data to the model
reduced_data_rpca = randomized_pca.fit_transform(digits.data)

# Create a regular PCA model 
pca = PCA(n_components=2)

# Fit and transform the data to the model
reduced_data_pca = pca.fit_transform(digits.data)

# Inspect the shape
reduced_data_pca.shape

# Print out the data
print(reduced_data_rpca)
print(reduced_data_pca)

النتيجة.

output:
    [[ -1.25785309  21.29720907]
     [  7.96280354 -20.78086906]
     [  6.99114122  -9.95070003]
     ..., 
     [ 10.75652439  -7.00354675]
     [ -4.90135105  12.40288271]
     [ -0.38821194   6.32578623]]
    [[ -1.25946946  21.27489406]
     [  7.95761185 -20.7687018 ]
     [  6.99192616  -9.95599763]
     ..., 
     [ 10.80128002  -6.96023674]
     [ -4.8720977   12.42394275]
     [ -0.3443934    6.36556546]]

نصيحة: لقد استخدمت ()RandomizedPCA هنا ؛ لأنها تحقق أداءً أفضل عند وجود عدد كبير من الأبعاد. حاول استبدال نموذج PCA  العشوائي بنموذج PCA منتظم ورؤيه الفرق.

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

يمكنك الآن إنشاء المخطط المبعثر scatterplot لتصور البيانات:

colors = ['black', 'blue', 'purple', 'yellow', 'white', 'red', 'lime', 'cyan', 'orange', 'gray']
for i in range(len(colors)):
    x = reduced_data_rpca[:, 0][digits.target == i]
    y = reduced_data_rpca[:, 1][digits.target == i]
    plt.scatter(x, y, c=colors[i])
plt.legend(digits.target_names, bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plt.xlabel('First Principal Component')
plt.ylabel('Second Principal Component')
plt.title("PCA Scatter Plot")
plt.show()

الذي يبدو مثل هذا:

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

  • وضعت الألوان الخاصة بك معا في القائمة. لاحظ أنك تقوم بإدراج عشرة ألوان ، والتي تساوي عدد التسميات التي لديك. بهذه الطريقة ، تأكد من أن نقاط بياناتك يمكن تلوينها وفقًا للتصنيفات. بعد ذلك ، قمت بإعداد نطاق يتراوح من 0 إلى 10لاعطاء كلٌ منهم لون معين.
  • قمت بإعداد إحداثيات x وy. أنت تأخذ العمود الأول أو الثاني من reduced_data_rpca ، وتختار فقط نقاط البيانات تلك التي تساوي القيمة في  الفهرس. وهذا يعني أنه في الجولة الأولى ، ستضع في اعتبارك نقاط البيانات التي تتضمن التصنيف 0 ، ثم التصنيف 1 ، … وهكذا.
  • يمكنك بناء المخطط المبعثر scatterplot . املأ إحداثيات x وy وقم بتعيين لون إلى الدُفعة التي تقوم بمعالجتها. في المرة الأولى ، ستعطي اللون الأسود لجميع نقاط البيانات ، والزرق التالي ،… وهكذا.
  • يمكنك إضافة وسيلة لإيضاح المخطط المبعثر scatterplot الخاص بك. أستخدم صفه target_names للحصول على التصنيفات المناسبة لنقاط البيانات الخاصة بك.
  • تضيف مسميات إلى محاور x وy ذات معنى.
  • وتكشف عن المخطط الناتج.

وبذلك ينتهي الجزء الاول, ونكمل تجربة الخوارزميات في الجزء الثاني ان شاء الله.

المصدر: Data camp, Machine Learning Python

تعليقات