نرگس رضاییان
نرگس رضاییان
خواندن ۳ دقیقه·۳ سال پیش

اولین پروژه تمرینی یادگیری ماشین (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 سطر اول را نشان می‌دهد.
این دستور 5 سطر اول را نشان می‌دهد.
این دستور از نظر آماری داده‌ها را بررسی می‌کند.
این دستور از نظر آماری داده‌ها را بررسی می‌کند.

در ادامه‌، برای داشتن دید بهتر نسبت به داده‌ها از نمودارها کمک می‌گیریم:

برای رسم نمودارها از کتابخانه seaborn استفاده می‌کنیم.

نمودار pairplot
نمودار 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 انتخاب کنیم. الگوریتم‌های معروف در این زمینه عبارتند از:

  1. K-Nearest Neighbour (KNN)
  2. Naive Bayes classifier
  3. Logistic Regression
  4. Random Forest
  5. Support 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 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 قرار می‌گیرد!




machine learningsupervised learningClassificationیادگیری ماشینیادگیری نظارت شده
شاید از این پست‌ها خوشتان بیاید