كما ذكرنا لحل مشاكل تعلم الالة، هناك مجموعة من الخطوات التي نسير عليها لنصل الى افضل نموذج model وهو كالاتي

  1. تعريف المشكلة.
  2. تحليل و تجهيز البيانات.
  3. اختيار الخوارزمية.
  4. تدريب الخوازمية
  5. تقييم الخوارزمية.

تعريف المشكلة.

قام عالم الاحصاء البريطاني رونالد فيشر في عام 1936 بجمع مجموعة من البيانات عن 3 انواع من زهور السوسن Iris لتصنيفها و تفريقها وهي: Iris setosa و Iris virginica و Iris versicolor. حيث
قام فيشر بقياس طول وعرض مجموعة* من كؤوس Sepal الزهرة و بتول Petal الزهرة لكل نوع كما موضحة بالصورة. وعن طريق قواعد الاحصاء استطاع ان يشكل خوارمية لتفريق الثلاث انواع بناءا على طول وعرض كل من الكوؤس والبتول. مجموعة بيانات فيشر او زهور السوسن (Iris Dataset) هي احد اشهر مجموعات البيانات وسنحاول حلها

نستطيع استنتاج من المعلومات السابقة ان المشكلة هي مشكلة ​تصنيف، اذن عند اختيار الخوارزميات نختار خوازميات التصنيف. ايضا القراءات المتاحة لدينا من طول وعرض الكؤوس والبتول هي ​بيانات مستمرة​ continuous وهذا سوف يجعلنا في خطوة تحليل البيانات نحاول فهمها بعرض بعض الارقام الاحصائية عنها.

تحليل و تجهيز البيانات.

اولا نحتاج الى الى تحميل المكتبات التي نستخدمها و مجموعة البيانات

تشغيل
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split

iris = datasets.load_iris()
توفر مكتبة scikit learn او اختصارا sklearn العديد من مجموعات البيانات المشهورة التي نستطيع استخدامها ومنها مجموعة بيانات فيشر او زهرة السوسن iris ويتم تحميلها كما بالكود.

لبداية فهم البيانات نحتاج ان نعرض عينة من البيانات و ملخص عنها

تشغيل
feature_names = iris.feature_names

iris_df = pd.DataFrame(iris.data, columns=feature_names) # panda تحويل البيانات الى 
iris_df['species'] = iris.target
print("Features of first 5 readings: ")
print(iris_df.head())




print("-----------------------------------------------------------------")
print("-----------------------------------------------------------------")
print("-----------------------------------------------------------------")
print("Summary of dataset: ")
print(iris_df.info())
print("-----------------------------------------------------------------")
print(iris_df.describe())
عند عرض بيانات الاصناف نجد ان قيمها هي [0, 1, 2] وهي قيم تعبر عن الاصناف بدلا من النصوص مثل ['ٍSetosa', 'Versicolor', 'Virginica'] لانها افضل في التعامل عند تدريب النموذج model

استطعنا استخلاص وتحويل الكائن iris الى اطار بيانات Dataframe ليسهل التعامل مع البيانات وعرض المعلومات الاحصائية. لفهم البيانات اكثر، نحاول ان نعرض توزيع البيانات باستخدام المكتبة matplotlib. في البداية نعرض توزيع طول الكأس وعرضها (x,y) على مخطط التشتت scatter.

تشغيل
# sepal width vs sepal length 
colours = ['red', 'black', 'blue']
species = ['ٍSetosa', 'Versicolor', 'Virginica']# القيم المقابلة للارقام

for i in range(0, 3):    
    species_df = iris_df[iris_df['species'] == i]    
    plt.scatter(        
        species_df['sepal length (cm)'],        
        species_df['sepal width (cm)'],
        color=colours[i],        
        alpha=0.5,        
        label=species[i]   
    )

plt.xlabel('sepal length (cm)')
plt.ylabel('sepal width (cm)')
plt.title('Iris dataset: sepal width vs sepal length')
plt.legend(loc='lower right')

plt.show()

نحاول الان فهم البيانات بعرض توزيع طول وعرض البتلات على مخطط التشتت scatter

تشغيل
#petal width vs petal length
for i in range(0, 3):    
    species_df = iris_df[iris_df['species'] == i]    
    plt.scatter(        
        species_df['petal length (cm)'],        
        species_df['petal width (cm)'],
        color=colours[i],        
        alpha=0.5,        
        label=species[i]   
    )

plt.xlabel('petal length (cm)')
plt.ylabel('petal width (cm)')
plt.title('Iris dataset: petal width vs petal length')
plt.legend(loc='lower right')

plt.show()

كما اتضح عند عرض ملخص البيانات لم نجد اي بيانات ناقصة او غير سليمة (كل الاعمدة تحتوى على 150 عنصر) وعند عرض البيانات باستخدام مخطط التشتت لم يبدوا انه هناك بيانات غير طبيعية. يبقى الان تقسيم البيانات الى مجموعة تدريب و مجموعة اختبار وذلك باستخدام مكتبة sklearn.

تشغيل
X = iris_df[feature_names]
y = iris_df['species']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.35, random_state=1)

تستخدم الدالة train_test_split الى تقسيم البيانات بطريقة عشوائية (حتى تكون البيانات موزعة بشكل عادل بين مجموعة التدريب ومجموعة الاختبار) و بنسبة محددة (35% في هذا المثال). البيانات التي ترجعها دالة train_test_split منقسمة الى 4 اجزاء

  • X_train : هي قياسات التدريب اي طول وعرض كل من البتلات والكوؤس لمجموعة بيانات التدريب.
  • ْX_test : هي قياسات الاختبار اي طول وعرض كل من البتلات والكوؤس لمجموعة بيانات الاختبار.
  • y_train: هي نتائج التدريب اي نوع الزهرة [‘ٍSetosa’, ‘Versicolor’, ‘Virginica’] لمجموعة بيانات التدريب.
  • y_test: هي نتائج الاختبار اي نوع الزهرة [‘ٍSetosa’, ‘Versicolor’, ‘Virginica’] لمجموعة بيانات الاختبار.

اختيار وتدريب الخوارزمية*

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

نموذج Logistic Regression

الانحدار اللوجستي Logistic Regression هو نموذج يستخدم قواعد الاحتمالات على البيانات لاختيار الصنف النهائي. رغم كلمة regression في اسم النموذج الا انها تستخدم للتصنيف.

* كثير ما نشير الى الخوارزمية بال "نموذج" لانها اهم شئ في النموذج. ايضا يتم تسمية نموذج التصنيف بال "مصنف" classifier.
تشغيل
from sklearn.linear_model import LogisticRegression
from sklearn import metrics

model = LogisticRegression()
model.fit(X_train,y_train)
prediction=model.predict(X_test)
print('The accuracy of the Logistic Regression is',metrics.accuracy_score(prediction,y_test))

تسهل علينا مكتبة sklearn تدريب واختبار النماذج. تستخدم الدالة fit لتدريب وانشاء النموذج.
بعد تدريب النموذج نقوم باستخدام بيانات الاختبار X_test لنرى ماذا سوف يتنبأ النموذج وذلك عن طريق
الدالة predict. لنرى كفاءة النموذج نقارن بين النتائج التى توقعها النموذج و نتائج الاختبار الصحيحة y_test.

نموذج K-Nearest Neighbours

K- اقرب جار K-Nearest Neighbours هو نموذج تصنيفي يقوم بتوزيع عدد K من النقط على محاور البيانات. حيث يمثل K عدد الاصناف (3 في تلك المسألة) المراد تصنيفها. ويتم تصنيف البيانات على حسب قربها من نفس النقاط. وهدف النموذج model هو ايجاد افضل توزيع لتلك النقاط .

تشغيل
from sklearn.neighbors import KNeighborsClassifier  # for K nearest neighbours
from sklearn import metrics

model=KNeighborsClassifier(n_neighbors=3)
model.fit(X_train,y_train)
prediction=model.predict(X_test)
print('The accuracy of the KNN is',metrics.accuracy_score(prediction,y_test))

نموذج SVM

نموذج SVM: Support Vector Machine هو احد اشهر نماذج التصنيف وتعتمد فكرتها على رسم افضل خطوط يفصل بين الاصناف لتصنيفها.

يوضح الرسم السابق 3 خطوط تفصل بين الاصناف، ويعتير الخط المصمت افضل من الخطوط المتقطعة.
تشغيل
from sklearn import svm  #for Support Vector Machine (SVM) Algorithm
from sklearn import metrics

model = svm.SVC() #select the algorithm
model.fit(X_train,y_train) # we train the algorithm with the training data and the training output
prediction=model.predict(X_test) #now we pass the testing data to the trained algorithm
print('The accuracy of the SVM is',metrics.accuracy_score(prediction,y_test))

تحسين الخوارزمية

عندما قمنا بتدريب النموذج لم نحدد الكثير من المتغيرات التي قد تؤثر على كفاءة النموذج مثل: المحسن Optimizer او دالة التكلفة Cost function او دالة الخطأ Loss Function او معامل التسوية Regularization.

من خلال دالة بناء constructor النموذج نستطيع تحديد تلك المتغيرات، مثلا في نموذج SVMنستطيع تحديد تلك المتغيرات كالاتي:

LinearSVC(solver='liblinear', loss='squared_hinge', C=1.0)
  • solver: يحدد المحسن Optimizer
  • C: هو معامل التسوية Regularization

يوجد العديد من المتغيرات التي نستطيع بناء النموذج بها وتحسينه لمعرفة كل المتغيرات يمكن زيارة صفحات تلك النماذج في موقع المكتبة: SVM و K-Nearest Neighbours و Logistic Regression


guest
0 تعليقات
Inline Feedbacks
اظهر كل التعليقات