اولین پروژه یادگیری ماشین

این یه پروژه ساده‌ی یادگیری ماشینه. هدف اینه که روند کلی یه پروژه رو با هم طی کنیم. از مجموعه داده‌ی معروف آیریس برای هدفمون استفاده می‌کنیم.

مخاطب

  • اگر تازه با یادگیری ماشین آشنا شدید: سعی کنید کد ها رو روی سیستم خودتون امتحان کنید. من از ژوپیتر استفاده کردم. برای محیط های دیگه احتمالن اندکی تغییر باید بدید.
  • اگر این اولین مواجهه‌ی شما با یادگیری ماشینه، سعی کنید صرفن کلیت کار رو درک کنید و هرچیزی رو هم که متوجه نشدید، کافیه جستجو کنید درموردش. اصلن لازم نیست در این مرحله، مو به مو همه چیز رو بررسی کنید.
  • تنها پیش نیاز، کمی آشنایی با پایتونه. همین.

مراحل

  • شناخت مسئله و هدف
  • بررسی داده‌ها
  • ساخت مدل
  • بررسی کیفیت عملکرد مدل
  • جمع بندی

شناخت مسئله و هدف

گل زنبق
گل زنبق

توی این آموزش، از یه مجموعه‌ی داده‌ی معروف استفاده می‌کنیم به اسم Iris که در واقع مشخصات یک سری گل زنبق رو به ما می‌ده. کاری که ما باید بکنیم اینه که با استفاده از این اطلاعات، بتونیم تشخیص بدیم هر گل، جزو کدوم یک از انواع زنبقه.

بررسی داده‌ها

مجموعه‌ی داده‌ی Iris رو می‌تونیم با استفاده از کتابخانه scikit-learn بارگزاری کنیم:

from sklearn.datasets import load_iris
iris = load_iris()

حالا می‌تونیم از این داده استفاده کنیم. اول بیایم ببینیم که چه اطلاعاتی از گلها در اختیارمون قرار گرفته:

iris.data

چیزی که بهمون نشون داده می‌شه اینه:

array([[5.1, 3.5, 1.4, 0.2],
[4.9, 3. , 1.4, 0.2],
[4.7, 3.2, 1.3, 0.2],
...
[5.9, 3. , 5.1, 1.8]])

چندان قابل فهم نیست، نه؟ یکم توضیح لازم داره. هر سطر، نماینده‌ی یک گله. و توی هر سطر ۴ تا عدد هست، که درواقع اندازه‌ی چهار مشخصه از اون گل رو به ما می‌گه. چه مشخصه‌ای؟ اینجوری می‌شه فهمید:

iris.feature_names

خروجیش همچین چیزیه:

['sepal length (cm)',
'sepal width (cm)',
'petal length (cm)',
'petal width (cm)']

ما از هر گل چهار مشخصه رو می‌دونیم. به ترتیب طول کاسبرگ، عرض کاسبرگ، طول گلبرگ، عرض گلبرگ. همه‌ی اینها هم به سانتی متر.

کاسبرگ شاید واژه‌ی آشنایی نباشه. به نقل از ویکیپدیا:

هر یک از قطعه‌ها یا بخش‌های کاسهٔ گل که معمولاً سبز و گاه به رنگ‌های دیگر است را کاسبَرگ می‌نامند.

خب پس ما الان طول و عرض کاسبرگ و گلبرگ تعدادی گل رو می‌دونیم. دیگه چی؟

ما باید نوع هرکدوم از این گلها رو هم بدونیم. در مجموع سه نوع گل زنبق توی این مجموعه‌ی داده هست. اینجوری می‌تونیم اسماشون رو ببینیم:

iris.target_names

خروجی این دستور، اینجوریه:

array(['setosa', 'versicolor', 'virginica'], dtype='<U10')

توی این آرایه، سه تا اسم می‌بینیم که هرکدوم نوعی از زنبقه. درواقع هرکدوم از گل‌هایی که توی این مجموعه‌داده هستن، یکی از این سه تا هستن.

از کجا بفهمیم که کدوم گل، از چه نوعیه؟ کافیه این دستور رو اجرا کنیم:

iris.target

خروجیش همچین چیزیه:

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

معنی این چیه؟
اگر به خاطر داشته باشید با دستور iris.data دیدیم که هر گل چه مشخصاتی داره. حالا اینجا می‌‌بینیم که هرکدوم از اون گلها مربوط به کدوم دسته‌ن. اولین عدد، نوع اولین گل در مجموعه‌داده رو مشخص می‌کنه. دومین عدد، دومین گل(دومین سطر) رو و الی آخر. اگر دقت کنید فقط سه تا عدد توی این آرایه می‌بینید: ۰ و ۱ و ۲. اینجا صفر معادل setosa هست. ۲ به معنی versicolor هست. و ۲ هم می‌شه virginica.


خلاصه‌ی این قسمت:

ما یه تعداد گل زنبق داریم، که از هرکدوم چهار مشخصه (طول و عرض کاسبرگ و گلبرگ) رو می‌دونیم. همچنین می‌دونیم که هرکدوم از این گلها، چه نوعی از زنبق هستن. حالا کاری که می‌خوایم بکنیم اینه که ببینیم آیا در آینده می‌تونیم با داشتن این ۴ تا مشخصه، تشخیص بدیم که این گل، چه نوعی از زنبقه.

برای راحتی کار، از این به بعد مشخصات گل‌ها رو توی آرایه‌ی X و نوع هر گل رو توی y ذخیره می‌کنیم:

X = iris.data
y = iris.target

ساخت مدل

حالا قسمت خوب قضیه شروع می‌شه. ما اینجا یه ماشین جادویی قراره بسازیم که از ما مشخصات یک گل رو بگیره و بهمون بگه که این گل از چه نوعیه. به این ماشین جادویی می‌گیم مدل.

برای ساخت مدل می‌تونیم از ابزار های مختلفی که scikit-learn در اختیارمون گذاشته استفاده کنیم. اینجا، قراره از درخت تصمیم استفاده کنیم. این که درخت تصمیم دقیقن چیه رو می‌تونید توی این صفحه ویکیپدیا بخونید. ولی برای این لحظه‌، زیاد لازم نیست وارد جزئیات بشیم. می‌تونیم کار رو با خیال راحت به scikit-learn بسپریم.

درخت تصمیم رو اینجوری می‌شه ساخت:

from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()

به همین سادگی. ولی این همه‌ی ماجرا نیست. حالا باید به این مدل داده‌هامون رو بدیم تا ازشون بتونه یادبگیره و بعد بتونه بهمون بگه که گلی که مشخصاتش رو بهش دادیم، از چه نوعیه. ولی یه مشکلی هست.

یادتونه که مشخصات گل ها رو ریختیم توی متغیری به اسم X. یه نگاهی بهش بندازیم:

X.shape

خروجی این دستور اینه رو اگر توی کامپیوترتون ببینید،‌ بهتون داره می‌گه که این مجموعه داده ۱۵۰ سطر داره‌(یعنی ۱۵۰ گل) و هرکدوم ۴ مشخصه دارن‌(همونایی که دیدیم قبلتر)

اگر ما این داده‌ها رو به مدلمون بدیم، می‌تونه ازش یادبگیره که چطور گلها رو دسته بندی کنه. ولی مشکل اینه که ما نمی‌تونیم بسنجیم که آیا درست داره این کار رو انجام می‌ده یا نه. پس چه کنیم؟ می‌تونیم قسمتی از این داده‌ی موجود رو نگه داریم تا بعدن ازش برای سنجیدن کیفیت مدلمون استفاده کنیم. چطور؟ اینجوری:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

چه اتفاقی افتاده اینجا؟ با استفاده از تابع train_test_split داده‌مون رو به دو بخش train و test تقسیم کردیم. ۲۰ درصد داده رو برای تست کنار گذاشتیم، و الباقی رو برای تربیت مدل استفاده می‌کنیم.

حالا برمی‌گردیم به درخت تصمیممون. اینجا می‌تونیم داده‌هامون رو بدیم تا کار جادوییش رو انجام بده:

tree.fit(X_train, y_train)

از اونجایی که داده‌ی ما چندان حجیم نیست،‌ این عملیات هم زیاد طول نمی‌کشه (کمتر از یک ثانیه احتمالن.)

حالا می‌تونیم ازش استفاده کنیم:

predictions = tree.predict(X_test)

اگر دقت کنید، توی مرحله قبل، به مدلمون هم مشخصات گلها رو دادیم، هم نوعشون رو. اما اینجا فقط مشخصات رو دادیم. چرا؟ چون اینجا درواقع مدلمون قراره برامون نوع گل رو پیدا کنه. مقدار پیش‌بینی ها رو هم توی متغیر predictions ذخیره می‌کنیم.

بررسی کیفیت عملکرد مدل

حالا وقتشه که ببینیم که کیفیت مدلمون چطوره:

from sklearn.metrics import accuracy_score
accuracy_score(y_pred=predictions, y_true=y_test)

خروجی این کد برای من ۰.۹ بود. این یعنی از ده گل، نه گل رو درست شناسایی کرده این مدل. البته این عدد ممکنه روی کامپیوتر شما کمی بالا و پایین باشه. (جستجو کنید ببینید چرا اینجوری می‌شه)


جمع بندی

این یه پروژه‌ی خیلی کوچیک در زمینه‌ی یادگیری ماشین بود. قدم کوچیک اما مهمی برداشتید برای یادگیری. تبریک می‌گم. برای مطالعه‌ی بیشتر می‌تونید این‌ها رو جستجو کنید و مطالعه کنید:

  • یادگیری تحت نظارت (Supervised learning)
  • طبقه بندی‌ (Classification)
  • درخت تصمیم (Decision Tree)


برای دیدن آموزش‌های بعدی هم می‌تونید منو رو اینجا دنبال کنید.