شرح استخدام نموذج KNN في تعليم الالة واستخدامه مع Dataset
في سلسلة تعليم الاله نشرح لكم اليوم واحد من اهم النماذج والتي تستخدم بشكل كبير مع البيانات القريبه من بعضها وهو نموذج KNN ولكي نستخدم هذا النموذج يجب علينا تثبيت مكتبة sklearn وقد سبق وشرحنا لكم هذة المكتبة ولا اعتقد اي منكم يستخدم machine learning ولا يستخدم هذة المكتبة فهي واحد من اهم المكتبات وتعتبر اساس المكتبات التي تستخدم في تعليم الاله وذلك لانها تحتوي على عدد كبير من الmodels التي يمكنك استخدامه للحصول على افضل توقع للdata التي لديك .
يايثون او لغة الثعبان كما يطلق عليها واحده من اهم لغات البرمجه التي يجب على كل مبرمج معرفتها وذلك بسبب سهولتها ولدعمها للمطورين بشكل كبير وتسهل عليهم القيام بالعديد من ال functions المختلفه وتوفر الكثير من الوقت عليهم وايضا python تدخل في تعليم الاله وهذا من اكثر التي اصبحت مطلوبه في يومنا هذا والاقبال عليها كبير جدا .
يتمتع مبرمج python بإمكانية تطوير برمجيات سطح المكتب وتطبيقات الهواتف الذكية وايضا يمكنك عمل apis لانك تستطيع ان تقوم باعمال ال backend ، اليست كل تلك المميزات تجعلك ترغب بالبدء فيها ؟ ومحن نشرح لك كل شيئ فيها تقريبا حتى ال machine learning نشرحه لك وكل ذلك بالمجان .
نبذة عن نموذج KNN في تحليل البيانات
يتم استخدام هذا الmodel عندما يكون لدينا مجموعه من الdata قريبه من بعضها البعض وتكون هذة البيانات قريبه من الtarget وفي هذة الحالة يتم استخدام نموذج KNN لحل هذة المعادلات والوصول للناتج مثلا لدينا مجموعه من الballs ومن stars وجميعهم اقرب للtarget في هذة المرحلة تعمل المكتبة على استخدام الmath لحساب اقرب space للtarget الخاص بنا وبالتالي يكون هذا هو الناتج الذي نريدة .
حفظ dataset المشروع وتقليل حجم البيانات التي بداخله في python
في هذا الكود قمنا بقراءة الملف الذي يحتوي على البيانات والذي تجدونه في اسفل المقالة وبعدها قمنا بطباعة اول خمس عناصر في الtable ومن ثم طبعنا العناصر الnull من الجدول لكي نعرف على لدينا miss value ام لا بعدها قمنا بطباعة وصف للبيانات لكي نعرف نوعية البيانات وكل شيئ عنها وبعد ذلك استخدمنا الامر standardscler لكي نقوم بتقليل كمية البيانات التي شاهدناها في ال describe وسوف نجد انها اصبحت قريبة جدا من القيمة صفر وهنا نحتاج الى استخدام نموذج KNN وهو عنوان مقالة اليوم , قبل كل شيئ قم بتحويل البيانات الى column وبعدها قمنا برسم figure يوضح لنا الشكل اخر خطوة اذا كنت تستخدم google colab او jupyter احفظ البيانات السابقة في متغير وذا عندما تريد البدء في المشروع في اي وقت اخر تبدء بتشغيل اخر كود فقط وبعدها قمنا بعمل train للmodel .
import pandas as pd
from sklearn.svm import SVC
import numpy as np
import seaborn as sns
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import pickle
np.random.seed(42)
df = pd.read_csv("wine.csv")
print(df.head()) # print head data
print(df.isna().sum()) # cheack nan value
# We print the description so you know whether the numbers are high or low
print(df.describe())
# Reduce the value of the data we get from df .
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df)
# convert data to column .
scaled_df = pd.DataFrame(scaled_data , columns=df.columns)
# pring figure but you should use google colab or jupyter
plt.figure(figsize=(10,8))
sns.heatmap(scaled_df.corr())
# Save the project in case you use google colab or jupyter in order to start the next time of work directly without having to run the rest of the previous codes.
scaled_df.to_csv("data_clean.cvs")
# training model
target = df.pop("Wine")
x_train , x_test , y_train , y_test = train_test_split(df , target , test_size=0.2 , random_state=42)
شرح استخدام نموذج KNN مع dataset ببايثون
بعد تدريب البيانات في الكود السابق سوف نعمل الان على استخدام knn model سوف نقوم بكتابة الاكود التالية اسفل السابق لكي نقوم بتعمل تدريب للنموذج والحصول على الscore و accuracy للبيانات وقمنا بطباعة البيانات لنرى اعلى نسبة ولو نلاحظ ان اعلى نسبة كانت 0.98 تقريبا في accuracy .
import pandas as pd
from sklearn.svm import SVC
import numpy as np
import seaborn as sns
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import pickle
np.random.seed(42)
df = pd.read_csv("wine.csv")
target = df.pop("Wine")
# Reduce the value of the data we get from df .
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df)
# convert data to column .
scaled_df = pd.DataFrame(scaled_data , columns=df.columns)
# pring figure but you should use google colab or jupyter
plt.figure(figsize=(10,8))
sns.heatmap(scaled_df.corr())
# training model
x_train , x_test , y_train , y_test = train_test_split(scaled_df , target , test_size=0.2 , random_state=42)
# KNN model .
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import f1_score
scores = []
accuracy = []
for i in range(1,10, 2) :
clf = KNeighborsClassifier(i)
clf.fit(x_train , y_train) # Training ( Q ) .
y_per = clf.predict(x_test) # cheack yes or no .
score = f1_score(y_test , y_per , average='weighted') # x test and The values with which we calculate
scores.append(score)
accuracy.append(clf.score(x_test , y_test))
print(scores)
print(accuracy)
# ----- O / P :
scores is : [0.9436036129748098, 0.9436036129748098, 0.9436036129748098, 0.9436036129748098, 0.9436036129748098]
accuracy is : [1.0, 0.9577464788732394, 0.9859154929577465, 0.971830985915493, 0.9788732394366197]
معرفة اعلى score في ال KNN MODEL باستخدام graph
في الكود السابق حصلنا على اعلى score وهو في القيمة 5 ولكن اذا قمنا بتدريب نموذج اكبر سوف يكون من الصعب تحديد القيمة لذلك سوف نقوم برسم graph يوضح لنا النتيجة النهائيه للرسم وايضا سوف نلاحظ ان القيمة 5 اعلى قيمة بالتحديد وكانت النسبة تقريبا 0.985 .
plt.scatter(range(1,10,2) , scores , color="red" , marker="*" , lable="train")
plt.scatter(range(1,10,2) , accuracy, color="green" , marker="-" , lable="test")
حفظ المشروع في file بعد الانتهاء من تحليل dataset وتنفيذ model عليه
بعد الانتهاء من اي مشروع وتريد حفظ المشروع نستخدم الامر dump وهو من مكتبة pickle وهذة المكتبة ايضا لا غنى عنها في machine learnong ونقوم بحفظ ملف الdata بعد تحويلها الى ارقام بدلا من ارقام وكلمات وايضا نقوم بحفظ المشروع النهائي والذي قمنا بعمل نموذج عليه لكي نحسن شكل score الخاص به .
final_model = KNeighborsClassifier(5)
final_model.fit(x_train , y_train)
pickle.dump(final_model , open("final_model.model" , "wb")) # file testing
pickle.dump(scaler , open("wine_final.model" , "wb")) # sscaling model (file data)
استخدام dataset بعد استخراجه في ملف خارجي بايثون
بعد الانتهاء من اي dataset نقوم بعدها بعمل dump لحفظها في جهازك وهذا ما تم في الخطوه السابقة وفي هذة الخطوة سوف نقوم بعمل load للملف الذي قمنا بحفظة في الخطوة السابقة ونرفع ملف البيانات وهو الملف الذي يحتوي على البيانات التي قمنا بتدريب النموذج عليها ونرفع الmodel وهو الملجد الذي يحتوي على العمليات الحسابية للارقام المدخله له , سوف نقوم بعمل متغير ونقوم بكتابة اي قيم بداخلة ولكن يجب ان تكون بعدد الcolumn الذي دربنا عليه الmodel ونحن نتقوم ان يكون الناتج 3 وذلك لان القيم التي قدمنا بإدخالها للنموذج كانت اجابتها 3 وهذا ما نتوقعه لذلك سوف نكمل الكود لنرى هل سنصل الى نفس النتيجة ام لا .
import pickle
model = pickle.load(open("wine_final.model" , "rb")) # Model
data = pickle.load(open("final_model.model" , "rb")) # data
record = [[13.08,3.9,2.36,21.5,113,1.41,1.39,.34,1.14,9.40,.57,1.33,550]] # Expected 3 , Because the value in the model for this value was 3
scaled = model.transform(record)
result = data.predict(scaled)[0]
print(result)
استخدام knn model للحصول على score بطريقة مختلفة
نرجع الى الكود السابق لكي نقوم ببعض العمليات عليها قبل عمل له dump في هذا الكود سوف نقوم بعمل اختبار للحصول على افضل قيمة ولكن سوف نقوم بتغيير الطريقة السابقة لكي نشاهد سوف نحصل على بيانات قريبة للبيانات السابقه ام لا وهل البيانات هذة افضل من البيانات السابقة ام لا حاول دائما استخدام اكثر من طريقة لكي تستطيع التفريق بين افضل طريقة وافضل القيم التي تستطيع من خلالها الحصول على افضل القيم التي تستخدم في النموذج الخاص بك
from sklearn.model_selection import cross_val_score # Cross value score .
clf = KNeighborsClassifier(5)
score = cross_val_score(clf , scaled_df , target , cv=5 , scoring="precision_weighted")
print(score)
print(sum(score)/5)
استخدام GridSearchCV في KNN ببايثون
في هذا الجزء سوف نستخدم الGridSearchCV لكي نستطيع عمل بعض الاحتمالات من خلال الامر n_neighbors ونعطية الcv التي يختبر بها وهنا نعطية القيمة 5 لكي يجرب مره 1 وثاني مره 2 وهكذا الى الوصول الى الخمسة ونستخدم verbose=3 لكي يتم طباعة كل الاحتمالات التي تحصل خلال الrun time ونشاهد القيم التي تخرج معنا .
from sklearn.model_selection import GridSearchCV
grid = GridSearchCV(KNeighborsClassifier() , {"n_neighbors":[3,5,9]} , cv=5 , verbose=3)
print(grid.fit(scaled_df , target))
اختيار افضل قيمة يمكن تنفيذ الmodel عليها
لو رجعنا للرسمه سوف نجد ان القيمة 5 افضل قيمة ايضا وايضا في النموذج السابقة كانت ال5 افضل قيمة وافضل احتمال مناسب نستخدمه لذلك سوف نستخدمها ولكن تخيل اذا كانت البيانات كبيره جدا هل من المعقول ان تبحث في كل row الى ان تجد افضل قيمة ؟ في الطبيعي لا ولذلك نستخدم الامر params لمعرفة افضل قيمة ونستخدم الامر .best_score_ للحصول على افضل score في العمليات السابقة .
import pandas as pd
from sklearn.svm import SVC
import numpy as np
import seaborn as sns
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import pickle
np.random.seed(42)
df = pd.read_csv("wine.csv")
# Reduce the value of the data we get from df .
target = df.pop("Wine")
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_data = scaler.fit_transform(df)
# convert data to column .
scaled_df = pd.DataFrame(scaled_data , columns=df.columns)
# pring figure but you should use google colab or jupyter
plt.figure(figsize=(10,8))
sns.heatmap(scaled_df.corr())
# training model
x_train , x_test , y_train , y_test = train_test_split(scaled_df , target , test_size=0.2 , random_state=42)
# KNN model .
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import f1_score
scores = []
accuracy = []
for i in range(1,10 , 2) :
clf = KNeighborsClassifier(i)
clf.fit(x_train , y_train) # Training ( Q ) .
y_per = clf.predict(x_test) # cheack yes or no .
score = f1_score(y_test , y_per , average='weighted') # x test and The values with which we calculate
scores.append(score)
accuracy.append(clf.score(x_train , y_train))
print(f"scores is : {scores}")
print(f"accuracy is : {accuracy}") # top = k = 5
final_model = KNeighborsClassifier(5)
final_model.fit(x_train , y_train)
from sklearn.model_selection import GridSearchCV
grid = GridSearchCV(KNeighborsClassifier() , {"n_neighbors":[3,5,9]} , cv=5 , verbose=3)
print(grid.fit(scaled_df , target))
print(f"best params {grid.best_params_}")
print(grid.best_params_)
print(grid.best_score_)
# --- O / P :
{'n_neighbors': 5}
0.9550793650793651
المقارنه بين SVC و KNN وايهما افضل في الmodel ؟
سوف نستخدم هنا نموذج SVC في معرفة هل هذا النموذج افضل من knn ام لا لذلك سوف نستخدم النموذج وقد سبق وشرحنا لكم النموذج بشكل كامل في اكثر من مقالة وهذا النموذج افضل نموذج يفضل استخدامه وذلك لانه اسرع الmodels واقلهم استهلاك للram لذلك سوف نجربه ربما تكون البيانات هنا افضل من النموذج الاخر وبعد تجربة النموذج كما نرى حصلنا على نسبة 0.988 وهذا افضل من النموذج السابق لذلك سوف نعتمده في هذة المسائلة .
grid = GridSearchCV(SVC() , {"kernel":['linear' , 'rbf'] , "C":[1,5,10], "gamma":[0.1 , 0.5 , 1]} , cv=5 , verbose=3)
print(grid.fit(scaled_df , target))
print(grid.best_params_)
print(grid.best_score_)
لمزيد من الدروس والشرحات في تعليم الاله يمكنكم مشاهدة الدروس السابقة لنا في الموقع