ماشین لرنینگ یا یادگیریِ ماشین مثل آب خوردن!

? در انتها قراره با هم یک مدل لرن کنیم!


سلام!

یکی از دوستانم از من در مورد یادگیری‌ماشین سوال کرد و من تصمیم گرفتم خیلی کوتاه در مورد این زمینه به دوستانی که خیلی کم با کامپیوتر و حتی ریاضیات و آمار که پایه‌های این حوزه‌س آشنایی دارند یادگیری‌ماشین رو معرفی کنم!

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

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

خیلی خلاصه اول بگم که ما دو مدل Supervised Learning و Unsupervised Learning رو داریم (البته راستشو بگم Semi Supervised هم داریم) خیلی خیلی مختصر در مدل Supervised ما جواب رو خودمون داریم! (مثلا اگر می‌خوایم پیش‌بینی کنیم کسی دیابت داره یا نه مطلع‌ هستیم از این ماجرا که دیابت دارد یا ندارد) به عبارت دیگر به ازای هر فرد با ویژگی‌هایی که داره ما بهش یک لیبل دیابتی بودن یا نبودن می‌زنیم،
اما در مدل Unsupervised خودمون هم نمی‌دونیم که دقیقا کدوم داده جزو کدوم دسته‌س! و ما قراره الآن یک مدل Supervised رو با هم‌دیگه ببینیم.

اما بریم سراغ کارمون، در ابتدا قول دادم که خیلی ساده قراره با هم یک مدل رو آموزش بدیم و بررسی کنیم که چقد خوب داره کارشو انجام میده!
برای این کار شما کافیه کدی که در این لینک‌ گذاشتم رو در خود محیط گوگل‌کو‌لب (Google colab) ببینین و با توضیحات پیش بیاین. (خیالتون راحت نیاز به نصب هیچ‌چیزی نداریم)
صرفا شما لازمه لینک بالا رو باز کنید و اگر دوست دارین خودتون از کد اجرا بگیرین کافیه در هر تیکه از (Cell) روی اون قسمت که هستین Shift + Enter رو کلیک همزمان فشار بدین.

خب در شش مرحله قراره با هم یک مدل رو آموزش بدیم(!)

  • مرحله اول:
# Code source: Jaques Grobler
# License: BSD 3 clause
import matplotlib.pyplot as plt
import numpy as np from sklearn import datasets, linear_model from sklearn.metrics import mean_squared_error, r2_score # Load the diabetes dataset diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True) # Use only one feature diabetes_X = diabetes_X[:, np.newaxis, 2] # Split the data into training/testing sets diabetes_X_train = diabetes_X[:-20] diabetes_X_test = diabetes_X[-20:] # Split the targets into training/testing sets diabetes_y_train = diabetes_y[:-20] diabetes_y_test = diabetes_y[-20:]

در کد بالا ما صرفا دو دسته داده رو جدا کردیم به نام‌های test و train که به کمک trainها
(یعنی: diabetes_X_train و diabetes_y_train )
قراره مدل یادبگیره و سپس به کمک testها
(یعنی: diabetes_X_test و diabetes_y_test)
مدل رو آزمایش خواهیم کرد.

اما احتمالا براتون سواله که چرا X و Y هم اینجا در نام‌گذاری دخیل هستن،
پاسخش اینجاست که طبیعتا به ازای هر داده‌ای که داریم جوابش رو هم می‌دونیم!
اگر بخوام دقیق‌تر صحبت کنم ما داریم یک مدل یادگیری ماشین رو در دسته‌بندی Supervised بررسی می‌کنیم که همانطور که در بالا صحبت شد در این مدل ما میدونیم که دقیقا در داده متعلق به کدوم دسته هست.
اگر در مورد پاراگراف بالا گیج شدین اصلا اصلا نگرانی نداره، الان با یک مثال دوباره براتون روشن می‌کنم!


به صورت مثال در نظر بگیرین که ما داریم در مورد افرادی که به دیابت مبتلا هستند تحقیقی رو انجام می‌دیم، در این تحقیق ما با دو دسته آدم روبه‌رو‌ایم:

  • دیابتی
  • غیر دیابتی

و این که این فرد جزو کدوم دسته هست رو ما ازش مطلع هستیم!!! ( به این جواب که دیابتی هست یا نیست لیبل گذاری کردن هم میگن یعنی ما به هر فرد لیبل دیابتی بودن یا نبودن رو اختصاص می‌دیم!)
حالا در نظر بگیرین اگر دیابتی بودن و یا نبودن فرد یک تابع باشه به کمک شکل زیر میشه متوجه ماجرا شد:

train_test_flow
train_test_flow

همونطور که در شکل می‌بینین در ابتدا ماشین(مدل) به کمک داده‌های Train یادمیگیره و سپس می‌تونه که داده‌های Test رو پیش‌بینی کنه!

  • مرحله دوم:
# Create linear regression object
regr = linear_model.LinearRegression()

در مرحله دوم، یعنی کد بالا، ما مدل مورد نظر خودمون رو ساختیم!
به همیییین سادگی، تنها در یک خط به کمک کتابخونه سای‌کیت‌لرن در پایتون می‌تونین یک مدل رو بسازین.

  • مرحله سوم:
# Train the model using the training sets
regr.fit(diabetes_X_train, diabetes_y_train)

در مرحله سوم، ما دو تا دیتاستِ train که آماده کرده بودیم رو به مدل فیت می‌کنیم( به فارسی ترجمه می‌کنم، به خوردش می‌دیم) عملا مجبورش می‌کنیم باهاش یاد بگیره، این میشه معادل خطوط نارنجی شکل بالا.
(اگر یادتون رفته کافیه دوباره توضیحات مرحله اول رو بخونین)

  • مرحله چهارم:
# Make predictions using the testing set
diabetes_y_pred = regr.predict(diabetes_X_test)
# Here we can see prediction points!
print(diabetes_y_pred)

در این مرحله مدل ما به کمک داده‌هایی که به کمک اون‌ها آموزش دید اولین پیش‌بینی خودش رو انجام داد!

و می‌تونیم این پیش‌بینی رو به صورت نقطه‌هایی ببینیم( حواسمون هست که ما خودمون می‌دونیم جواب چیه دیگه؟ صرفا میخویم مدل رو آماده کنیم که بعد‌ها نقاطی رو بدیم که جوابشون رو خودمون هم نمی‌دونیم)

  • مرحله پنجم:
# The coefficients
print('Coefficients: \n', regr.coef_)
# The mean squared error
print('Mean squared error: %.2f'
% mean_squared_error(diabetes_y_test, diabetes_y_pred))
# The coefficient of determination: 1 is perfect prediction
print('Coefficient of determination: %.2f'
% r2_score(diabetes_y_test, diabetes_y_pred))

در مرحله پنجم ما ضرایب و خطا رو می‌تونیم مشاهده کنیم، این ضرایب و خطا‌ها در ادامه ماجرا به درد می‌خورن برای این که ببینم چقدر مدلمون دقیق‌ پیش‌بینی کرده و با چه خطایی!
اما شما صرفا کافیه به Coefficient of determination دقت کنین، از روی این میشه متوجه شد مدل ما چند درصد دقت‌ داشته( مثلا اگر این ضریب برابر می‌شه با:‌ 0.47 به این معنی‌ست که مدل با دقت ۴۷٪ می‌تونه پیش‌بینی کنه) این که چه دقتی خوبه یا نه بستگی به خیلی موارد داره، که اینجا نمیخوایم در موردش صحبت کنیم اما به صورت مختصر بگم براتون که بعضی وقت‌ها کلی تحقیق می‌شه که صرفا یک درصد مدل بتونه بهتر پیش‌بینی کنه! و دقت ۹۸ درصد یا ۹۹ درصد هم در بعضی مدل‌ها دیده می‌شه که البته دقت به تنهایی پارامتر کافی برای نظر دادن در این مورد که مدل ما خوب بوده یا بد نیست.

  • مرحله ششم:
# Plot outputs
plt.scatter(diabetes_X_test, diabetes_y_test,  color='black')
plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()

در مرحله آخر ما داده‌هایی که به دست‌ آوردیم رو رسم می‌کنیم تا به صورت تصویری هم ببینیم مدل ما به چه شکلی آموزش دیده، مدل ما همون خط آبی که در تصویر زیر می‌بینید هست!

linear_regression_plot
linear_regression_plot


تبریک می‌گم :)))) شما اولین مدل رگرسیون خطی خودتون رو آموزش دادین?


من توی نوشتن این مقاله(؟!) از تنها منبع زیر استفاده کردم و چیزایی که خودم خوندم این مدت که خب نمی‌تونم دقیقا اونا رو رفرنس بدم :دی
https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html
و البته به نظرم خوندن این‌ لینک‌ هم میتونه کمکتون کنه!
https://www.geeksforgeeks.org/linear-regression-python-implementation

من تمام سعی‌ام رو کردم که خیلی خیلی خلاصه با هم صحبت کنیم!


بسیار برای من خوشحال کننده‌س که نظراتتون رو با من به اشتراک بذارین =))