پروژه یادگیری ماشین از نوع classification
هدف: میخواهیم Iris flowers را براساس طول و عرض کاسبرگ و گلبرگهایشان در 3 کلاس Iris Sentosa، Iris Virginica و Iris Versicolor قرار دهیم. در ضمن، دادههایمان لیبلزده هستند.
اول، دادههایمان را از سایت kaggle دانلود میکنیم.
بعد از آن Jupyter Notebook را باز کرده و کتابخانههای موردنظر را import میکنیم.
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
کتابخانه numpy: برای کار با اعداد
کتابخانه pandas: برای کار کردن با دادهها
کتابخانه matplotlib.pyplot: برای رسم نمودار
کتابخانه seaborn: برای رسم نمودارهای پیچیدهتر
حالا باید فایل دادهمان را با کمک کتابخانه pandas خوانده و در متغیر data ذخیره کنیم:
data = pd.read_csv('./Iris.csv')
در این مرحله با کمک دستوراتی به بررسی دادهها میپردازیم:
در ادامه، برای داشتن دید بهتر نسبت به دادهها از نمودارها کمک میگیریم:
برای رسم نمودارها از کتابخانه seaborn استفاده میکنیم.
با توجه به اینکه 4 ویژگی طول کاسبرگ، عرض کاسبرگ، طول گلبرگ و عرض گلبرگ را داریم و هر گل با توجه به این 4 ویژگی در یکی از 3 کلاس قرار میگیرد، ما 16 نمودار داریم که دادههای آن با 3 رنگ آبی، نارنجی و سبز تفکیک شدهاند.
ما به ستون Id احتیاجی نداریم پس آن را حذف میکنیم.
data=data.drop('Id',axis=1)
حال 4 ستون که مربوط به مشخصات فیزیکی گل است را به عنوان feature و ستون Species را به عنوان label جدا میکنیم.
X=data.drop(['Species'],axis=1) y=data['Species']
حالا باید دادهها را با کمک کتابخانه Scikit-learn به 2 گروه train و test تقسیم کنیم.
from sklearn.model_selection import train_test_split pip install scikit-learn X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=5)
در این مرحله باید یکی از الگوریتمهای یادگیری ماشین را برای classification انتخاب کنیم. الگوریتمهای معروف در این زمینه عبارتند از:
دو الگوریتم KNN و رگریسیون لجستیک را انتخاب میکنم.
در ابتدا الگوریتم KNN را پیادهسازی میکنیم. به زبان ساده، وقتی برای یک X میخواهیم y را پیشبینی کنیم، اول چند نقطه (K) در همسایگی آن انتخاب میکنیم سپس فاصله X موردنظر را از آن نقطهها حساب میکنیم، کلاسی که بیشترین رای را آورد کلاس موردنظر ماست.
چالش اصلی در این الگوریتم انتخاب درست K است که دچار overfitting یا underfitting نشویم.
الگوریتم KNN و همچنین metrics که برای اندازهگیری دقت پیشبینی است را import میکنیم.
from sklearn import metrics from sklearn.neighbors import KNeighborsClassifier
الگوریتم KNN را اجرا میکنیم و با metrics دقت پیشبینی را حساب میکنیم:
k_range = list(range(1,26)) scores = [ ] for k in k_range: knn = KNeighborsClassifier(n_neighbors=k) knn.fit(X_train, y_train) y_pred = knn.predict(X_test) scores.append(metrics.accuracy_score(y_test, y_pred))
مقدار K را از 1 تا 26 تغییر میدهیم و هر دفعه دقت پیشبینی را به آرایه scores اضافه میکنیم تا در آخر تشخیص دهیم کدام K مناسبتر است.
با استفاده از کتابخانه matplotlib نمودار K_range در مقابل scores را رسم میکنیم.
plt.plot(k_range, scores) plt.xlabel('Value of k for KNN') plt.ylabel('Accuracy Score') plt.title('Accuracy Scores for Values of k of k-Nearest-Neighbors') plt.show()
حدس میزنم که K بین 10 تا 15 مقدار مناسبی باشد. دقت پیشبینی k=13 را حساب میکنم که میشود 98.3 درصد که مقدار مناسبی است (K با دقت پیشبینی 100 درصد را انتخاب نمیکنم). تعداد K هم نه خیلی زیاد و نه خیلی کم است.
حال از الگوریتم رگریسیون لجستیک هم استفاده میکنیم تا ببینیم چه دقت پیشبینی را به ما میدهد.
from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression() logreg.fit(X_train, y_train) y_pred = logreg.predict(X_test) print(metrics.accuracy_score(y_test, y_pred))
که رگریسیون لجستیک هم همان دقت 98.3 درصد را به ما داد.
پس K=13 انتخاب خوبی است.
تعداد همسایهها را 13 تا انتخاب میکنیم و روی X و y یعنی کل دادههای اولیهمان یادگیری را انجام میدهیم (fit میکنیم) و سپس برای X جدید که در اینجا [6,3,4,2] انتخاب شده است پیشبینی را انجام میدهیم.
knn=KNeighborsClassifier(n_neighbors=13) knn.fit(X,y) knn.predict([[6,3,4,2]])
طبق این پیشبینی، گل با این مشخصات در کلاس Iris Versicolor قرار میگیرد!