اولین پروژه تمرینی یادگیری ماشین (Iris dataset)

پروژه یادگیری ماشین از نوع 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')در این مرحله با کمک دستوراتی به بررسی داده‌ها می‌پردازیم:این دستور 5 سطر اول را نشان می‌دهد.این دستور از نظر آماری داده‌ها را بررسی می‌کند.در ادامه‌، برای داشتن دید بهتر نسبت به داده‌ها از نمودارها کمک می‌گیریم:برای رسم نمودارها از کتابخانه seaborn استفاده می‌کنیم.نمودار pairplotبا توجه به اینکه 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 انتخاب کنیم. الگوریتم‌های معروف در این زمینه عبارتند از:K-Nearest Neighbour (KNN)Naive Bayes classifierLogistic RegressionRandom ForestSupport Vector Machine (SVM)دو الگوریتم 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 LogisticRegressionlogreg = 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 قرار می‌گیرد!