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

201

ولأن بعد ان قمنا باستطلاع البيانات وعرضها في مخططات بيانية متعددة في الجزء الاول. سنكمل الان حديثنا عن تحضير البيانات واستخدام خوارزميات Machine Learning.

إلى أين الآن؟

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

وهذا قد يكون مثيرا للاهتمام لمزيد من التحقيق.

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

من هناك، يمكنك التفكير في نوع الخوارزميات التي يمكنك تطبيقها على مجموعة البيانات الخاصة بك من أجل الحصول على النتائج التي المرجوة.

نصيحة: كلما زادت معرفتك ببياناتك، كان من الأسهل تقييم حالات الاستخدام لمجموعة البيانات. وينطبق الأمر نفسه أيضًا على العثور على خوارزمية Machine Leaning المناسبة.

ومع ذلك، عند بدء استخدام scikit-learn لأول مرة، سترى أن مقدار الخوارزميات التي تحتوي عليها هذة المكتبة البرمجية كبير جدًا وأنك قد تحتاج إلى مساعدة إضافية لاختيار الخوارزمية المناسبة. هذا هو السبب في أن هذه الخريطة scikit Machine Learning في المتناول. لاحظ أن التعامل مع هذه الخريطة يتطلب منك بعض المعرفة عن الخوارزميات المتضمنة في مكتبة scikit-learn.

نظرًا لأن في حالتنا هذه استخدمنا طريقة التقسيم وانشاء المجموعات clustering، فيمكنك اتباع المسار على الخريطة تجاه خوارزمية “K-Means”.

ولكن ما هي بالضبط خوارزمية K-Means؟

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

لذا، فإن هذه خوارزمية ستجد أقرب مركز مجموعة لكل نقطة بيانات وتعيين نقطة البيانات هذه الي أقرب مجموعة.

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

بالطريقة التي تعمل بها خوارزمية k-means، يمكن للتكوين الاولي لمراكز المجموعات الذي قمت بإدخاله تأثير كبير على المجموعات الناتجة في النهاية. يمكنك بالطبع التعامل مع هذا التأثير، كما سترى المزيد.

ومع ذلك، قبل أن تتمكن من إنشاء نموذج لبياناتك، يجب عليك بالتأكيد إعداد بياناتك لهذا الغرض.

تجهيز البيانات

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

تسوية البيانات Data Normalization
أول شيء سنفعله هو المعالجة المسبقة للبيانات. يمكنك توحيد وتسوية البيانات من خلال، على سبيل المثال، استخدام طريقة ()scale:

# Import
from sklearn.preprocessing import scale

# Apply `scale()` to the `digits` data
data = scale(digits.data)

من ()scale، قمت بتحويل توزيع كل سمة ليكون لها متوسط قيمة mean بصفر والانحراف معياري بواحد standard deviation (وحدة التباين).

تقسيم البيانات إلى مجموعات تدريب واختبار

لتقييم أداء نموذجك لاحقًا، ستحتاج إلى تقسيم مجموعة البيانات إلى قسمين: مجموعة تدريب ومجموعة اختبار. يستخدم الأول لتدريب النظام، بينما يستخدم الثاني لتقييم النظام في كلاً مرحلة التعلُم ومرحلة التدريب.

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

سوف تحاول القيام بذلك أيضا هنا. كما ترى أن خيار التجزئة “التقليدي” تم احترامه في طريقة () train_test_split، سترى بوضوح أن test_size مضبوط على 0.25.

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

# Import `train_test_split`
from sklearn.cross_validation import train_test_split

# Split the `digits` data into training and test sets
X_train, X_test, y_train, y_test, images_train, images_test = train_test_split(data, digits.target, digits.images, test_size=0.25, random_state=42)

بعد تقسيم مجموعة البيانات إلى مجموعات تدريب واختبار، يمكنك فحص البيانات بشكل سريع:

# Number of training features
n_samples, n_features = X_train.shape

# Print out `n_samples`
print(n_samples)

# Print out `n_features`
print(n_features)

# Number of Training labels
n_digits = len(np.unique(y_train))

# Inspect `y_train`
print(len(y_train))

النتيجة.

output:
    1347
    64
    1347

سترى أن مجموعة التدريب X_train تحتوي الآن على 1347 وحدة، وهي بالضبط 2/3 من الوحدات التي تحتوي عليها مجموعة البيانات الأصلية، و64 صفه، والتي لم تتغير. كما تحتوي مجموعة التدريب y_train على 2/3 من مسميات labels مجموعة البيانات الأصلية. هذا يعني أن اختبار مجموعات X_test وy_test تحتوي على 450 عينة.

تجميع بيانات الأرقام

والآن ، فقد حان الوقت الحاق مجموعة التدريب الخاصة بك للمجموعات. استخدم ()KMeans من وحدة cluster لإعداد النموذج الخاص بك. سترى أن هناك ثلاث مدخلات يتم تمريرها: init و n_clusters و random_state.

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

# Import the `cluster` module
from sklearn import cluster

# Create the KMeans model
clf = cluster.KMeans(init='k-means++', n_clusters=10, random_state=42)

# Fit the training data to the model
clf.fit(X_train)

يشير مدخل init إلى طريقة التهيئة، وبالرغم من أنه يتم تعيينه افتراضيًا على ++k-means، ولكن ذلك يعني ايضا أنه يمكنك تغيره أو تركه كما هو إذا أردت.

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

هل مازلت تتذكر أيضًا كيف وصفت الفقرة السابقة هذا بأنه أحد العيوب المحتملة لخوارزمية K-Means؟

بمعنى، أن القيم الأولية لمراكز المجموعات التي قمت بإدخالها يمكن أن يكون لها تأثير كبير على المجموعات التي سيتم العثور عليها في النهاية؟

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

عن طريق إضافة المدخل n-init إلى ()KMeans، يمكنك تحديد عدد مراكز المجموعات المختلفة التي ستحاول الخوارزمية تكوينها.

لاحظ أيضا أنك لا تريد إدراج تسميات الاختبار عندما تلائم النموذج لبياناتك. لأن هذه سيتم استخدامها في الاساس لمعرفة ما إذا كان النموذج الخاص بك هو جيد في التنبؤ!

يمكنك أيضًا عرض الصور التي تشكل مراكز المجموعات كما يلي:

# Import matplotlib
import matplotlib.pyplot as plt

# Figure size in inches
fig = plt.figure(figsize=(8, 3))

# Add title
fig.suptitle('Cluster Center Images', fontsize=14, fontweight='bold')

# For all labels (0-9)
for i in range(10):
    # Initialize subplots in a grid of 2X5, at i+1th position
    ax = fig.add_subplot(2, 5, 1 + i)
    # Display images
    ax.imshow(clf.cluster_centers_[i].reshape((8, 8)), cmap=plt.cm.binary)
    # Don't show the axes
    plt.axis('off')

# Show the plot
plt.show()

النتيجة.

إذا كنت ترغب في رؤية مثال آخر يوضح مجموعات البيانات ومراكزها ، فانتقل إلى هنا.

والخطوة التالية هي للتنبؤ التسميات من مجموعة الاختبار:

# Predict the labels for `X_test`
y_pred=clf.predict(X_test)

# Print out the first 100 instances of `y_pred`
print(y_pred[:100])

# Print out the first 100 instances of `y_test`
print(y_test[:100])

# Study the shape of the cluster centers
clf.cluster_centers_.shape

النتيجة.

output:
    [4 8 8 9 3 3 5 8 5 3 0 7 1 2 1 3 8 6 8 8 1 5 8 6 5 4 8 5 4 8 1 8 3 1 1 4 8
     1 6 4 4 8 0 8 4 7 8 2 4 5 5 0 8 5 4 2 8 2 2 7 2 1 5 3 1 5 6 2 6 8 8 8 8 6
     6 2 1 5 8 8 8 2 3 8 8 2 4 1 1 8 0 3 7 8 8 3 8 2 1 1]
    [6 9 3 7 2 1 5 2 5 2 1 9 4 0 4 2 3 7 8 8 4 3 9 7 5 6 3 5 6 3 4 9 1 4 4 6 9
     4 7 6 6 9 1 3 6 1 3 0 6 5 5 1 9 5 6 0 9 0 0 1 0 4 5 2 4 5 7 0 7 5 9 5 5 4
     7 0 4 5 5 9 9 0 2 3 8 0 6 4 4 9 1 2 8 3 5 2 9 0 4 4]

توقعت قيم مجموعة الاختبار التي تحتوي على 450 وحدة. وقمت بتخزين النتيجة في y_pred. يمكنك طباعة أول 100 نسخة من y_pred و y_test وترى على الفور بعض النتائج.

بالإضافة إلى ذلك ، يمكنك دراسة شكل مراكز المجموعات: سترى على الفور أن هناك 10 مجموعات مع كل 64 صفه.

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

ربما سيكون التصوير أكثر فائدة.

دعنا نعرض التسميات الناتجة:

# Import `Isomap()`
from sklearn.manifold import Isomap

# Create an isomap and fit the `digits` data to it
X_iso = Isomap(n_neighbors=10).fit_transform(X_train)

# Compute cluster centers and predict cluster index for each sample
clusters = clf.fit_predict(X_train)

# Create a plot with subplots in a grid of 1X2
fig, ax = plt.subplots(1, 2, figsize=(8, 4))

# Adjust layout
fig.suptitle('Predicted Versus Training Labels', fontsize=14, fontweight='bold')
fig.subplots_adjust(top=0.85)

# Add scatterplots to the subplots 
ax[0].scatter(X_iso[:, 0], X_iso[:, 1], c=clusters)
ax[0].set_title('Predicted Training Labels')
ax[1].scatter(X_iso[:, 0], X_iso[:, 1], c=y_train)
ax[1].set_title('Actual Training Labels')

# Show the plots
plt.show()

يمكنك استخدام ()Isomap كطريقة اخري لتقليل أبعاد مجموعة البيانات عالية الأبعاد هذة. الفرق بينها و بين طريقة PCA هو أن Isomap هو أسلوب تقليل غير خطي.

نصيحة: استخدم طريقة تقليل PCA بدلاً من Isomap لدراسة تأثير طرق التقليل بنفسك.

تسطيع التجربة من هنا:

# Import `PCA()`
from sklearn.decomposition import PCA

# Model and fit the `digits` data to the PCA model
X_pca = PCA(n_components=2).fit_transform(X_train)

# Compute cluster centers and predict cluster index for each sample
clusters = clf.fit_predict(X_train)

# Create a plot with subplots in a grid of 1X2
fig, ax = plt.subplots(1, 2, figsize=(8, 4))

# Adjust layout
fig.suptitle('Predicted Versus Training Labels', fontsize=14, fontweight='bold')
fig.subplots_adjust(top=0.85)

# Add scatterplots to the subplots 
ax[0].scatter(X_pca[:, 0], X_pca[:, 1], c=clusters)
ax[0].set_title('Predicted Training Labels')
ax[1].scatter(X_pca[:, 0], X_pca[:, 1], c=y_train)
ax[1].set_title('Actual Training Labels')

# Show the plots
plt.show()

النتيجة.

من النظرة الأولى، لا يبدو أن المخططات يشير إلى أن النموذج يعمل جيدًا.

لكن هذا يحتاج إلى مزيد من التحقيق.

تقييم نموذج التجميع الخاص بك

تريد تحليل درجة صحة تنبؤات النموذج, لنستعمل مصفوفة الارتباك confusion matrix.

مصفوفة الارتباك هي جدول يتم استخدامه غالبًا لوصف أداء نموذج التصنيف.

و لكن ماذا يمكننا أن نتعلم من هذه المصفوفة؟

كمثال سنفترض ان هناك فئتان متوقعتان : “نعم” و “لا”. إذا كنا نتوقع وجود مرض ، على سبيل المثال ، فإن “نعم” سيعني أنهم مصابون بالمرض ، و “لا” يعني أنهم لا يعانون من هذا المرض.
نتبأ المصنف 165 توقع (على سبيل المثال ، تم اختبار 165 مريضا لوجود هذا المرض).
من تلك الحالات الـ 165 ، توقع المصنف “نعم” 110 مرة ، و “لا” 55 مرة.
في الواقع ، 105 مريضا في العينة لديهم المرض ، و 60 مريضا لا.

و لان لنطبع مصفوفة الارتباك الخاصة بنا.

# Import `metrics` from `sklearn`
from sklearn import metrics

# Print out the confusion matrix with `confusion_matrix()`
print(metrics.confusion_matrix(y_test, y_pred))

النتيجة.

output:
    [[ 0  0 43  0  0  0  0  0  0  0]
     [20  0  0  7  0  0  0 10  0  0]
     [ 5  0  0 31  0  0  0  1  1  0]
     [ 1  0  0  1  0  1  4  0 39  0]
     [ 1 50  0  0  0  0  1  2  0  1]
     [ 1  0  0  0  1 41  0  0 16  0]
     [ 0  0  1  0 44  0  0  0  0  0]
     [ 0  0  0  0  0  1 34  1  0  5]
     [21  0  0  0  0  3  1  2 11  0]
     [ 0  0  0  0  0  2  3  3 40  0]]

للوهلة الأولى، يبدو أن النتائج تؤكد أفكارنا المبدئية التي استنتجناها من المخططات. تم تصنيف الرقم 5 فقط بشكل صحيح في 41 حالة. أيضا، تم تصنيف الرقم 8 بشكل صحيح في 11 حالة. لكن هذا ليس حقا بنجاح.

قد تحتاج إلى معرفة المزيد عن النتائج أكثر من مجرد مصفوفة الارتباك.

دعونا نحاول معرفة المزيد عن مدي جودة اختيار المجموعات من خلال تطبيق مصفوفات الجودة المختلفة للمجموعات. بهذه الطريقة، يمكنك الحكم على الملاءمة تسميات المجموعة “المتنبئه” إلى التسميات الصحيحة.

from sklearn.metrics import homogeneity_score, completeness_score, v_measure_score, adjusted_rand_score, adjusted_mutual_info_score, silhouette_score
print('% 9s' % 'inertia    homo   compl  v-meas     ARI AMI  silhouette')
print('%i   %.3f   %.3f   %.3f   %.3f   %.3f    %.3f'
          %(clf.inertia_,
      homogeneity_score(y_test, y_pred),
      completeness_score(y_test, y_pred),
      v_measure_score(y_test, y_pred),
      adjusted_rand_score(y_test, y_pred),
      adjusted_mutual_info_score(y_test, y_pred),
      silhouette_score(X_test, y_pred, metric='euclidean')))

النتيجة.

inertia    homo   compl  v-meas     ARI AMI  silhouette
54276   0.688   0.733   0.710   0.567   0.674    0.146

سترى أن هناك بعض المقاييس التي يجب وضعها في الاعتبار:

  • مقاس التجانس homogeneity score يخبرك الي اي مدي تحتوي المجموعة على نقاط بيانات تنتمي الي نفس الفئة.
  • مقياس الاكتمالcompleteness score يقيس مدى كون نقاط البيانات ذات فئة معينة عناصر في نفس المجموعة.
  • مقاس V-measure score V يحسب المتوسط التوافقي بين التجانس والاكتمال.
  • درجة راند المعدلة adjusted Rand score يقيس مدي التشابه بين نقاط البيانات في المجموعة اخذاً في الاعتبار جميع أزواج الوحدات وعددهم التي تم تعيينها في نفس المجموعة أو في مجموعة مختلفة في كلا من المجموعات متوقعة وحقيقية.
  • يتم استخدام درجة تعديل المعلومات المتبادلة AMI لمقارنة المجموعات. أنه يقيس التشابه بين نقاط البيانات التي هي في المجموعة، وتأخذ القيمة قصوى 1 عندما تكون المجموعات متعادلة.
  • مقياس النتيجة الظلية silhouette score تقيس مدى تشابه الكائن مع المجموعة الخاصة به مقارنةً بالمجموعات الأخرى. وتتراوح درجات الخيال من -1 إلى 1، حيث تشير قيمة أعلى إلى أن الكائن يتطابق بشكل أفضل مع المجموعة الخاصة به وأسرع إلى مجموعات مجاورة. إذا كان للعديد من النقاط قيمة عالية، يكون تكوين المجموعات جيدًا.

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

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

بوضوح، يجب أن تفكر في منظور آخر لتوقع التسميات لبيانات الأرقام.

لنجرب خوارزمية اخري: Support Vector Machine

عندما قمت باستعراض جميع المعلومات التي قمت بجمعها من استكشاف البيانات، رأيت أنه يمكنك بناء نموذج للتنبؤ بالمجموعة التي ينتمي إليها الرقم دون أن تعرف التسميات. وبالفعل، لقد استخدمت للتو بيانات التدريب وليس القيم المستهدفة لبناء نموذج K-Means الخاص بك.

لنفترض أنك لن تستخدم بيانات تدريب الأرقام والقيم المستهدفة معا لبناء النموذج.

إذا اتبعت خريطة الخوارزمية، فسترى أن النموذج الأول الذي تقابله هو SVC الخطي. دعونا نطبق ذلك الآن على البيانات:

# Import `train_test_split`
from sklearn.cross_validation import train_test_split

# Split the data into training and test sets 
X_train, X_test, y_train, y_test, images_train, images_test = train_test_split(digits.data, digits.target, digits.images, test_size=0.25, random_state=42)

# Import the `svm` model
from sklearn import svm

# Create the SVC model 
svc_model = svm.SVC(gamma=0.001, C=100., kernel='linear')

# Fit the data to the SVC model
svc_model.fit(X_train, y_train)

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

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

# Split the `digits` data into two equal sets
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.5, random_state=0)

# Import GridSearchCV
from sklearn.grid_search import GridSearchCV

# Set the parameter candidates
parameter_candidates = [
  {'C': [1, 10, 100, 1000], 'kernel': ['linear']},
  {'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]

# Create a classifier with the parameter candidates
clf = GridSearchCV(estimator=svm.SVC(), param_grid=parameter_candidates, n_jobs=-1)

# Train the classifier on training data
clf.fit(X_train, y_train)

# Print out the results 
print('Best score for training data:', clf.best_score_)
print('Best `C`:',clf.best_estimator_.C)
print('Best kernel:',clf.best_estimator_.kernel)
print('Best `gamma`:',clf.best_estimator_.gamma)

النتيجة.

Best score for training data: 0.9844097995545658
Best `C`: 10
Best kernel: rbf
Best `gamma`: 0.001

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

# Apply the classifier to the test data, and view the accuracy score
clf.score(X_test, y_test)  

# Train and score a new classifier with the grid search parameters
svm.SVC(C=10, kernel='rbf', gamma=0.001).fit(X_train, y_train).score(X_test, y_test)

النتيجة.

0.99110122358175756

المدخلات التي غيرناها تعمل في الواقع بشكل جيد!

الآن ما الذي تخبرك به هذه المعرفة الجديدة عن مصنف SVC الذي صممته قبل إجراء البحث في الشبكة؟

دعنا نعود إلى النموذج الذي قدمته من قبل.

سترى أنه في مصنف SVM تم تحديد مدخل الغرامة C ب100. وأخيرًا، سترى أن النواة Kernel قد تم تحديدها بشكل صريح نواة خطية. و دائما ما تحدد مدخلات النواة نوعها بشكل افتراضي هذا النوع هو rbf. في حالات أخرى، يمكنك تحديد قيم الآخري مثل الخطية، الثنائية، …

لكن ما هي النواة بالضبط؟

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

ومع ذلك، فإن البحث الشبكي سيخبرك بأن نواة rbf قد عملت بشكل أفضل. لأنه تم تحديد مدخل الغرامةو gamma بشكل صحيح.

نصيحة: جرب المصنف بنواة rbf.

في الوقت الحالي، دعنا نقول فقط إنك تواصل مع نواة خطية وتتنبأ بقيم مجموعة الاختبار:

# Predict the label of `X_test`
print(svc_model.predict(X_test))

# Print `y_test` to check the results
print(y_test)

النتيجة.

output:
    [6 9 3 7 2 1 5 2 5 2 1 9 4 0 4 2 3 7 8 8 4 3 9 7 5 6 3 5 6 3 4 9 1 4 4 6 9
     4 7 6 6 9 1 3 6 1 3 0 6 5 5 1 3 5 6 0 9 0 0 1 0 4 5 2 4 5 7 0 7 5 9 5 5 4
     7 0 4 5 5 9 9 0 2 3 8 0 6 4 4 9 1 2 8 3 5 2 9 0 4 4 4 3 5 3 1 3 5 9 4 2 7
     7 4 4 1 9 2 7 8 7 2 6 9 4 0 7 2 7 5 8 7 5 7 9 0 6 6 4 2 8 0 9 4 6 9 9 6 9
     0 5 5 6 6 0 6 4 3 9 3 7 7 2 9 0 4 5 3 6 5 9 9 8 4 2 1 3 7 7 2 2 3 9 8 0 3
     2 2 5 6 9 9 4 1 5 4 2 3 6 4 8 5 9 5 7 8 9 4 8 1 5 4 4 9 6 1 8 6 0 4 5 2 7
     1 6 4 5 6 0 3 2 3 6 7 1 5 1 4 7 6 5 8 5 5 1 6 2 8 8 9 9 7 6 2 2 2 3 4 8 8
     3 6 0 9 7 7 0 1 0 4 5 1 5 3 6 0 4 1 0 0 3 6 5 9 7 3 5 5 9 9 8 5 3 3 2 0 5
     8 3 4 0 2 4 6 4 3 4 5 0 5 2 1 3 1 4 1 1 7 0 1 5 2 1 2 8 7 0 6 4 8 8 5 1 8
     4 5 8 7 9 8 5 0 6 2 0 7 9 8 9 5 2 7 7 1 8 7 4 3 8 9 5 6 0 0 3 0 5 0 0 4 1
     2 8 4 5 9 6 3 1 8 8 4 2 3 8 9 8 8 5 0 6 3 3 7 1 6 4 1 2 1 1 6 4 7 4 8 3 4
     0 5 1 9 4 5 7 6 3 7 0 5 9 7 5 9 7 4 2 1 9 0 7 5 2 3 6 3 9 6 9 5 0 1 5 5 8
     3 3 6 2 6 5]
    [6 9 3 7 2 1 5 2 5 2 1 9 4 0 4 2 3 7 8 8 4 3 9 7 5 6 3 5 6 3 4 9 1 4 4 6 9
     4 7 6 6 9 1 3 6 1 3 0 6 5 5 1 9 5 6 0 9 0 0 1 0 4 5 2 4 5 7 0 7 5 9 5 5 4
     7 0 4 5 5 9 9 0 2 3 8 0 6 4 4 9 1 2 8 3 5 2 9 0 4 4 4 3 5 3 1 3 5 9 4 2 7
     7 4 4 1 9 2 7 8 7 2 6 9 4 0 7 2 7 5 8 7 5 7 7 0 6 6 4 2 8 0 9 4 6 9 9 6 9
     0 3 5 6 6 0 6 4 3 9 3 9 7 2 9 0 4 5 3 6 5 9 9 8 4 2 1 3 7 7 2 2 3 9 8 0 3
     2 2 5 6 9 9 4 1 5 4 2 3 6 4 8 5 9 5 7 8 9 4 8 1 5 4 4 9 6 1 8 6 0 4 5 2 7
     4 6 4 5 6 0 3 2 3 6 7 1 5 1 4 7 6 8 8 5 5 1 6 2 8 8 9 9 7 6 2 2 2 3 4 8 8
     3 6 0 9 7 7 0 

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

# Import matplotlib
import matplotlib.pyplot as plt

# Assign the predicted values to `predicted`
predicted = svc_model.predict(X_test)

# Zip together the `images_test` and `predicted` values in `images_and_predictions`
images_and_predictions = list(zip(images_test, predicted))

# For the first 4 elements in `images_and_predictions`
for index, (image, prediction) in enumerate(images_and_predictions[:4]):
    # Initialize subplots in a grid of 1 by 4 at positions i+1
    plt.subplot(1, 4, index + 1)
    # Don't show axes
    plt.axis('off')
    # Display images in all subplots in the grid
    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    # Add a title to the plot
    plt.title('Predicted: ' + str(prediction))

# Show the plot
plt.show()

هذا المخطط يشبه إلى حد كبير المخطط الذي قمت به عندما كنت تستكشف البيانات:

في هذه المرة فقط، يمكنك جمع الصور والقيم المتوقعة معًا، ولا تأخذ سوى العناصر الأربعة الأولى من images_and_predictions.

لكن السؤال الأكبر الآن: كيف هو اداء هذا النموذج؟

# Import `metrics`
from sklearn import metrics

# Print the classification report of `y_test` and `predicted`
print(metrics.classification_report(y_test, predicted))

# Print the confusion matrix
print(metrics.confusion_matrix(y_test, predicted))

النتيجة.

output:
                 precision    recall  f1-score   support
    
              0       1.00      1.00      1.00        43
              1       0.97      1.00      0.99        37
              2       0.97      1.00      0.99        38
              3       0.98      0.93      0.96        46
              4       1.00      0.98      0.99        55
              5       0.97      1.00      0.98        59
              6       1.00      1.00      1.00        45
              7       0.98      0.98      0.98        41
              8       1.00      0.97      0.99        38
              9       0.96      0.96      0.96        48
    
    avg / total       0.98      0.98      0.98       450
    
    [[43  0  0  0  0  0  0  0  0  0]
     [ 0 37  0  0  0  0  0  0  0  0]
     [ 0  0 38  0  0  0  0  0  0  0]
     [ 0  0  1 43  0  1  0  0  0  1]
     [ 0  1  0  0 54  0  0  0  0  0]
     [ 0  0  0  0  0 59  0  0  0  0]
     [ 0  0  0  0  0  0 45  0  0  0]
     [ 0  0  0  0  0  0  0 40  0  1]
     [ 0  0  0  0  0  1  0  0 37  0]
     [ 0  0  0  1  0  0  0  1  0 46]]

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

يمكنك أن ترى أيضا أنه عند تصور التسميات المتوقعة والفعلية بمساعدة () Isomap:

# Import `Isomap()`
from sklearn.manifold import Isomap

# Create an isomap and fit the `digits` data to it
X_iso = Isomap(n_neighbors=10).fit_transform(X_train)

# Compute cluster centers and predict cluster index for each sample
predicted = svc_model.predict(X_train)

# Create a plot with subplots in a grid of 1X2
fig, ax = plt.subplots(1, 2, figsize=(8, 4))

# Adjust the layout
fig.subplots_adjust(top=0.85)

# Add scatterplots to the subplots 
ax[0].scatter(X_iso[:, 0], X_iso[:, 1], c=predicted)
ax[0].set_title('Predicted labels')
ax[1].scatter(X_iso[:, 0], X_iso[:, 1], c=y_train)
ax[1].set_title('Actual Labels')


# Add title
fig.suptitle('Predicted versus actual labels', fontsize=14, fontweight='bold')

# Show the plot
plt.show()

النتيجة.

سترى أن هذا المخطط يؤكد تقرير التصنيف الخاص بك، والذي يعتبر خبرًا جيداَ جدًا.

التعرف على الأرقام في الصور الطبيعية

تهانينا، لقد وصلت إلى نهاية هذا المقال مع scikit-learn، والذي كان يهدف إلى تعريفك علىPython Machine Learning الان حان دورك.

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

الخطوات التي يمكنك اتخاذها مشابهة إلى حد كبير لتلك التي اتبعتها مع هذا المقال، ولكن إذا كنت لا تزال تشعر أنه يمكنك استخدام بعض المساعدة، يجب عليك مراجعة هذه الصفحة ، والتي تعمل مع بيانات MNIST وتطبق خوارزمية K-Means.

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

مجموعة البيانات المعروفة التي يمكنك استخدامها لهذه المشكلة هي مجموعة بيانات Chars74K، التي تحتوي على أكثر من 74000 صورة لأرقام من 0 إلى 9 وحروف الأحرف الصغيرة والحروف الكبيرة من الأبجدية الإنجليزية. يمكنك تنزيل مجموعة البيانات هنا.

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

تعليقات