مشروع تصنيف زهرة Iris بإستخدام التعلم الآلي

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

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

1- تصنيف زهرة Iris نظريا

أولا قبل التصنيف. علينا التعرف على نوعية البيانات التي سنعمل عليها.

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

تتكون مجموعة البيانات من 50 عينة من كل من ثلاثة أنواع من زهرة Iris وهم: (Iris setosa و Iris virginica و Iris versicolor). والتي تختلف حسب قياساتها.

إفترض الآن أن لديك قياسات زهور Iris وفقًا لنوعها، وتتمثل مهمتك في تدريب نموذج تعلم آلي يمكنه التعلم من قياسات أنواع Iris وتصنيفها.

وتحتوي كل فئة (أو نوع من الزهور) على 4 ميزات، “طول الكأس” ، “عرض الكأس” ، “طول البتلة” ، “عرض البتلة”. والهدف من تصنيف زهرة Iris هو التنبؤ بنوع الزهور بناء على ميزاتها التي نحددها بأنفسنا.

آمل أن تكون قد فهمت الهدف من مشروعنا الخاص بتصنيف زهرة Iris.

على الرغم من أن مكتبة Scikit-Learn توفر مجموعة بيانات لتصنيف زهرة Iris، يمكنك أيضًا تنزيل مجموعة البيانات نفسها من هنا لمهمة تصنيف زهرة Iris بإستخدام التعلم الآلي.

ملاحظة : أرجوا أن تتذكر مكتبة Scikit-Learn فهي من أهم المكتبات في التعلم الآلي وتسهل العمل بشكل كبير.

الآن سأطلعك على كيفية تصنيف أنواع زهرة Iris بالتعلم الآلي بإستخدام لغة برمجة Python.

2- تصنيف زهرة Iris بإستخدام بايثون

سنقسم مشروعنا إلى عدة خطوات حتى نقوم بتصنيف زهرة Iris:

  1. تحميل البيانات.
  2. تحليل ورسم مجموعة البيانات.
  3. تدريب النموذج.
  4. تقييم النموذج.
  5. إختبار النموذج.

1.2- تحميل البيانات

أوذ تذكيرك بالرابط الذي وضعناه في بداية المقالة. عليك بتحميلها ورفعها في Google colab (على سبيل المثال) حتى تتمكن من تشغيل الأكواد.

# DataFlair Iris Flower Classification
# Import Packages
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
%matplotlib inline

أولاً، قمنا بإستيراد بعض الحزم الضرورية للمشروع.

  • سيتم إستخدام مكتبة Numpy (الغنية عن التعريف) لأي عمليات حسابية.
  • سنستخدم مكتبات Matplotlib و seaborn لرسم البيانات.
  • تساعد مكتبة Pandas في تحميل البيانات من مصادر مختلفة مثل التخزين المحلي وقاعدة البيانات وملف Excel وملف CSV وما إلى ذلك.
colums = ['Sepal length', 'Sepal width', 'Petal length', 'Petal width', 'Class_labels'] 
# Load the data
df = pd.read_csv('iris.data', names=colums)
df.head()

بعد ذلك، نقوم بتحميل البيانات بإستخدام ()pd.read_csv وتعيين إسم العمود colums وفقًا لمعلومات بيانات Iris.

  • يقرأ pd.read_csv ملفات بصيغة CSV.
  • يعرض ()df.head الصفوف الخمسة الأولى فقط من جدول مجموعة البيانات.
  •  جميع القيم العددية بالـ cm.

2.2- تحليل مجموعة البيانات وتصورها

دعنا نرى بعض المعلومات حول مجموعة البيانات Dataset.

# Some basic statistical analysis about the data
df.describe()

من هذا الوصف، يمكننا رؤية جميع الأوصاف المتعلقة بالبيانات، مثل متوسط الطول والعرض، والحد الأدنى للقيمة، والحد الأقصى للقيمة، وقيمة التوزيع 25٪، و 50٪، و 75٪، إلخ.

دعونا نرسم مجموعة البيانات.

# Visualize the whole dataset
sns.pairplot(df, hue='Class_labels')

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

  • من هذا الرسم، يمكننا أن نقول أن iris-setosa منفصلة جيدًا عن الزهرتين الأخريين.
  • و iris virginica هي أطول زهرة و iris setosa هي الأقصر.
  • دعنا الآن نرسم متوسط كل ميزة لكل فئة.
# Separate features and target  
data = df.values
X = data[:,0:4]
Y = data[:,4]

هنا قمنا بفصل الميزات (يعني X وهي المدخلات) عن القيمة المستهدفة (يعني Y وهي المخرجات).

# Calculate average of each features for all classes
Y_Data = np.array([np.average(X[:, i][Y==j].astype('float32')) for i in range (X.shape[1])
 for j in (np.unique(Y))])
Y_Data_reshaped = Y_Data.reshape(4, 3)
Y_Data_reshaped = np.swapaxes(Y_Data_reshaped, 0, 1)
X_axis = np.arange(len(columns)-1)
width = 0.25
  • يحسب np.average المتوسط من المصفوفة.
  • إستخدمنا هنا حلقتين for داخل قائمة. هذا هو المعروف بإسم list comprehension.
  • يساعد list comprehension على تقليل عدد أسطر الكود.
  • Y_Data عبارة عن مصفوفة أحادية البعد، لكن لدينا 4 ميزات لكل 3 فئات. لذلك قمنا بإعادة تشكيل Y_Data إلى مصفوفة على شكل (3 ، 4).
  • ثم نقوم بتغيير محور المصفوفة المعاد تشكيلها.
# Plot the average
plt.bar(X_axis, Y_Data_reshaped[0], width, label = 'Setosa')
plt.bar(X_axis+width, Y_Data_reshaped[1], width, label = 'Versicolour')
plt.bar(X_axis+width*2, Y_Data_reshaped[2], width, label = 'Virginica')
plt.xticks(X_axis, columns[:4])
plt.xlabel("Features")
plt.ylabel("Value in cm.")
plt.legend(bbox_to_anchor=(1.3,1))
plt.show()

إستخدمنا matplotlib لإظهار المتوسطات في مخطط شريطي.

هنا يمكننا أن نرى بوضوح أن virginica هي الأطول و setosa هي أقصر زهرة.

3- نموذج التدريب

# Split the data to train and test dataset.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2)

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

# Support vector machine algorithm
from sklearn.svm import SVC
svn = SVC()
svn.fit(X_train, y_train)
  • هنا قمنا بإستيراد بخوارزمية الـ SVM من scikit-Learn.
  • ثم أنشأنا عنصرا وأطلقنا عليه إسم svn.
  • بعد ذلك، نقوم بتغذية مجموعة بيانات التدريب في الخوارزمية باستخدام طريقة ()svn.fit.

4- تقييم النموذج

# Predict from the test dataset
predictions = svn.predict(X_test)
 
# Calculate the accuracy
from sklearn.metrics import accuracy_score
accuracy_score(y_test, predictions)
  • الآن نتوقع الفئات من مجموعة بيانات الإختبار بإستخدام نموذجنا المدرب.
  • ثم نتحقق من درجة الدقة للفئات المتوقعة.
  • ()accuracy_score تأخذ القيم الحقيقية والقيم المتوقعة وتعيد النسبة المئوية للدقة.

المخرجات:

0.9666666666666667

الدقة أعلى من 96٪.

دعنا الآن نرى تقرير التصنيف المفصل بناءً على مجموعة بيانات الإختبار.

الكود :

# A detailed classification report
from sklearn.metrics import classification_report
print(classification_report(y_test, predictions))

النتيجة:

                 precision    recall  f1-score   support

    Iris-setosa       1.00      1.00      1.00        15
Iris-versicolor       0.89      1.00      0.94         8
 Iris-virginica       1.00      0.86      0.92         7

       accuracy                           0.97        30
      macro avg       0.96      0.95      0.95        30
   weighted avg       0.97      0.97      0.97        30
  • يقدم تقرير التصنيف تقريرًا مفصلاً عن التنبؤ.
  • تحدد precision نسبة الإيجابيات الحقيقية إلى مجموع الإيجابيات الحقيقية الإيجابية والخاطئة.
  • يحدد Recall نسبة الموجب الحقيقي إلى مجموع الموجب الحقيقي والسالب الخاطئ.
  • F1-score هي متوسط precision وقيمة recall.
  • Support هو عدد التكرارات الفعلية للفئة في مجموعة البيانات المحددة.

5- إختبار النموذج

الكود:

X_new = np.array([[3, 2, 1, 0.2], [  4.9, 2.2, 3.8, 1.1 ], [  5.3, 2.5, 4.6, 1.9 ]])
#Prediction of the species from the input vector
prediction = svn.predict(X_new)
print("Prediction of Species: {}".format(prediction))

النتيجة:

ما قمنا به هو إعطاء قيم إفتراضية لنمذوج تعلم الآلة وهو بنفسه يتوقع (التنبؤ) نوع الزهرة Iris أو بالأصح يصنفها ضمن أي نوع إعتمادا على البيانات المعتمدة والتي تم تدريب النموذج عليها.

Prediction of Species: ['Iris-setosa' 'Iris-versicolor' 'Iris-versicolor']
  • يمكننا حفظ النموذج بإستخدام شكل pickle.
  • ومرة أخرى يمكننا تحميل النموذج في أي برنامج آخر بإستخدام pickle وإستخدامه بإستخدام model.prict للتنبؤ ببيانات Iris.

6- الملخص

في هذا المشروع، تعلمنا تدريب نموذج التعلم الآلي الخاص بنا بإستخدام مشروع Iris Flower Classification.

من خلال هذا المشروع، تعرفنا على التعلم الآلي، وتحليل البيانات، والتمثيل المرئي للبيانات، وإنشاء النماذج، وما إلى ذلك.


المصدر

(منقول بتصرف – قمنا بتعديل بعض الأكواد والتغيير في صياغة الكلام بما نراه مناسب كما تم تغيير الصور حتى تكون بجودة أفضل مما كانت عليه)

Iris Flower Classification Project using Machine Learning – DataFlair (data-flair.training)


مقالات أخرى

……

الكاتب

مقالات متعلقة

16 نصيحة لإستخدام Google Colab

يعد كولاب Colab أحد أفضل المنتجا...

أشهر 10 روبوتات في العالم

1- المقدمة تعيش البشرية حالي...

روبوت Handle ودوره في تحسين

1- المقدمة 1.1- تعريف روبوت Handle ...

اترك تعليقا