كما ذكرنا لحل مشاكل تعلم الالة، هناك مجموعة من الخطوات التي نسير عليها لنصل الى افضل نموذج model وهو كالاتي
- تعريف المشكلة.
- تحليل و تجهيز البيانات.
- اختيار الخوارزمية.
- تدريب الخوازمية
- تقييم الخوارزمية.
تعريف المشكلة.
قام عالم الاحصاء البريطاني رونالد فيشر في عام 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