سرنخ — خودآموز برنامه‌نویسی برای هوش مصنوعی (مقدماتی)

فصل ۱ از ۱۲

پیشرفت ترم
۰٪

ترم ۳ · اولین مدل‌ها: یادگیری ماشین

یادگیری ماشین یعنی چه

فصل ۱پیش‌نمایش رایگان

در این فصل چه یاد می‌گیری#

تا اینجا همیشه دربارهٔ گذشته حرف زدی: این داده چه می‌گوید. حالا سؤال عوض می‌شود — آیا می‌توانی چیزی را که ندیده‌ای پیش‌بینی کنی؟ یک لپ‌تاپِ تازه با این مشخصات، چند قیمت می‌خورد؟ در این فصل هیچ کدی نمی‌نویسی که مدل بسازد؛ به‌جایش دقیقاً می‌فهمی یادگیری ماشین چیست، با چه چیزی فرق دارد، و چهار کلمه‌ای را یاد می‌گیری که تا آخرِ این دوره و کلِ ژرفا هر روز به‌کارشان می‌بری.

یک ماشینِ برش‌خورده که از یک طرف جدولی از نمونه‌ها می‌گیرد و از طرفِ دیگر یک قالبِ ساخته‌شده بیرون می‌دهد

آخر این فصل می‌توانی:

  • بگویی یادگیری ماشین دقیقاً با برنامه‌نویسیِ معمولی چه فرقی دارد
  • feature و label را در هر مسئله‌ای تشخیص بدهی
  • تفاوتِ supervised و unsupervised را بگویی
  • تفاوتِ regression و classification را بگویی
  • بگویی چرا «مدل خوب است» بدونِ یک عدد، یک جملهٔ بی‌معناست

قبل از شروع#

از ترمِ ۲: جدولِ تمیز، groupby، همبستگی، و مهم‌تر از همه: قانونِ «اول داده را ببین».

سلولِ راه‌اندازی: همان laptops_clean.csv ترمِ ۲.

📓 نوت‌بوک: نوت‌بوک این فصل را در Colab باز کن — همهٔ کدهای این فصل آماده و به‌ترتیب داخلش هست.

۱. تفاوت با برنامه‌نویسیِ معمولی#

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

def is_expensive(price):
    """قاعده را «من» نوشتم: هر چیزی بالای ۳۰ میلیون گران است."""
    return price > 30_000_000

print(is_expensive(45_000_000))
print(is_expensive(12_000_000))
True
False

آن عددِ ۳۰ میلیون را من انتخاب کردم. کامپیوتر فقط اجرایش کرد.

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

برنامه‌نویسیِ معمولی یادگیری ماشین
ورودیِ تو قاعده + داده داده + جوابِ درست
خروجی جواب قاعده (مدل)
کِی به‌کار می‌آید قاعده را می‌دانی قاعده را نمی‌دانی، ولی نمونه داری

و همین‌جا اولین قضاوتِ حرفه‌ای را یاد می‌گیری: اگر قاعده را می‌دانی، مدل نساز. برای «آیا این عدد از ۳۰ میلیون بیشتر است؟» یک if بنویس. یادگیری ماشین وقتی به‌کار می‌آید که قاعده را نمی‌دانی و نوشتنش هم شدنی نیست — مثلاً «قیمتِ منصفانهٔ این لپ‌تاپ چقدر است؟» که به ده‌ها عامل و برهم‌کنششان بستگی دارد.

💡 نکته: بخشِ بزرگی از پروژه‌های شکست‌خوردهٔ یادگیری ماشین مسائلی بوده‌اند که یک قاعدهٔ ساده حلشان می‌کرد. مدل، پیچیدگی اضافه می‌کند و باید هزینه‌اش را با دقتِ بیشتر پس بدهد. این سؤال را همیشه اول بپرس.

۲. feature و label#

import pandas as pd

df = pd.read_csv("laptops_clean.csv")

features = df[["year", "ram_gb"]]
label = df["price"]

print("شکل features:", features.shape)
print("شکل label:", label.shape)
print(features.head(3))
شکل features: (238, 2)
شکل label: (238,)
   year  ram_gb
0  2021    32.0
1  2019    16.0
2  2024     8.0

دو کلمهٔ کلیدیِ کلِ این حوزه:

  • feature — چیزی که می‌دانی و به مدل می‌دهی. اینجا سال و حافظه. هر ستونی که ورودیِ مدل است، یک feature است.
  • label — چیزی که می‌خواهی پیش‌بینی کنی. اینجا قیمت. به آن target هم می‌گویند.

و یک قراردادِ نامی که در همهٔ کدهای دنیا می‌بینی: مجموعهٔ featureها را X می‌نامند (بزرگ، چون جدول است) و labelها را y (کوچک، چون یک ستون است). این قرارداد از ریاضی می‌آید و در کلِ scikit-learn و PyTorch یکسان است.

شکل‌ها را نگاه کن: X دوبعدی است (238, 2) و y تک‌بعدی (238,). هر دو باید تعدادِ ردیفِ یکسان داشته باشند — این اولین چیزی است که وقتی خطا گرفتی باید چک کنی.

🌱 ریشه‌اش کجاست: یک مدل در واقع یک تابع است: چند ورودی می‌گیرد و یک خروجی می‌دهد. تفاوتش با تابع‌های فصلِ ۷ ترمِ ۱ فقط این است که کسی بدنه‌اش را ننوشته — از داده ساخته شده. ریشه، ترم ۴ فصل ۱ — تابع: ماشینِ ورودی-خروجی همین ایده را از پایه می‌سازد.

قبل از ادامه، جواب بده: می‌خواهی پیش‌بینی کنی یک مشتری اشتراکش را تمدید می‌کند یا نه. feature و label کدام‌اند؟ جواب: label همان «تمدید کرد یا نه» است — چیزی که می‌خواهی حدس بزنی. featureها هر چیزی است که قبل از آن لحظه می‌دانی: مدتِ عضویت، تعدادِ ورود در ماهِ گذشته، مبلغِ پرداختی. و هر چیزی که فقط بعد از تمدید معلوم می‌شود، feature نیست — استفاده از آن، همان اشتباهی است که فصلِ ۴ کاملاً به آن اختصاص دارد.

۳. دو نوعِ اصلیِ مسئله#

df["is_expensive"] = df["price"] > df["price"].median()

print("پیش‌بینی خودِ قیمت (regression):", df["price"].head(3).tolist())
print("پیش‌بینی گران/ارزان (classification):", df["is_expensive"].head(3).tolist())
print(df["is_expensive"].value_counts().to_dict())
پیش‌بینی خودِ قیمت (regression): [58500000, 23400000, 54200000]
پیش‌بینی گران/ارزان (classification): [True, False, True]
{True: 119, False: 119}
  • regression — وقتی label یک عدد پیوسته است: قیمت، دما، مدتِ تحویل.
  • classification — وقتی label یک دسته است: گران/ارزان، اسپم/غیراسپم، کدام‌یک از پنج برند.

همان داده می‌تواند هر دو باشد — به سؤالت بستگی دارد، نه به داده. اینجا از روی همان ستونِ قیمت یک ستونِ دسته‌ای ساختیم.

چک کن: دو دستهٔ True و False باید دقیقاً برابر باشند (۱۱۹ و ۱۱۹). اگر نابرابر شدند، یعنی به‌جای median از عددِ ثابتی به‌عنوان مرز استفاده کرده‌ای.

توجه کن دو دسته دقیقاً ۱۱۹ و ۱۱۹ شدند، چون مرز را روی میانه گذاشتیم. این تصادفی نیست و در فصلِ ۶ می‌بینی چرا این انتخاب مهم است.

۴. supervised و unsupervised#

آنچه تا اینجا گفتیم supervised است: برای هر ردیفِ آموزشی، جوابِ درست را داری. مدل از روی جفت‌های «ورودی ← جوابِ درست» یاد می‌گیرد.

unsupervised یعنی جوابِ درستی در کار نیست. فقط داده داری و می‌پرسی «چه ساختاری در این هست؟» — مثلاً «این ۲۳۸ آگهی به چند دستهٔ طبیعی تقسیم می‌شوند؟» بدونِ اینکه از قبل دسته‌ها را تعریف کرده باشی.

supervised unsupervised
داده X و y فقط X
سؤال «y این ردیفِ تازه چیست؟» «چه ساختاری در X هست؟»
نمونه پیش‌بینیِ قیمت، تشخیصِ اسپم خوشه‌بندیِ مشتری، کاهشِ بُعد
ارزیابی ساده: جوابِ درست را داری سخت: معیارِ قطعی نداری

کلِ این ترم supervised است، به یک دلیلِ صریح: وقتی جوابِ درست را داری، می‌توانی صادقانه اندازه بگیری. و اندازه‌گیریِ صادقانه نخِ کلِ این دوره است.

۵. چرا «مدل خوب است» یک جملهٔ بی‌معناست#

فرض کن مدلی ساختی و می‌گویی «خوب کار می‌کند». پنج سؤال بلافاصله می‌آید:

  1. چقدر خوب؟ یک عدد بده.
  2. با چه معیاری؟ میانگینِ خطا؟ درصدِ درست؟ کدام؟
  3. روی کدام داده؟ همان که با آن ساختی، یا داده‌ای که ندیده؟
  4. در برابرِ چه چیزی؟ بهتر از حدسِ ساده؟ چقدر بهتر؟
  5. چقدر پایدار؟ اگر داده کمی فرق کند، همان نتیجه را می‌دهد؟

هر پنج تا در فصل‌های بعدی جوابِ دقیق می‌گیرند. ولی همین حالا باید بدانی که این پنج سؤال، خودِ کار هستند — نه یک بازبینیِ آخرِ کار. سه فصلِ بعد به‌ترتیب همین‌ها را می‌سازند: فصلِ ۲ اولین مدل، فصلِ ۳ خطِ پایه (سؤالِ ۴)، و فصلِ ۴ سؤالِ ۳ که مهم‌ترینشان است.

📏 اندازه بگیر: سه قانونِ ثابتِ این دوره را دوباره بخوان، چون از این فصل به بعد هر سه هر روز به‌کار می‌آیند: «اول داده را ببین» — «اول یک خطِ پایه بساز» — «روی چیزی که مدل ندیده امتحان کن». ترمِ ۲ کاملاً دربارهٔ قانونِ اول بود. فصلِ ۳ قانونِ دوم است و فصلِ ۴ قانونِ سوم. اگر فقط همین سه را از این دوره ببری، از خیلی از کسانی که مدل می‌سازند جلوتری.

۶. یک خطای واقعی: شکلِ X اشتباه#

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(df["year"], df["price"])
ValueError: Expected a 2-dimensional container but got <class 'pandas.Series'>
instead. Pass a DataFrame containing a single row (i.e. single sample) or a
single column (i.e. single feature) instead.

df["year"] با یک کروشه یک Series می‌دهد — تک‌بعدی. ولی scikit-learn همیشه X را دوبعدی می‌خواهد، حتی وقتی فقط یک feature داری، چون طراحی‌اش این است که X جدول باشد.

راهِ درست، دو کروشه: df[["year"]]. همان تفاوتِ Series و DataFrame از ترمِ ۲ فصلِ ۳ — که حالا معلوم شد چرا مهم بود.

🔧 اگر کار نکرد: این خانوادهٔ خطا یکی از پرتکرارترین‌های scikit-learn است و متنِ دقیقش به نسخه بستگی دارد: برای یک Series پیامِ بالا را می‌گیری و برای یک آرایهٔ numpyِ تک‌بعدی پیامِ قدیمی‌ترِ Expected 2D array, got 1D array instead را. هر دو یک چیز می‌گویند و یک راهِ حل دارند: یک کروشهٔ دیگر اضافه کن (یا برای آرایه، reshape(-1, 1)). عادت کن قبل از هر fit، X.shape را چاپ کنی — باید دو عدد داشته باشد.

🤖 از دستیارت بپرس: «سه مسئلهٔ واقعی نام ببر که به‌نظر مناسبِ یادگیری ماشین می‌آیند ولی در واقع با یک قاعدهٔ ساده بهتر حل می‌شوند.» جوابش را با معیارِ بخشِ ۱ بسنج. این سؤال عمداً برعکسِ چیزی است که معمولاً می‌پرسند — و تشخیصِ اینکه کِی نباید مدل ساخت، به‌اندازهٔ ساختنش مهارت است.

واژه‌های تازهٔ این فصل#

کلمه تلفظ به حروف فارسی یعنی چه
feature فیچِر ستونی که به مدل می‌دهی؛ چیزی که می‌دانی
label / target لِیبِل / تارگت چیزی که می‌خواهی پیش‌بینی کنی
X / y ایکس / وای قراردادِ جهانی: جدولِ featureها / ستونِ label
regression رگرسیون پیش‌بینیِ یک عددِ پیوسته
classification کلَسیفیکیشِن پیش‌بینیِ یک دسته
supervised / unsupervised سوپروایزد / آن‌سوپروایزد با جوابِ درست / بدونِ جوابِ درست

تمرین‌ها

اول خودت فکر کن یا امتحان کن — بعد اینجا را باز کن.

در فصل بعد#

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

به آخر این فصل رسیدی!

اگر ساختی و جواب داد، این دکمه مال توست.