<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Mahdi Pakravan | مهدی پاکروان</title><link>https://virgool.ir/feed/@mahdipakravan.dev</link><description>همون پسره که تو کلاس نمیفهمید ، روش نمیشد بگه میرفت به زبون خودش یاد میگرفت و به زبون خودش مینوشت تو ویرگول :)</description><language>fa</language><pubDate>2026-11-11 13:48:31</pubDate><image><url>https://files.virgool.ir/upload/users/4020201/avatar/t0AE1v.jpg</url><title>Mahdi Pakravan | مهدی پاکروان</title><link>https://virgool.ir/@mahdipakravan.dev</link></image><item><title>از بمباران اخبار تا تست زدن</title><link>https://virgool.ir/@mahdipakravan.dev/از-بمباران-اخبار-تا-تست-زدن-wfccclkkrbgq</link><description>شروع ماجرا !کنکور ارشد در جنگ !این روزها، برای فرار از بمباران اخبار و اضطراب،به خواندن کنکور ارشد رو آوردم.نه از روی علاقه‌ی عجیب، نه با انگیزه‌های قهرمانانه. بیشتر شبیه یک پناهگاهه؛ جایی که حداقل می‌دونی اگر وقت بذاری، خروجی مشخصی داره و ذهنت از هیاهو جدا می‌شه.مشکل واقعی تنبلی نیست !خیلی وقت‌ها می‌شینم پشت میز، منابع بازن، همه‌چیز آماده‌ستاما هیچ اتفاقی نمی‌افته.بعد از مدتی فهمیدم اسم این وضعیت «تنبلی» نیست.مشکل اصلی، شروع کردنه.مغز با کارهایی که حجمشون زیاده، پایانشون معلوم نیست و پاداش فوری ندارن، ذاتاً مشکل داره. این مقاومت طبیعیه، نه ضعف شخصیت مقاومت طبیعیه، نه ضعف شخصیت . تعریف اشتباه از «شروع»وقتی به خودم می‌گم:«باید بشینم این مبحث رو بخونم»مغز عملاً قفل می‌کنه.اما وقتی شروع رو این‌طوری تعریف می‌کنم:فقط ۵ تا تستفقط ۱۰ دقیقهفقط یک زیرمبحث خیلی کوچیکشروع، ممکن می‌شه.قانون ۱۰ دقیقهیه قانون ساده برای خودم گذاشتم:فقط ۱۰ دقیقه.نه بیشتر. بعدش کاملاً اختیار دارم ول کنم.نکته جالب اینه که بیشتر وقت‌ها اصلاً ول نمی‌کنم،چون سخت‌ترین بخش، همون چند دقیقه‌ی اوله.تنبلی معمولاً قبل از شروعه، نه وسط کار.اول تست، بعد درسبرای ارشد، شروع با تست خیلی منطقی‌تره.حتی وقتی چیزی بلد نیستم:تست می‌زنمغلط می‌زنمجواب تشریحی رو می‌خونمتست مغز رو فعال می‌کنه و سؤال می‌سازه.بعدش خوندن معنا پیدا می‌کنه. خوندنِ بدون سؤال، اغلب فقط ورق زدنه.محیط مهم‌تر از اراده استاراده قابل اعتماد نیست.اگه:گوشی دم دست باشهتب‌های اضافه باز باشنزمان مشخص نباشهتمرکز فقط یه شعار قشنگه.ولی وقتی محیط درست طراحی می‌شه، مغز چاره‌ای جز کار کردن نداره.روزهای کم‌انرژی هم حساب می‌شنبعضی روزها واقعاً حال یادگیری عمیق نیست.اشکالی نداره.اون روزها:مروردیدن پاسخ تشریحیتست سبککافیه.مهم‌ترین چیز اینه که رشته قطع نشه.قطع شدن، برگشتن رو سخت می‌کنه.جمع‌بندیقرار نیست هر روز عالی باشم.قرار نیست هر روز حجم بالا بخونم.کافیه هر روز یه جوری شروع کنم، حتی خیلی کم.الان هدفم این نیست که بی‌نقص پیش برم.هدف اینه که نخونده نمونم.همین.عرضم تمامضعف شخصیت.</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Thu, 05 Feb 2026 17:11:06 +0330</pubDate></item><item><title>دستور پخت استارتاپ , مخصوص برنامه‌نویسان (قسمت ۱)</title><link>https://virgool.ir/@mahdipakravan.dev/دستور-پخت-استارتاپ-مخصوص-برنامه-نویسان-قسمت-۱-n2clxxv3hcgg</link><description>دستور پخت مرحله به مرحله استارتاپ برای برنامه نویسانسلام , مهدی هستم پاکروانشاید یک برنامه نویس وب , تو این بمب باران اطلاعاتی و رشد شدید ابزار ها و هوش مصنوعی من و خیلی از اطرافیانم تبدیل شدیم به آدمهایی که از صبح اللطلوع تا شب فقط میگیم ... من باید یک چیزی بسازمحالا از کجا شروع کنماین سری مقالات برای شماست , اگر چنین احساسی دارید با من همراه باشیدمطمئن باشید خوش میگذره .اول اینکه یک کسب و کار باید باید باید دو تا خصوصیت رو داشته باشه .🔹 مرحله اول: تکرارپذیر بودن مشکل و راه‌حلاولین قدم در ساخت یه کسب‌وکار موفق اینه که مشکل تکرارشونده‌ای پیدا کنی.اگه مشکلی فقط یه‌بار برای یه نفر پیش بیاد، ساختن محصول براش مثل دوختن کت برای یه نفره — تموم که شد، تمومه.اما وقتی مشکل تکرارپذیر باشه، می‌تونی کاربران رو دوباره و دوباره برگردونی.اینجاست که کسب‌وکار به‌جای یه پروژه‌ی یک‌بار مصرف، تبدیل می‌شه به یه سیستم زنده.🔹 مرحله دوم: مقیاس‌پذیری (Scalability)وقتی مطمئن شدی مشکل و راه‌حلت تکرارپذیرن، باید ببینی آیا می‌تونی اون رو برای تعداد زیادی کاربر ارائه بدی یا نه.یه ایده‌ی عالی بدون قابلیت مقیاس، فقط یه کارگاه کوچیکه.اما وقتی Scalable باشه، می‌تونه رشد کنه، افراد بیشتری رو جذب کنه و در نهایت پایدار بمونه.هرچقدر درآمد شما بیشتر بشه هزینه بیشتر میشه ولی سود شما باید بیشتر بشه (ویدئوی یوتیوب Startup With Manuel در لینک زیر)لینک فیلم کامل عکس بالا : https://www.youtube.com/playlist?list=PLlOYWOO1awoQndJA4UpPmSs1U8WrH4OqOحالا برای مقیاس پذیر کردن یک استارتاپ روش زیاده مثلا :۱-Outsourcing۲-Platforming۳-استفاده از Aiاینا رو خودتون خوب میدونید که چطوری میتونید با کمک هوش مصنوعی وسایر چیز هایی که ذکر کردم یک کسب و کار مقیاس پذیر داشته باشم .حالا بریم سراغ شروعمراحل شروع یک بیزینسمرحله منفی ۲: Ideationاینجا تازه اول کاره، یه ایده تو ذهنت جرقه زده.کاری که باید بکنی اینه که همون لحظه ایده رو دقیق روی کاغذ بنویسی.نه توی ذهن نگهش دار، نه بسپرش به حافظه. هرچقدر واضح‌تر بنویسی، بعداً بهتر می‌تونی روش فکر کنی و شکلش بدی.مرحله منفی ۱: Conceptingقبل از اینکه بری سراغ ساختن، باید هدف رو مشخص کنی.نگو می‌خوام بشم اوبر، یا اسنپ.بگو می‌خوام چه مشکلی رو برای چه آدم‌هایی حل کنم.با تیمت هماهنگ شو و مطمئن شو همه توی یه مسیر دارن حرکت می‌کنن.اینجا قراره مفهوم اصلی بیزینست شکل بگیره. مرحله ۰: Commitmentاینجا نقطه‌ایه که از حرف، وارد عمل می‌شی.استارتاپ بازی احساسات نیست، بازی تعهده.ایده داشتن راحته، ولی چیزی که باعث میشه ایده زنده بمونه، تعهد تیمه.اگه تیم داری، از روز اول شفاف صحبت کن:کی چقدر زمان می‌ذاره، کی قراره چند ماه بدون درآمد کار کنه، سهم هر نفر چقدره و قرار کی به پول برسین.این‌ها باید مکتوب و امضا بشن، نه فقط توی حرف و چت.حتماً درباره‌ی Co-Founder Agreement بخون.توش نقش هر نفر، درصد سهام، نحوه تصمیم‌گیری، شرایط خروج و تقسیم سود مشخص میشه.بیشتر استارتاپ‌ها به خاطر نبود همین شفافیت از هم می‌پاشن، نه به خاطر ایده بد.تعهد فقط به تیم نیست، به خودته هم هست.اگه قراره این مسیر رو بری، باید هر روز یه قدم برداری، حتی وقتی انگیزه نداری.پایداری مهم‌تر از انگیزه است.مرحله ۱: Validationاینجا وارد دنیای واقعی می‌شی.می‌خوای بفهمی آیا چیزی که تو ذهنته واقعاً برای بقیه ارزش داره یا نه.قبل از اینکه محصول کامل بسازی، باید جواب سه سؤال رو پیدا کنی:۱. این مشکل واقعاً وجود داره؟۲. مردم حاضرن براش پول بدن؟۳. راه‌حل من براشون کار می‌کنه؟Customer–Problem Fit:مطمئن شو داری یه مشکل واقعی رو حل می‌کنی.از خودت بپرس چند بار تکرار می‌شه، چقدر براشون مهمه، تا حالا چه راه‌حلی داشتن.اگه کسی گفت «اگه این مشکل حل بشه پول می‌دم»، یعنی داری درست می‌ری.MVP:یه نسخه ساده بساز، فقط برای تست.می‌تونه یه لندینگ پیج باشه، یه فرم، یا حتی یه دمو دستی.هدف MVP قشنگی نیست، سرعت یادگیریه.داده‌محور تصمیم بگیر:چند نفر ثبت‌نام کردن، چند نفر پول دادن، چند نفر برگشتن.بذار داده تصمیم بگیره، نه هیجان.Fail Fast, Learn Faster:اگه دیدی ایده جواب نمی‌ده، سریع جهت رو عوض کن.شکست یعنی یادگیری سریع‌تر، نه باخت.در پایان Validation می‌فهمی کدوم ایده ارزش داره، کدوم مشتری حاضر پول بده، و آیا مسیر رشد قابل تکراره یا نه.مرحله ۲: Scalingاز صد تا استارتاپ، شاید ده‌تا بتونن برسن به این مرحله.اینجا باید بیزینس مدل رو بسازی، بفهمی منطق درآمد و هزینه‌ت چیه و چطور قراره رشد کنی.از اینجا به بعد من بوم کسب‌وکار FrontGPS رو قدم‌به‌قدم می‌نویسم.حالا بریم بوم کسب و کار رو تولید کنیمما برای بیزینس های انتفاعی و غیرانتفاعی بیزینس مدل های یکسانی رو میتونیم داشته باشیم تا حدیمعنای بیزینس های انتفاعی و غیرانتفاعی چیست ؟بیزینس مدل : منطق کسب و کاربیزینس پلن : چطوری این بیزینس میخواد اجرا بشه (نقشه‌ی راه یا نقشه‌ی تکامل)از اینجا به بعد بوم کسب ‌و کار بیزینس خودم FrontGPS رو تکمیل خواهم کرد .قسمت اول بوم ; Customer Segmentاول از همه باید بگیم ما چه مشتری هایی داریم (چه سگمنت مشتری هایی داریم) و کدوم سگمنت ها رو جذب کنیممنظورم از سگمنت : مثلا توسعه دهنده های وب جونیوراول میایم بر اساس این شرایط سگمنت ها رو در میاریم :جدول راهنمای سگمنت بندیحالا رده بندی و تصمیم گیری برای سگمنت های مورد نظرمونسگمنت های الکی و کوچیک درست نکنید , حجم های بزرگ ۱۰۰۰ نفر به بالا رو تارگت کنید .رده بندی و امتیاز دهی به هر سگمنتحالا ۱ الی ۳ مشکل سگمنتی که انتخاب کردیم رو بنویسیم , نکته , ۱ الی ۳ تا نیازی نیست ۲۰ تا مشکل رو حل کنید.میتونید از تکنیک ۵ چرا استفاده کنید مثلا :تکنیک ۵ چرادر این راه حل ۵ مرحله چرایی یک اتفاق رو پیدا میکنیم و براش بدنبال راه‌حل میگردیم .قسمت دوم بوم ; Early Adoptersکسانی که مشکل رو دارن , دنبال راه حل هستن , یکطوری میتونن با سولوشن های سختشون مشکل رو حل کنن و در مرحله آخر پول داشته باشن که خرج کنن برای حل مشکل هرم Early Adapterقسمت سوم بوم ; ٰValue Porposition قلب تپنده‌ی بومارزش کسب و کار خودتون رو باید بدست بیارید و اون چیزی که باعث میشه آدم ها بخاطرش پول بدنهرم زیر رو ببینید به ترتیب از پایین به بالا پیشنهادات مهمتر و هرچی بالاتر میره کم اهمیت تر میشن .مثلا اپل اومد دردسر های مردم رو کمتر کرد و یک موبایل ساخت که همه‌چیز رو داشتههرچی بالاتر بریم جایگزینیش سخت تر اما یونیک تر میشهقسمت چهارم بوم ; کانال هاکانال ارتباطی برای هر سبکی از پروژه متفاوته , اگر تارگت شما یکسری سالمند هستند که نباید براشون حتما سایت بزنید باید بگردید دنبال اینفلوئنسر های مرتبط یا ...قسمت پنجم بوم ; جریان درآمدیما چند نوع جریان درآمدی داریم :انواع جریان های درآمدیما چند نوع جریان درآمدی داریم که هر بیزینس می‌تونه یکی یا ترکیبی از اون‌ها رو داشته باشه.۱. مدل‌های رایگان (Free-based)Free: مثل تلگرام یا اینستاگرام، کاملاً رایگان ولی درآمد از تبلیغات.Donation: کاربران داوطلبانه پول می‌دن، مثل پلتفرم‌های حمایتی.Freemium: نسخه‌ی پایه رایگانه، ولی امکانات خاص پولیه. مثل Skype یا Notion.۲. فروش مستقیم (Direct Selling)فروش اشتراک: مثل فیلیمو یا نتفلیکس، پرداخت دوره‌ای برای دسترسی.فروش مستقیم: مثل دیجیکالا یا آمازون.Paid per Use: پرداخت برای هر بار استفاده از سرویس.Dynamic Pricing / Flat Rate: قیمت‌گذاری شناور بر اساس شرایط، مثل اسنپ در ساعت‌های مختلف.۳. شخص ثالث (Third Party)درآمد از واسطه‌گری یا Affiliate مثل ریفرال دادن و دریافت درصد از فروش.۴. واسطه‌گری (Commission-based)درآمد از کمیسیون هر تراکنش، مثل مدل راننده‌های اسنپ.بعضی از بیزینس‌ها هم ترکیبی از چند مدل رو باهم استفاده می‌کنن تا جریان درآمدی پایدارتری بسازن.قسمت ششم بوم: هزینه‌ها (Cost Structure)اینجا مشخص می‌کنیم پول کجا خرج می‌شه.هزینه‌ها می‌تونن شامل توسعه، سرور، تبلیغات، تیم، و پشتیبانی باشن.با مقایسه‌ی هزینه‌ها و درآمد، نقطه‌ی سر‌به‌سر (Break-even Point) به‌دست میاد؛ یعنی جایی که بیزینس از ضرر خارج می‌شه و شروع به سوددهی می‌کنه.قسمت هفتم بوم: استراتژی درآمدزایی (Monetization Strategy)اینجا تمرکز روی بهینه‌سازی رشد و سودآوریه.CAC (Customer Acquisition Cost): هزینه جذب هر کاربر.CLV (Customer Lifetime Value): میانگین ارزشی که هر کاربر در طول زمان برای ما ایجاد می‌کنه.هدف اینه که CLV همیشه از CAC بیشتر باشه.Retention Rate: نرخ بازگشت کاربر.یعنی چند درصد از کاربرها بعد از اولین تجربه دوباره برمی‌گردن.هرچی نرخ بازگشت بالاتر باشه، هزینه جذب پایین‌تر میاد و رشد طبیعی‌تر می‌شه.قسمت هشتم بوم: مزیت ناعادلانه (Unfair Advantage)اینجا باید مشخص کنی چه چیزی باعث می‌شه رقبا نتونن راحت جایگزینت بشن.مثلاً:تیم قوی و متخصصبرند شناخته‌شدهجامعه کاربری وفاداررنکینگ خوب در SEOیا حتی داده‌هایی که فقط تو بهشون دسترسی داریمثلاً منطقی نیست یه شرکت مثل «هلو» وارد استریم آنلاین بشه، چون اون مزیت رقابتی‌ای که مثلاً AppleTV داره رو نداره.امیدوارم مقاله خوبی بوده باشه :)</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Sun, 19 Oct 2025 17:30:44 +0330</pubDate></item><item><title>یادگیری ماشین به زبان من ( مرحله 16 - مدل SVM)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-16-مدل-svm-al7hkpf1fjfj</link><description>حالا می‌ریم سراغ یادگیری بدون نظارت (Unsupervised Learning).قضیه از چه قراره؟پیدا کردن بهترین خط یا صفحه (Hyperplane) که داده‌ها رو از هم جدا کنه.توضیح ریاضیالگوریتم SVM:به تصویر بالا نگاه کنید :دنباله خط سیاهی که کشیده شده رو SVM (Support Vector Machine) مینامند .و فاصله بین خط و نزدیک ترین نقاط (بخش خاکستری ) رو Margin مینامندبرای درک بهتر این الگوریتم بشدت پیشنهاد میکنم بیاید وارد این وبسایت و خودتون بسازید و با اعدادش بازی کنیدhttps://greitemann.dev/svm-demoبریم کد بزنیم , اول میخوام یک سری دیتا تولید کنم بعد باهم روش SVC انجام بدیم :from sklearn.datasets import make_blobs&#xA;import matplotlib.pyplot as plt&#xA;import numpy as np&#xA;X, y = make_blobs(50, n_features=2, centers=2, random_state=40)&#xA;y = np.where(y == 0, -1, 1)&#xA;plt.scatter(X[:, 0], X[:, 1], c=y)&#xA;plt.show()پیاده سازی SVC به صورت خطی :حالا میخوایم که به صورت خطی ( Linear SVM) جدا سازی رو انجام بدیم .که فرمولش اینه :w · x + b = 0ما باید طوری w و b رو انتخاب کنیم که کمترین Margin رو داشته باشیمyᵢ(w · xᵢ + b) ≥ 1چند تا نقطه ای که لبه وکتور قرار دارند هم Support Vector گفته میشود .حالا ما باید کدی بنویسیم که بهترین w و b رو به ما بده :from sklearn.datasets import make_blobs&#xA;from sklearn.svm import SVC&#xA;import matplotlib.pyplot as plt&#xA;&#xA;X, y = make_blobs(n_samples=100, centers=2, random_state=42)&#xA;&#xA;model = SVC(kernel=&#39;linear&#39;, C=1)&#xA;model.fit(X, y)&#xA;&#xA;plt.scatter(X[:, 0], X[:, 1], c=y, cmap=&#39;bwr&#39;)&#xA;&#xA;w = model.coef_[0]&#xA;b = model.intercept_[0]&#xA;&#xA;import numpy as np&#xA;x_vals = np.linspace(X[:, 0].min(), X[:, 0].max(), 100)&#xA;y_vals = -(w[0] * x_vals + b) / w[1]&#xA;plt.plot(x_vals, y_vals, &#39;k--&#39;)&#xA;plt.title(&#34;SVM with Linear Kernel&#34;)&#xA;plt.show()حالا ما باید یک سری از پارامتر هایی که VC میگیره رو بدونیم چیه :پارامتر اول Kernel .کرنل چیست (Kernel) :کرنل (Kernel) روشی هست برای اینکه بتونیم داده‌هایی که در فضای فعلی جداشدنی نیستند (مثلاً در ۲ بعد)، به یک فضای با بُعد بالاتر ببریم که در اونجا قابلیت جدا شدن داشته باشند.برای مثال اینجا رو ببینید :کرنل دقیقا یعنی چی ؟به تصویر بالا دقت کنید , داده ها به یک فضای ۲ بعدی رفته و سپس قابل جدا سازی شده اند , ما در SVM همین موارد رو داریم .پس کرنل یک ترفند ریاضیه که کمک می‌کنه بدون اینکه واقعاً داده‌ها رو به فضای جدید ببریم، بتونیم اثر اون انتقال رو حساب کنیم.مثال معروف: اگر داده‌ها در ۲ بعد دایره‌ای باشن و قابل جداسازی نباشن، با کرنل می‌تونیم اونا رو به فضای ۳ بعدی ببریم تا با یه صفحه (plane) جدا بشن.ازتون دعوت میکنم این مقاله رو هم نگاهی بیندازید :https://borisburkov.net/2021-08-03-1/حالا در مثال SVC به چه صورته ؟دوستان ما انواع کرنل رو داریم که مهم ترین اونها برای ما polynomial هستش در این مبحث که میاد داده‌ها رو با توان‌های مختلف به فضای بالاتر می‌بره (مثل x2,x3,...x^2, x^3, ...x2,x3,...) مثل تصویر زیر :kernel polynomial in Classification,Clusteringنیازی نیست حتما تو مبحث ریاضیاتی کرنل وارد بشید همین دید کلی رو داشته باشید . با کد به راحتی قابل پیاده سازی خواهد بود .پارامتر بعدی که SVC میگیره گاما هستش برای کرنل های RBF .این تابع می‌گه هر دو نمونه چقدر به هم نزدیکن (به صورت یک عدد بین ۰ و ۱).from sklearn.svm import SVC&#xA;from sklearn.datasets import make_circles&#xA;import matplotlib.pyplot as plt&#xA;import numpy as np&#xA;&#xA;X, y = make_circles(noise=0.1, factor=0.2, random_state=1)&#xA;&#xA;for gamma in [0.1, 1, 10]:&#xA;    svc = SVC(kernel=&#39;rbf&#39;, gamma=gamma)&#xA;    svc.fit(X, y)    plt.title(f&#39;gamma = {gamma}&#39;)&#xA;    plt.scatter(X[:, 0], X[:, 1], c=y)&#xA;    plt.show()این بود کلیت مبحث SVC که امیدوارم مورد توجهتون قرار گرفته باشه .</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Sun, 25 May 2025 18:30:47 +0330</pubDate></item><item><title>یادگیری ماشین به زبان ساده ( مرحله 15 - مدل Logistic Regression)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-14-توضیح-کامل-logistic-regression-onbyh3lnajqs</link><description>مدل Logistic Regression در Classificationشاید اسمش یه کم گول‌زننده باشه و فکر کنید قراره یه چیزی رو &#34;رگرس&#34; کنه، اما در واقع، رگرسیون لجستیک یه قهرمان بلامنازع در دنیای طبقه‌بندی (Classification) میباشد .قضیه از چه قراره؟یادتونه تو مدل‌های رگرسیون خطی، می‌خواستیم یه خروجی پیوسته رو پیش‌بینی کنیم؟مثلاً قیمت خونه یا نمرات دانشجو و ...خب، حالا فرض کنید می‌خوایم یه سوال &#34;بله یا خیر&#34; رو جواب بدیم.مثلاً: آیا این ایمیل اسپمه؟ یا آیا این بیمار سرطان داره؟ یا آیا این مشتری محصول رو می‌خره؟اینجا دیگه رگرسیون خطی کارساز نیست. چرا؟ چون خروجیش می‌تونه هر عدد حقیقی باشه، در حالی که ما فقط &#34;بله&#34; یا &#34;خیر&#34; (یعنی ۰ یا ۱) رو می‌خوایم.اینجاست که رگرسیون لجستیک وارد میشه و با یه ترفند باحال، خروجی پیوسته رو تبدیل می‌کنه به یه احتمال بین ۰ و ۱.اگه این احتمال مثلاً بالای ۰.۵ بود، می‌گیم &#34;بله&#34; وگرنه &#34;خیر&#34;. ساده و کاربردی!اگر اهل مقاله زبان اصلی هستید , مقاله های زیر رو بشدت پیشنهاد میدم مطالعه کنید ؛https://www.datacamp.com/tutorial/understanding-logistic-regression-pythonتوضیح ریاضیانواع Logistic Regressionهمانطور که در پست کلاس بندی گفتم ما میتونیم از Logistic Regression هم برای Binary Class و هم برای Multi Class استفاده کنیم :Binary Logistic Regression : نهایتا ۲ دستهMultinomial Logistic Regression : بالای ۲ دستهOrdinal Logistic Regression: دسته ها دارای ترتیب هستند مثل سطح تحصیلاتبریم کد بزنیمابتدا این کد رو بزنید تا شما هم دیتاست من رو داشته باشید :import numpy as np&#xA;from sklearn.datasets import make_classification&#xA;&#xA;np.random.seed(42)&#xA;&#xA;X, y = make_classification(n_samples=100, n_features=2, n_classes=2, n_clusters_per_class=1, n_informative=2, n_redundant=0, random_state=42)&#xA;&#xA;plt.figure(figsize=(8, 6))&#xA;plt.scatter(X[y == 0, 0], X[y == 0, 1], color=&#39;red&#39;, label=&#39;Class 0&#39;)&#xA;plt.scatter(X[y == 1, 0], X[y == 1, 1], color=&#39;blue&#39;, label=&#39;Class 1&#39;)&#xA;plt.xlabel(&#39;Feature 1&#39;)&#xA;plt.ylabel(&#39;Feature 2&#39;)&#xA;plt.legend()&#xA;plt.grid(True)حالا پیاده سازی مدل و تست:model = LogisticRegression(random_state=42)&#xA;model.fit(X_train, y_train)&#xA;y_pred = model.predict(X_test)&#xA;&#xA;accuracy = accuracy_score(y_test, y_pred)&#xA;print(f&#34;Accuracy: {accuracy:.2f}&#34;)&#xA;&#xA;cm = confusion_matrix(y_test, y_pred)&#xA;plt.figure(figsize=(6, 4))&#xA;sns.heatmap(cm, annot=True, fmt=&#39;d&#39;, cmap=&#39;Blues&#39;, cbar=False)&#xA;plt.title(&#39;Confusion Matrix&#39;)&#xA;plt.xlabel(&#39;Predicted&#39;)&#xA;plt.ylabel(&#39;Actual&#39;)&#xA;plt.savefig(&#39;confusion_matrix.png&#39;)&#xA;print(&#34;\nClassification Report:&#34;)&#xA;print(classification_report(y_test, y_pred))نتیجه زیاد مطلوب نیست :اگر روش تحلیل رو نمیدونید این پست رو ببینید .ما برای بهبود این نتیجه ها باید بیایم هایپر پارامتر ها رو تنظیم کنیم .همانطور که الان میبینید در قسمتی که کلاس Logistic Regression رو فراخوانی کردیم آرگومان های خاصی بهش ندادیم . ولی ما میتونیم با تنظیم هایپرپارامتر ها بهترین نتیجه رو از مدل بگیریم .برای اینکه بیشتر با مدل آشنا شوید این کد رو بزنید :هایپرپارامتر ها‌ی Logistic Regressionhttps://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.htmlpenalty (جریمه):توضیح: مشخص می‌کند که از چه نوع منظم‌سازی برای جلوگیری از بیش‌برازش استفاده شود. منظم‌سازی وزن‌های مدل را محدود می‌کند.اگر با Lasso و Ridge در رگرسیون آشنایی ندارید انتهای این مطلب را مشاهده کنید .مقادیر ممکن:&#39;l1&#39;: منظم‌سازی L1 (Lasso)، که می‌تواند برخی وزن‌ها را دقیقاً صفر کند.&#39;l2&#39;: منظم‌سازی L2 (Ridge)، که وزن‌ها را کوچک می‌کند اما صفر نمی‌کند.&#39;elasticnet&#39;: ترکیبی از L1 و L2.&#39;none&#39;: بدون منظم‌سازی.تأثیر: نوع جریمه روی پیچیدگی مدل و انتخاب ویژگی‌ها تأثیر می‌گذارد. مثلاً L1 برای دیتاست‌هایی با ویژگی‌های زیاد و غیرمرتبط مناسب است.پیش‌فرض: &#39;l2&#39;max_iter (حداکثر تعداد تکرارها):توضیح: حداکثر تعداد تکرارهایی که الگوریتم بهینه‌سازی برای همگرایی انجام می‌دهد.مقادیر ممکن: یک عدد صحیح (مثلاً 100، 1000).تأثیر: اگر خیلی کوچک باشد، مدل ممکن است قبل از همگرایی متوقف شود. برای دیتاست‌های پیچیده‌تر، عدد بزرگ‌تری نیاز است.پیش‌فرض: 100tol (تحمل همگرایی):توضیح: معیاری برای توقف زودهنگام الگوریتم بهینه‌سازی وقتی تغییرات در تابع هزینه کم شود.مقادیر ممکن: یک عدد مثبت کوچک (مثلاً 1e-4، 1e-3).تأثیر: مقادیر کوچک‌تر باعث می‌شوند الگوریتم دقیق‌تر عمل کند اما زمان بیشتری ببرد.پیش‌فرض: 1e-4class_weight (وزن کلاس‌ها):توضیح: برای مدیریت دیتاست‌های نامتوازن، وزن‌های متفاوتی به کلاس‌ها اختصاص می‌دهد.مقادیر ممکن:None: همه کلاس‌ها وزن یکسان دارند.&#39;balanced&#39;: وزن‌ها به صورت خودکار بر اساس تعداد نمونه‌های هر کلاس تنظیم می‌شوند.دیکشنری مثل {0: 1.0, 1: 2.0} برای وزن‌دهی دستی.تأثیر: در دیتاست‌های نامتوازن، این پارامتر به بهبود عملکرد مدل روی کلاس اقلیت کمک می‌کند.پیش‌فرض: Nonemulti_class (استراتژی چندکلاسه):توضیح: مشخص می‌کند چگونه مسائل چندکلاسه مدیریت شوند.مقادیر ممکن:&#39;ovr&#39;: یک مدل باینری برای هر کلاس در برابر بقیه.&#39;multinomial&#39;: یک مدل چندکلاسه با تابع هزینه softmax.تأثیر: برای مسائل چندکلاسه، این پارامتر نوع مدل را مشخص می‌کند. در مسائل باینری تأثیر کمتری دارد.پیش‌فرض: &#39;auto&#39;l1_ratio (نسبت L1 در elasticnet):توضیح: نسبت ترکیب L1 و L2 در منظم‌سازی elasticnet (بین 0 و 1).مقادیر ممکن: یک عدد بین 0 (فقط L2) و 1 (فقط L1).تأثیر: فقط وقتی penalty=&#39;elasticnet&#39; و solver=&#39;saga&#39; باشد استفاده می‌شود. برای تعادل بین انتخاب ویژگی و کاهش وزن‌ها مناسب است.پیش‌فرض: Noneبهترین هایپرپارامتر ها برای مدل من کدام هستند ؟برای بدست اوردن بهترین هایپر پارامتر ها میتونید از GridSearchCV استفاده کنید :‍‍‍model = LogisticRegression(random_state=42)&#xA;&#xA;param_grid = {&#xA;        &#39;penalty&#39;: [&#39;l1&#39;, &#39;l2&#39;],&#xA;        &#39;C&#39;: [0.1, 1.0, 10.0],&#xA;        &#39;solver&#39;: [&#39;liblinear&#39;],&#xA;        &#39;max_iter&#39;: [100, 200]&#xA;}&#xA;&#xA;grid_search = GridSearchCV(model, param_grid, cv=5, scoring=&#39;accuracy&#39;)&#xA;grid_search.fit(X_train, y_train)&#xA;&#xA;print(&#34;Best Parameters:&#34;, grid_search.best_params_)&#xA;print(&#34;Best Accuracy:&#34;, grid_search.best_score_)&#xA;&#xA;# تست مدل با بهترین پارامترها&#xA;best_model = grid_search.best_estimator_&#xA;y_pred = best_model.predict(X_test)&#xA;print(&#34;Test Accuracy:&#34;, grid_search.score(X_test, y_test))امیدوارم این مقاله رو دوست داشته باشید و خوشحال میشم نظرتون رو بدونم .</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Sun, 25 May 2025 18:19:27 +0330</pubDate></item><item><title>یادگیری ماشین به زبان من ( مرحله 14 - داده نامتوازن ImBalanced Data)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-14-داده-نامتوازن-imbalanced-data-qtqrklpj05mk</link><description>به این تصویر دقت کنید:داده های ناتوازنخیلی وقت ها داده اولیه ما ممکنه نامتوازن باشه . این توضیح با Outlier متفاوته ما در Outlier داده هایی داشتیم که از رنج عادی خارج بودن , مثلا درآمد همه بین ۱ میلیون تا ۱۰۰ میلیون بود ولی یهو یک نفر ۱۰۰ میلیارد درآمد داشت .ولی در Imbalanced Data ما با مقدار غیرعادی طرف نیستیم؛بلکه با تعداد غیرمتعادل در بین کلاس‌ها مواجهیم.خلاصه:Outlier → مقدارش غیرعادیه.Imbalanced Data → تعدادش غیرمتعادل بین کلاس‌هاست.مشکلش چیه ؟وقتی با داده‌های نامتوازن (Imbalanced) طرفیم، داریم با مدلی کار می‌کنیم که خیلی به داده اکثریت اتکا می‌کنه و ممکنه تو پیش‌بینی دسته‌ی اقلیت (مهم!) اشتباه‌های جدی بکنه.به زبان ساده : داده ما اون‌قدر مطمئن و منصفانه نیست که بشه به پیش‌بینی‌هاش اعتماد کامل کرد.مثلا اگر ما یک دیتاست داشته باشیم که نصف تارگت مثبت و نصف اون منفی باشن اون موقع ما دیتاست Balance داریم در غیر این صورت ImBalanceیک نکته مهم :ممکنه نتیجه Accuracy مدل شما خیلی عالی باشه و کار کنه ولی متوجه نشید که داده های ناتراز چه بلایی سر نتیجه مدل اورده , پس حواستون باشه که این مقاله بسیار بسیار مهمه !در رگرسیون هم قبل از اینکه وارد مدل بشیم باید داده هامون رو Balance کنیم؟مسئله‌ی نامتوازن بودن داده‌ها (Imbalanced Data) بیشتر توی Classification خودش رو نشون می‌ده، ولی در رگرسیون هم داده‌هایی داریم که مشکل‌ساز می‌شن. البته توی رگرسیون دیگه اسمش Imbalanced نیست، بلکه بیشتر به شکل Skewed Distribution (توزیع کج‌شده)، یا وجود Outlierهای پراثر مطرح می‌شه.حالا در ادامه یاد میگیریم که داده های نامتوازن رو هم در رگرسیون و هم در Classification هندل کنیم .مدیریت داده های نامتوازن (Imbalanced) در رگرسیون :همانطور که گفتم داده نامتوازن در رگرسیون شکل متفاوتی با کلسیفیکیشن داره . ابتدا با مفهوم چولگی یا Skewed آشنا بشید :توزیع چولگی یا غیرنورمال Skewedدر رگرسیون، ممکن است مقادیر هدف در بازه‌های خاصی تمرکز داشته باشند و نمونه‌های پرت (outliers) یا داده‌های نادر در بعضی بازه‌ها وجود داشته باشد.داده های ما اگر به صورت توزیع نورمال نباشند قطعا به مشکل میخوریم و یک داده اشتباه در نهایت بدست میاریم :چطوری در داده رگرسیون بفهمیم چولگی داریم ؟stats.skew(data[&#39;Target&#39;])که اگر مثبت باشه چولگی به راست و منفی باشه چولگی به چپ و ۰ باشه یعنی نرمالدر رگرسیون شما به ۳ روش میتونید داده ها رو متوازن کنید که هر ۳ در کد زیر نوشته شده :۱-تبدیل لگاریتمی (اضافه کردن ۱ برای مثبت کردن داده ها)۲-تبدیل ریشه دوم۳-تبدیل BoxCoxبریم کد بزنیم (هندل کردن Imbalanced در رگرسیون) :import numpy as np&#xA;import pandas as pd&#xA;import matplotlib.pyplot as plt&#xA;import seaborn as sns&#xA;from scipy import stats&#xA;&#xA;np.random.seed(42)&#xA;n_samples = 1000&#xA;&#xA;X = np.random.exponential(scale=2, size=n_samples)&#xA;y = 3 * X + np.random.normal(0, 1, n_samples)&#xA;&#xA;data = pd.DataFrame({&#39;Feature&#39;: X, &#39;Target&#39;: y})print(stats.skew(data[&#39;Target&#39;]))در قسمت بالا کد دیتاست تستی خودمون رو میبینید , و نتیجه چولگی : 1.830حالا میام به هر ۳ روش چولگی رو هندل میکنم :#z تبدیل به روش لگاریتمی&#xA;data[&#39;Target_log&#39;] = np.log1p(data[&#39;Target&#39;] - data[&#39;Target&#39;].min() + 1)&#xA;&#xA;# تبدیل ریشه دوم&#xA;data[&#39;Target_sqrt&#39;] = np.sqrt(data[&#39;Target&#39;] - data[&#39;Target&#39;].min() + 1)&#xA;&#xA;# تبدیل Box-Cox&#xA;data[&#39;Target_boxcox&#39;], _ = stats.boxcox(data[&#39;Target&#39;] - data[&#39;Target&#39;].min() + 1)با این کد میتونید نتیجه و حالت اولیه رو به صورت تصویری رسم کنید :plt.figure(figsize=(12, 8))&#xA;&#xA;plt.subplot(2, 2, 1)&#xA;sns.histplot(data[&#39;Target&#39;], kde=True)&#xA;plt.title(&#39;Before Balancing&#39;)&#xA;plt.subplot(2, 2, 2)&#xA;sns.histplot(data[&#39;Target_log&#39;], kde=True)&#xA;&#xA;plt.title(&#39;Balancing in Log Scale&#39;)&#xA;plt.subplot(2, 2, 3)&#xA;sns.histplot(data[&#39;Target_sqrt&#39;], kde=True)&#xA;plt.title(&#39;Balancing in Sqrt Scale&#39;)&#xA;&#xA;plt.subplot(2, 2, 4)&#xA;sns.histplot(data[&#39;Target_boxcox&#39;], kde=True)&#xA;plt.title(&#39;Balancing in Box-Cox Scale&#39;)&#xA;&#xA;plt.tight_layout()&#xA;plt.show()بعد از انجام Balancing میتونیم نتیجه رو به شکل زیر ببینیم :بعد از انجام BoxCoxمدیریت داده های نامتوازن در کلسیفیکیشن (Classification) :توی این مقاله به نظرم خیلی عالی تونسته این مبحث رو توضیح بده .برای هندل کردن داده های نامتوازن در کلسیفیکیشن ۳ روش اصلی داریم :روش اول : Over Sampling (نمونه‌برداری از اکثریت ها): تعداد نمونه‌های کلاس اقلیت رو افزایش می‌دیم.یه روش معروف برای این کار SMOTE هست که داده‌های مصنوعی برای کلاس اقلیت تولید می‌کنه.روش دوم : Under Sampling (نمونه‌برداری از اقلیت ها): تعداد نمونه‌های کلاس اکثریت رو کاهش می‌دیم تا تعادل برقرار بشه.روش سوم : Class Weighting (وزن‌دهی به کلاس‌ها): به کلاس اقلیت وزن بیشتری می‌دیم تا مدل بهش توجه بیشتری کنه، بدون اینکه داده‌ها رو تغییر بدیم.تفاوت Over Sampling و Under Samplingچطوری بفهمیم داده های ما برای Classification نامتوازن هستند ؟dataframe[&#39;Target&#39;].value_counts()بریم کد بزنیم (هندل کردن Imbalanced در Classification) :خب اول یک دیتاست آماده میکنیم :import numpy as np&#xA;import pandas as pd&#xA;import matplotlib.pyplot as plt&#xA;import seaborn as sns&#xA;from sklearn.datasets import make_classification&#xA;from sklearn.model_selection import train_test_split&#xA;from sklearn.linear_model import LogisticRegression&#xA;from sklearn.metrics import classification_report, confusion_matrix&#xA;from imblearn.over_sampling import SMOTE&#xA;from imblearn.under_sampling import RandomUnderSampler&#xA;&#xA;np.random.seed(42)&#xA;&#xA;X, y = make_classification(n_classes=2, class_sep=2, weights=[0.9, 0.1],&#xA;        n_informative=2, n_redundant=0, n_samples=1000,&#xA;        n_features=2, n_clusters_per_class=1, random_state=42&#xA;)&#xA;&#xA;data = pd.DataFrame({&#39;Feature1&#39;: X[:, 0], &#39;Feature2&#39;: X[:, 1], &#39;Target&#39;: y})&#xA;data[&#39;Target&#39;].value_counts()نتیجه :نتیجه بررسی ImBalanced895 تا ۰ داریم105 تا ۱ داریم .یعنی رسما داده نامتوازن داریم و تقریبا ۹۰ درصد تفاوت بینشون وجود داره (تصویر اول صفحه) .حالا میریم اوکیشون کنیم :X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)&#xA;&#xA;# Base Model&#xA;model_base = LogisticRegression(random_state=42)&#xA;model_base.fit(X_train, y_train)&#xA;y_pred_base = model_base.predict(X_test)&#xA;print(classification_report(y_test, y_pred_base))&#xA;&#xA;# Over Sampling (SMOTE)&#xA;smote = SMOTE(random_state=42)&#xA;X_train_smote, y_train_smote = smote.fit_resample(X_train, y_train)&#xA;model_smote = LogisticRegression(random_state=42)&#xA;model_smote.fit(X_train_smote, y_train_smote)&#xA;y_pred_smote = model_smote.predict(X_test)&#xA;print(&#34;\nSMOTE (Over Sampling):&#34;)&#xA;print(classification_report(y_test, y_pred_smote))&#xA;&#xA;# Under Sampling&#xA;undersampler = RandomUnderSampler(random_state=42)&#xA;X_train_under, y_train_under = undersampler.fit_resample(X_train, y_train)&#xA;model_under = LogisticRegression(random_state=42)&#xA;model_under.fit(X_train_under, y_train_under)&#xA;y_pred_under = model_under.predict(X_test)&#xA;print(&#34;\nUnder Sampling:&#34;)&#xA;print(classification_report(y_test, y_pred_under))&#xA;# Class Weighting&#xA;model_weighted = LogisticRegression(class_weight=&#39;balanced&#39;, random_state=42)&#xA;model_weighted.fit(X_train, y_train)&#xA;y_pred_weighted = model_weighted.predict(X_test)&#xA;print(&#34;\nClass Weighting:&#34;)&#xA;print(classification_report(y_test, y_pred_weighted))&#xA;plt.figure(figsize=(15, 10))&#xA;plt.subplot(2, 2, 1)&#xA;&#xA;cm_base = confusion_matrix(y_test, y_pred_base)&#xA;sns.heatmap(cm_base, annot=True, fmt=&#39;d&#39;, cmap=&#39;Blues&#39;, cbar=False)&#xA;plt.title(&#39;Confusion Matrix&#39;)&#xA;plt.xlabel(&#39;Predicted&#39;)&#xA;plt.ylabel(&#39;Data&#39;)&#xA;plt.subplot(2, 2, 2)&#xA;&#xA;cm_smote = confusion_matrix(y_test, y_pred_smote)&#xA;sns.heatmap(cm_smote, annot=True, fmt=&#39;d&#39;, cmap=&#39;Blues&#39;, cbar=False)&#xA;plt.title(&#39;Confusion Matrix (SMOTE)&#39;)&#xA;plt.xlabel(&#39;Predicted&#39;)&#xA;plt.ylabel(&#39;Data&#39;)&#xA;plt.subplot(2, 2, 3)&#xA;&#xA;cm_under = confusion_matrix(y_test, y_pred_under)&#xA;sns.heatmap(cm_under, annot=True, fmt=&#39;d&#39;, cmap=&#39;Blues&#39;, cbar=False)plt.title(&#39;Confusion Matrix (Under Sampling)&#39;)&#xA;plt.xlabel(&#39;Predicted&#39;)&#xA;plt.ylabel(&#39;Data&#39;)&#xA;plt.subplot(2, 2, 4)&#xA;cm_weighted = confusion_matrix(y_test, y_pred_weighted)&#xA;&#xA;sns.heatmap(cm_weighted, annot=True, fmt=&#39;d&#39;, cmap=&#39;Blues&#39;, cbar=False)&#xA;plt.title(&#39;Confusion Matrix (Class Weighting)&#39;)&#xA;plt.xlabel(&#39;Predicted&#39;)&#xA;plt.ylabel(&#39;Data&#39;)&#xA;plt.tight_layout()&#xA;plt.show()در نهایت :ما در نتیجه معیار های Precission , Recall , f1-score , support , Confusion matrix رو داریم که در این پست بهشون اشاره شده .Precision (دقت): درصد پیش‌بینی‌های درست برای یک کلاس از کل پیش‌بینی‌هایی که برای اون کلاس انجام شدهRecall (بازخوانی یا Sensitivity): درصد نمونه‌های واقعی یک کلاس که درست پیش‌بینی شدن. یعنی:F1-Score: میانگین هارمونیک Precision و Recall. این معیار وقتی مهمه که بخوای تعادل بین دقت و بازخوانی رو بررسی کنیSupport: تعداد نمونه‌های واقعی هر کلاس در مجموعه تست.نتیجه :نتیحه Classification از مدیریت داده های ناترازهمانطور که میبینید زیاد تفاوت خاصی بین UnderSampling , OverSampling و حالت اولیه نداشت .چرا ؟ چون این یک دیتای تسته و زیاد نتونسته IMBalanced های خوبی رو برامون طراحی کنهبه همین خاطر زیاد تفاوتی نداره .در قسمت های بعدی و پروژه های بعدی با داده های واقعی سر و کار داریم و اونجاست که بیشتر متوجه لزوم مبحث Sampling میشیم .این هم تصویر Confusion Matrix تارگت که در این پست کامل بهش اشاره شده :</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Sun, 25 May 2025 15:44:54 +0330</pubDate></item><item><title>یادگیری ماشین به زبان من ( مرحله ۱۳ - کلاس بندی Classification)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-۱۳-کلاس-بندی-classification-dpcam97ebrcs</link><description>تصویر ۱ : کلاس بندی (Classification)کلاس بندی (Classification) تا قبل از کلاس بندی با مدلی مثل رگرسیون میومدیم حدس میزدیم اگر داده کجای خط باشه تقریبا چه عددی میتونه داشته باشه حالا که کلاس بندی داریم یکم متفاوت تر میشه :) تو Classification، به جای پیش‌بینی یه مقدار پیوسته، داری داده‌ها رو به دسته‌های مجزا (برچسب‌ها) تقسیم می‌کنی. خروجی مدل یه دسته یا کلاسه، نه یه عدد. برگردیم به مثال ایمیل‌ها: تو دیتاست ما، می‌خوایم پیش‌بینی کنیم یه ایمیل &#34;Spam&#34; هست یا &#34;Non-Spam&#34;. این یعنی خروجی فقتصویر ۱ : کلاس بندی (Classification)ط یکی از این دو دسته می‌تونه باشه. مدل (مثل درخت تصمیم) به جای اینکه یه خط بکشه، یه &#34;مرز تصمیم‌گیری&#34; (decision boundary) می‌سازه که داده‌ها رو به دو دسته جدا می‌کنه. یه مثال ساده‌تر: فرض کن می‌خوای تصمیم بگیری یه میوه سیبه یا پرتقاله. ویژگی‌هایی که داری: وزن میوه و رنگش (قرمز یا نارنجی). دیتاستت اینه:سیب: وزن 150 گرم، رنگ قرمزپرتقال: وزن 200 گرم، رنگ نارنجیسیب: وزن 140 گرم، رنگ قرمزپرتقال: وزن 190 گرم، رنگ نارنجی حالا یه میوه جدید داری: وزن 170 گرم، رنگ نارنجی. مدل Classification (مثلاً درخت تصمیم) می‌گه: اگه رنگ نارنجی باشه و وزن بالای 160 گرم باشه، احتمالاً پرتقاله. پس این میوه جدید رو تو دسته &#34;پرتقال&#34; می‌ذاره. خروجی تو Classification پیوسته نیست، گسسته است!مثلاً تارگت ما تو این مسئله، اسپم بودن یا نبودن ایمیل بود (یعنی Label که می‌تونه &#34;Spam&#34; یا &#34;Non-Spam&#34; باشه). تو Classification، تارگت یه دسته‌ی گسسته (discrete) هست، نه یه عدد پیوسته. اینجا می‌تونیم بگیم &#34;Non-Spam&#34; = 0 و &#34;Spam&#34; = 1.چه موقعی باید از رگرسیون و چه موقعی باید از Classification استفاده کنیم ؟طبقه‌بندی (Classification) کاربرد: وقتی می‌خوایم جواب نهایی (همون متغیر هدف) یک مقدار گسسته باشه. &#34;گسسته&#34; یعنی چیزی که می‌شه شمرد یا یه دسته‌بندی مشخص داره، نه یه عدد پیوسته.مثال: فرض کن یه متن به کامپیوتر می‌دی و می‌خوای بفهمی این متن مثبته یا منفی یا خنثی. جواب فقط یکی از این دسته‌هاست. یا مثلاً می‌خوای تشخیص بدی یه عکس، گربه است یا سگ. جواب یک &#34;کلاس&#34; یا &#34;دسته&#34; مشخصه.رگرسیون (Regression) کاربرد: وقتی می‌خوایم جواب نهایی (همون متغیر هدف) یک مقدار پیوسته باشه. &#34;پیوسته&#34; یعنی هر عددی می‌تونه باشه، مثل دما، قیمت یا حقوق.مثال: فرض کن اطلاعاتی مثل مدرک تحصیلی، سابقه کار، محل زندگی و سطح تجربه یک نفر رو به کامپیوتر می‌دی و می‌خوای میزان حقوق اون شخص رو پیش‌بینی کنی. حقوق می‌تونه هر عددی باشه (مثلاً $1500، $2345.75، $50000) و یک عدد پیوسته است. مثال دیگه می‌تونه پیش‌بینی قیمت خانه بر اساس متراژ و تعداد اتاق‌ها باشه.انواع Classification :ما باید بدونیم با توجه به داده ای که داریم باید از چه نوع Classification استفاده کنیم فقط قبلش این ۲ مفهوم رو بدونیم :Class (کلاس): نوع یا دسته کلی. (مثلا سگ)Label (برچسب): اسم یا شناسه اون نوع برای هر تک‌تک داده (مثلا برچسب سگ روی یک سگ در کلاس سگ ها)باینری (Binary Classification)مثال: مثلاً می‌خوایم تشخیص بدیم یک عکس داده شده کامیون هست یا خیر. (یا ایمیل هرزنامه است یا نه.)تعداد کلاس ها در این حالت ۲ تا بیشتر نیست (کلاس هرزنامه بودن و نبودن)مدل ها :Logistic RegressionSupport Vector Machine (SVM)K-Nearest NeighborsDecission Treesچندکلاسی (Multi-Class Classification)مثال: فرض کن یه عکس به مدل می‌دی و مدل به درستی تشخیص می‌ده که اون عکس هواپیماست. (یا مثلاً تشخیص بده این حیوان &#34;گربه&#34; است یا &#34;سگ&#34; یا &#34;پرنده&#34;.)تعداد کلاس ها در این حالت بیشتر از ۲ تا میباشد (سگ,گربه,پرنده)مدل ها :Random ForestNaive BayesK-Nearest NeighborsGradient BoostingSVMLogistic Regressionدر این نوع کلسیفیکیشن برای رسیدن به نتیجه نهایی باید تمام کلاس ها رو تست کنیم مثلا یک تصویر به مدل میدیم و میخوایم بفهمیم این تصویر سیب , پرتقال یا موز میباشد ؟که در نهایت به صورت زیر کار میکنه :عکس رو به طبقه‌بند ۱ (سیب vs پرتقال) می‌دیم:طبقه‌بند می‌گه: &#34;این عکس به احتمال زیاد سیبه.&#34; (۱ رای برای سیب)همون عکس رو به طبقه‌بند ۲ (سیب vs موز) می‌دیم:طبقه‌بند می‌گه: &#34;این عکس به احتمال زیاد سیبه.&#34; (۱ رای برای سیب)باز همون عکس رو به طبقه‌بند ۳ (پرتقال vs موز) می‌دیم:طبقه‌بند می‌گه: &#34;این عکس به احتمال زیاد موزه.&#34; (۱ رای برای موز)حالا رای‌های هر کلاس رو جمع می‌کنیم:سیب: ۲ رایپرتقال: ۰ رایموز: ۱ رایکلاسی که بیشترین رای رو آورده باشه، نتیجه نهایی پیش‌بینی ماست. در این مثال، &#34;سیب&#34; با ۲ رای برنده می‌شه.اسم این تکنیک هست :One-Vs-OneOne-Vs-Restچندبرچسبی (Multi-Label Classification)مثال : در پردازش زبان طبیعی (NLP) و برچسب‌گذاری خودکار: یک متن می‌تونه چندین موضوع (تاپیک) رو پوشش بده.در بینایی کامپیوتر (Computer Vision): یک عکس می‌تونه چندین شیء مختلف داشته باشه. مثلاً مدلی که پیش‌بینی می‌کنه یک عکس شامل &#34;هواپیما، قایق، کامیون و سگ&#34; هست. (در یک عکس می‌تونه هم سگ باشه هم درخت هم ماشین).مدل ها :درختان تصمیم چندبرچسبی (Multi-label Decision Trees)گرادیان بوستینگ چندبرچسبی (Multi-label Gradient Boosting)جنگل‌های تصادفی چندبرچسبی (Multi-label Random Forests)مثال Classification برای تشخیص اسپم بودن ایمیلحالا بیایم یه دیتاست ساده بسازیم و اون رو کلاس‌بندی کنیم:کد بزنیم :حالا میخوایم اون رو کلاس بندی کنیم :import pandas as pd&#xA;from sklearn.model_selection import train_test_split&#xA;from sklearn.tree import DecisionTreeClassifier&#xA;import matplotlib.pyplot as plt&#xA;data = {&#xA;        &#39;Num_Links&#39;: [2, 10, 1, 15, 3, 8, 4, 12],&#xA;        &#39;Word_Count&#39;: [50, 120, 30, 200, 60, 90, 70, 150],&#xA;        &#39;Label&#39;: [0, 1, 0, 1, 0, 1, 0, 1]  # 0 = Non-Spam, 1 = Spam&#xA;}&#xA;&#xA;df = pd.DataFrame(data)&#xA;X = df[[&#39;Num_Links&#39;, &#39;Word_Count&#39;]]&#xA;y = df[&#39;Label&#39;]&#xA;X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)&#xA;model = DecisionTreeClassifier(random_state=42)&#xA;model.fit(X_train, y_train)&#xA;df[&#39;Predicted_Label&#39;] = model.predict(X)&#xA;&#xA;dfدر نهایت همانطور که مشاهده میکنید Predict_Label و Label متناظر همدیگه هستن و یعنی مدل داره به درستی کار میکنه .اما آیا این داده چقدر دقت داره ؟بررسی نتیجه (دقت) Classification :توی بررسی نتیجه Classification دیگه مثل رگرسیون با دقت (Accuracy) سر و کار نداریم .این‌بار خروجی مدل ما دیگه یه عدد نیست. مثلاً مدل می‌گه:این ایمیل اسپمه یا نه؟این عکس سگ داره یا گربه؟این آدم مریضه یا سالم؟برای درک بهتر این قسمت میتونید این مقاله از سایت LabelF هم مطالعه کنید که عالیه :https://www.labelf.ai/blog/what-is-accuracy-precision-recall-and-f1-scoreردیف عمودی شرط اصلی ما بوده که دارای + و - میباشد .ردیف افقی نتیجه Classification ما بودهتمام داده ها بین این ۴ خونه پخش میشوند مثل شکل زیر نتیجه CLassification یک عکس CT_Scanحالا چطوری از این داده ها نتیجه بگیریم ؟ قبلش این متریک ها رو یاد بگیریم :متریک اول : Precissionاز بین همه چیزایی که مدل گفت مریض‌ان، چندتاش واقعاً مریض بودن؟متریک دوم : Recallاز بین همه آدم‌های واقعاً مریض، مدل چندتا رو پیدا کرد؟متریک سوم : F1 Scoreوقتی بخوای Precision و Recall رو با هم در نظر بگیریبریم کد بزنیم :import pandas as pd&#xA;import numpy as np&#xA;from sklearn.model_selection import train_test_split&#xA;from sklearn.ensemble import RandomForestClassifier&#xA;from sklearn.metrics import confusion_matrix, classification_report&#xA;&#xA;np.random.seed(0)&#xA;n = 1000&#xA;data = pd.DataFrame({&#xA;        &#39;num_links&#39;: np.random.poisson(2, n),&#xA;        &#39;has_offer&#39;: np.random.randint(0, 2, n),&#xA;        &#39;has_attachment&#39;: np.random.randint(0, 2, n),&#xA;        &#39;length&#39;: np.random.normal(300, 50, n).astype(int),&#xA;})&#xA;data[&#39;is_spam&#39;] = ((data[&#39;num_links&#39;] &gt; 3) | (data[&#39;has_offer&#39;] == 1)).astype(int)&#xA;X = data.drop(&#39;is_spam&#39;, axis=1)&#xA;y = data[&#39;is_spam&#39;]&#xA;X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)&#xA;model = RandomForestClassifier(random_state=42)&#xA;model.fit(X_train, y_train)&#xA;&#xA;y_pred = model.predict(X_test)&#xA;&#xA;cm = confusion_matrix(y_test, y_pred)&#xA;report = classification_report(y_test, y_pred)&#xA;&#xA;print(&#34;Confusion Matrix:\n&#34;, cm)&#xA;print(&#34;\nClassification Report:\n&#34;, report)نتیجه :حالا تحلیل کنیم :تحلیل Confusion Matrixنتیجه Confusion Matrix (دقیقا مثل تصویر ۵)Confusion Matrixیعنی چه؟مدل تمام ایمیل‌های واقعی Not Spam رو درست تشخیص داده (137 مورد).مدل تمام ایمیل‌های واقعی Spam رو هم درست تشخیص داده (163 مورد).هیچ ایمیلی اشتباه طبقه‌بندی نشده!تحلیل Micro , Macro Averageاین مورد رو در مسئله بعدی به صورت کامل و دقیق بررسی میکنیم چون مربوط میشه به ImBalancedDataاین بود مقاله کلاس بندی (Classification) امیدوارم از این مقاله لذت برده باشید .</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Fri, 23 May 2025 15:26:10 +0330</pubDate></item><item><title>یادگیری ماشین به زبان ساده ( مرحله ۱۲ - پروژه خرید خانه در کالیفرنیا توضیحات کامل مرحله به مرحله )</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-۱۲-پروژه-خرید-خانه-در-کالیفرنیا-توضیحات-کامل-مرحله-به-مرحله-uxhlp9sftyjt</link><description>بسیار عالی . حالا میخوایم از هرچیزی که تا الان یاد گرفتیم استفاده کنیم و یک پروژه بسازیم :اگر تا الان باهامون همراه نبودی پیشنهاد میکنم یک سر به این پست بزن و برگرد .کد کامل ipynb :https://github.com/mahdipakravan-dev/ai-practice/blob/main/califonia-house.ipynbهدفمون چیه ؟قیمت میانه‌ی خانه‌ها در یک ناحیه از کالیفرنیا.این قیمت بر حسب 100,000 دلار داده شده :‌ مثلا مقدار 2.45 یعنی 245,000 دلارتوضیحات دیتاست :ویژگی های دیتاست :MedInc median income in block group (درآمد متوسط خانوارها در آن ناحیه، به هزار دلار)HouseAge median house age in block group (سن متوسط ساختمان‌ها در آن ناحیه (به سال))AveRooms average number of rooms per household (کل تعداد اتاق‌ها در ناحیه تقسیم بر تعداد خانوارها)AveBedrms average number of bedrooms per household (مشابه بالا، ولی فقط اتاق‌خواب‌ها)Population block group population (تعداد کل افرادی که در آن ناحیه زندگی می‌کنند)AveOccup average number of household members (تعداد کل افراد تقسیم بر تعداد خانوارها)Latitude block group latitude موقعیت شمال-جنوب ناحیه (اعداد بزرگ‌تر یعنی شمال‌تر)Longitude block group longitude (موقعیت شرق-غرب ناحیه (اعداد منفی و نزدیک به -118 یعنی غرب‌تر، نزدیک به ساحل))چند تا نکته ریز هم توی توضیحات دیتاست هست که باید بهش توجه کنیم :۱-دیتاست برگرفته از سرشماری سال 1990هر ردیف در دیتاست مربوط به یک گروه بلوکی (Block Group) از داده‌های سرشماریه.یعنی هر ردیف نماینده‌ی یک ناحیه کوچیکه (نه یک خونه خاص).و Block Group معمولاً شامل 600 تا 3000 نفره.۲-منظور از Household چیه؟یک Household یعنی مجموعه‌ای از افراد که با هم در یک خونه زندگی می‌کنن.ستون‌هایی مثل Households, AveRooms, AveBedrooms بر اساس این مفهوم تعریف شدن.۳-نکته درباره میانگین‌ها‌:ستون‌هایی مثل AveRooms یا AveBedrooms نشون‌دهنده میانگین به‌ازای هر Household هستن، نه هر خونه!در جاهایی که تعداد خانوارها کم باشه اما خونه زیاد (مثلاً مناطق تفریحی یا ویلاها)، ممکنه میانگین‌ها عدد بزرگی باشن.شروع میکنیم !دیتاست کجاست ؟ خود scikit-learn که میخوایم ازش برای پیاده سازی مدل هامون استفاده کنیم:https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_california_housing.htmlfrom sklearn.datasets import fetch_california_housing&#xA;from sklearn.linear_model import LinearRegression&#xA;from sklearn.model_selection import train_test_split&#xA;from sklearn.metrics import mean_squared_error, r2_score&#xA;from sklearn.preprocessing import StandardScaler&#xA;import matplotlib.pyplot as plt&#xA;import pandas as pd&#xA;&#xA;california = fetch_california_housing()&#xA;X = california.data&#xA;y = california.target&#xA;&#xA;feature_names = california.feature_namesالان دیتاست ما یک آرایه 20640 ردیف در ۸ ستونه هستش و در قالب پانداز نیست پس با کد زیر تبدیلش میکنیم به دیتاست پانداز :df = pd.DataFrame(california.data, columns=california.feature_names)&#xA;df[&#39;MedHouseVal&#39;] = california.targetحالا میایم مراحل PreProcessing رو روش انجام میدیم که تمام اونها رو در این لینک توضیح دادم :۱-بررسی Missing Value ها :آموزش کامل Missing Values در این لینک موجودهdf.info()بررسی Missing Valuesنتیجه : همونطور که میبینید خوشبختانه ما هیچ دیتای Missing Value توی دیتاستمون نداریم اگر هم داشتیم نگران نبودیم ما راه حل دقیقش رو میدونیم و توی این لینک کامل در موردش توضیح دادیماگر میخواستین خیالتون راحت باشه از کد زیر استفاده کنید که جمع تعداد Missing Value ها رو بهتون میده :df.isnull().sum()۲- بررسی Outlier هاآموزش کامل Outlier ها در این لینک موجوده .همانطور که در پست مربوط به Otlier ها توضیح دادم میتونیم با استفاده از یک کد تمامی Outlier ها رو رسم کنیم :import matplotlib.pyplot as plt &#xA;import seaborn as sns &#xA;import pandas as pd &#xA;&#xA;plt.figure(figsize=(14, 6)) &#xA;sns.boxplot(data=df) &#xA;plt.xticks(rotation=45) &#xA;plt.grid(True) &#xA;plt.tight_layout() &#xA;plt.show()نتیجه :همانطور که میبینید Population به مقدار خیلی زیادی Outlier داره و همچنین یکمی AveOccup .چیکارشون کنیم ؟ ما ۴ تکنیک برای هندل کردن Outlier داریم کدوم برای من مناسب تره ؟آیا میخواهی داده زیادی حذف نشود ؟ بله چون اینکه تعداد مردم یک منطقه چقدره برامون بسیار مهمه .آیا مدلی که میخوای استفاده کنی به Outlier حساسه ؟ بله میخوایم از Linear Regression استفاده کنیم .خب پس با این حساب :بهترین انتخاب برای Population : تکنیک Capping Flooringبهترین انتخاب برای AveOccup : تکنیک IQR یا Cappingبرو بریم !import numpy as np&#xA;&#xA;def remove_outliers_iqr(df, column):&#xA;       Q1 = df[column].quantile(0.25)&#xA;       Q3 = df[column].quantile(0.75)&#xA;       IQR = Q3 - Q1&#xA;       lower = Q1 - 1.5 * IQR&#xA;       upper = Q3 + 1.5 * IQR&#xA;       return df[(df[column] &gt;= lower) &amp; (df[column] &lt;= upper)]&#xA;&#xA;df_clean = df.copy()&#xA;# Handling Population Outliers&#xA;df_clean[&#39;Population&#39;] = np.log1p(df_clean[&#39;Population&#39;])&#xA;# Handling AveOccup Outliers&#xA;df_clean = remove_outliers_iqr(df_clean, &#39;AveOccup&#39;)&#xA;df_cleanچرا اومدیم یک نسخه Copy ساختیم ؟ چون ممکنه در آینده بفهمیم میتونستیم تکنیک بهتری انتخاب کنیم.البته تو دیتا های بزرگ که بعدا باهاشون برخورد میکنیم چون بزرگتر هستن یکم سخت تر میشه :)۳- هندل کردن Categorical Value هاآموزش کامل Categorical Value ها تو این لینک موجوده .همانطور که میبینید ما داده هامون تماما String هستن و نیازی نیست مراحل Encoding روش داشته باشیم اما اگر شما این مشکل رو داشتین حتما این مقاله رو مطالعه کنید تا با موفقیت از پسش بر بیاید .۴-مقیاس بندی ویژگی ها (Feature Scaling)آموزش کامل در این لینک موجود است .با توجه به اینکه میخوایم از Linear Regression در مرحله مدل سازی استفاده کنیم میایم و Standard Scalar رو استفاده میکنیم .قبل اینکه Scale بکنیم یک نکته بسییییییییییار مهم رو داشتیم فراموش میکردیم .ما دو ویژگی داریم به نام Latitude و Longitude .آیا مختصات مکانی باید Scale شود ؟ خیر چون داده ما خراب میشه .پس توی کد میایم و قبل از Scale کردن اون ها (مختصات مکانی) رو جدا میکنیم و بعد از Scale مجددا به دیتاست متصلشون میکنیمnumeric_cols = df_clean.select_dtypes(include=[&#39;int64&#39;, &#39;float64&#39;]).columns&#xA;non_geo_cols = df_clean.drop(columns=[&#39;Latitude&#39;, &#39;Longitude&#39;])&#xA;scaler = StandardScaler()&#xA;&#xA;X_scaled_part = scaler.fit_transform(non_geo_cols)&#xA;X_scaled_array = np.concatenate([X_scaled_part, df_clean[[&#39;Latitude&#39;, &#39;Longitude&#39;]].values], axis=1)&#xA;&#xA;final_columns = list(non_geo_cols.columns) + [&#39;Latitude&#39;, &#39;Longitude&#39;]&#xA;df_scaled = pd.DataFrame(X_scaled_array, columns=final_columns)&#xA;df_scaled۵-مهندسی ویژگی (Feature Engineering)آموزش کامل مهندسی ویژگی در این لینک موجود است .گاهی اوقات می‌تونیم ویژگی‌هامون رو طوری بازطراحی (مهندسی) کنیم که هم برای خودمون قابل درک‌تر بشن، هم برای مدل‌های یادگیری ماشین مؤثرتر.به عنوان مثال، در این دیتاست دو ستون Latitude و Longitude داریم.اما آیا واقعاً برای ما (یا مدل) قابل درکه که مثلاً:«خانه‌ای در مختصات جغرافیایی 34.23 و -118.45 قیمتی معادل 250 هزار دلار دارد»؟مسلماً نه! حتی یک انسان هم نمی‌تونه به راحتی از روی مختصات خام، درک درستی از موقعیت خانه داشته باشه.حالا فرض کنید به جای مختصات، بگیم:«این خانه در منطقه سعادت‌آباد قرار دارد و خانه‌های این منطقه به‌طور متوسط گران‌تر از مناطق پایین‌شهر هستند.»اینجا نه تنها مدل راحت‌تر می‌تونه الگوها رو یاد بگیره، بلکه برای تحلیل ما هم معنادارتر خواهد بود.پس بیایم و مهندسی ویژگی کنیم .def map_location_to_region(lat, lon):&#xA;    if lat &gt; 38:&#xA;        return &#39;North&#39;&#xA;    elif lat &lt; 33:&#xA;        return &#39;South&#39;&#xA;    elif lon &lt; -121:&#xA;        return &#39;West&#39;&#xA;    else:&#xA;        return &#39;Central&#39;&#xA;&#xA;df_scaled[&#39;Region&#39;] = df_scaled.apply(lambda row: map_location_to_region(row[&#39;Latitude&#39;], row[&#39;Longitude&#39;]),&#xA;axis=1)الان به دیتاست زیر میرسیم :خب همونطور که میبینید ما یک ستون جدید اضافه کردیم به نام Region و به صورت String هستش پس میایم Categorical Value رو هندل میکنیم :چون به صورت رده ای نیست (بالا به پایین مهم نیست) میایم از Label Encoding استفاده میکنیم :df_encoded = pd.get_dummies(df_scaled, columns=[&#39;Region&#39;], drop_first=True, dtype=int)&#xA;df_encodedنتیجه نهایی :۶-انتخاب ویژگی (Feature Selection)آموزش کامل مهندسی ویژگی اینجا موجود استمیایم کد زیر رو میزنیم :import seaborn as sns&#xA;import matplotlib.pyplot as plt&#xA;numeric_df = df_encoded.select_dtypes(include=[&#39;int64&#39;, &#39;float64&#39;])&#xA;&#xA;correlation_matrix = numeric_df.corr()&#xA;plt.figure(figsize=(10, 6))&#xA;sns.heatmap(correlation_matrix, annot=True, cmap=&#39;coolwarm&#39;, fmt=&#39;.2f&#39;, linewidths&#xA;=0.5)&#xA;&#xA;plt.title(&#39;Correlation Matrix&#39;)&#xA;plt.show()نتیجه :هدف ما ستون MedHouseVal هستش به این ستون و تاثیر سایر ستون ها روی اون دقت کنید .اما یک نکته حائز اهمیت دیگه ای که داریم شباهت AveRooms و AveBedrms هستشمیتونیم یک فیچر از ترکیبشون تولید کنیم یا یکیشون رو حذف کنیم .چون خانه‌هایی با اتاق‌های بیشتر معمولاً اتاق‌خواب بیشتری هم دارندdf_encoded = df_encoded.drop([&#34;AveBedrms&#34; ] , axis=1)مدل سازی و تست نهایی :حالا وقتشه که کدی که زدیم رو تست بکنیم و ببینیم چقدر تو مدل درست جواب میده .به زبان ساده بیایم ببینیم اگر بخوایم پیش بینی کنیم قیمت خانه در کدام ناحیه چقدره مدل چه جوابی بهمون میده و بعدش ببینیم این مدل چقدر درست کار میکنه .from sklearn.linear_model import LinearRegression&#xA;from sklearn.model_selection import train_test_split&#xA;from sklearn.metrics import mean_squared_error, r2_score&#xA;&#xA;X = df_encoded.drop(columns=[&#39;MedHouseVal&#39;])&#xA;y = df_encoded[&#39;MedHouseVal&#39;]&#xA;&#xA;X_train, X_test, y_train, y_test = train_test_split(&#xA;    X, y, test_size=0.2, random_state=42&#xA;)&#xA;&#xA;model = LinearRegression()&#xA;model.fit(X_train, y_train)&#xA;&#xA;y_train_pred = model.predict(X_train)&#xA;y_test_pred = model.predict(X_test)&#xA;&#xA;mse_train = mean_squared_error(y_train, y_train_pred)&#xA;r2_train = r2_score(y_train, y_train_pred)&#xA;&#xA;mse_test = mean_squared_error(y_test, y_test_pred)&#xA;r2_test = r2_score(y_test, y_test_pred)&#xA;&#xA;print(f&#34;Train Mean Squared Error: {mse_train:.2f}&#34;)&#xA;print(f&#34;Train R^2 Score: {r2_train:.2f}&#34;)&#xA;print(f&#34;Test Mean Squared Error: {mse_test:.2f}&#34;)&#xA;print(f&#34;Test R^2 Score: {r2_test:.2f}&#34;)نتیجه نهایی :این یعنی چی ؟اگر خطای روی داده‌ی آموزش خیلی کم باشه ولی روی داده‌ی تست زیاد، مدل احتمالاً Overfit داره.اگر خطا روی هر دو داده بالا باشه، یعنی مدل نمی‌تونه خوب یاد بگیره، احتمالاً Underfit است.در نتیجه :جواب Train و Test خطا و R² خیلی نزدیک هم هستنیعنی مدل روی داده آموزش و تست تقریباً یک عملکرد مشابه دارهتفسیر:مدل نه Overfit داره (چون خطا روی آموزش خیلی پایین‌تر نیست)نه Underfit خیلی شدید (چون خطا نسبتاً معقوله ولی R² هم زیاد بالا نیست)نتیجه منطقی چی هست؟مدل فعلی داره همون کاری که می‌تونه انجام بده رو انجام می‌ده، به احتمال زیاد با داده‌ها و ویژگی‌های فعلی، این بهترین عملکردشه.بهتره به جای تغییر مدل خیلی ساده (LinearRegression)، مدل‌های قوی‌تر (مثل RandomForest، GradientBoosting، یا حتی مدل‌های غیرخطی) رو امتحان کنیمتو قسمت های بعدی مدل های دیگر رو یاد میگیریم و مجددا دیتاست نهاییمون رو باهاش تست میکنیم .خوشحال میشم نظرتون رو در مورد این قسمت بدونم :)تا مقاله بعدی خدانگهدار</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Fri, 23 May 2025 10:50:09 +0330</pubDate></item><item><title>یادگیری ماشین به زبان ساده ( مرحله 10 - انتخاب ويژگی Feature Selection)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-10-انتخاب-ويژگی-feature-selection-wtd3dzuxwuwv</link><description>فرض کن داری با یک مدل یادگیری ماشین کار می‌کنی که می‌خواد مثلاً بیماری قلبی رو پیش‌بینی کنه.برای این کار، اطلاعات مختلفی از بیماران داری، مثل:سن (Age)فشار خون (Blood Pressure)کلسترول (Cholesterol)ضربان قلب (Heart Rate)گروه خونیقد، وزن، رنگ چشم!و کلی ویژگی دیگه...اما واقعاً آیا همه‌ی این ویژگی‌ها برای پیش‌بینی بیماری مهم هستن؟ نه!پس بیاید ویژگی های بدرد بخور رو انتخاب کنیم Feature Selectionsانتخاب ویژگی هاچرا ؟چون بعضی ویژگی‌ها اطلاعات تکراری یا بی‌ربط دارنبعضی‌ها فقط باعث سردرگمی مدل و افت دقت می‌شنداده‌ی کمتر = مدل سریع‌تر، ساده‌تر و دقیق‌ترتفاوت با Feature Engineering ؟Feature Engineering یعنی ساختن یا اصلاح ویژگی‌ها (مثلاً BMI رو از وزن و قد بسازی)Feature Selection یعنی انتخاب بهترین‌ها و حذف بقیهروش های انجام Feature Selection :1-همبستگی (Correlation):ابتدا میایم HeatMap رو رسم میکنیم و سپس ویژگی‌هایی که بیشترین همبستگی رو با Target دارن، نگه می‌داریم.کد رسم HeatMap :import seaborn as sns&#xA;import matplotlib.pyplot as plt&#xA;&#xA;# انتخاب فقط ستون‌های عددی&#xA;numeric_df = df.select_dtypes(include=[&#34;int64&#34;, &#34;float64&#34;])&#xA;&#xA;# محاسبه همبستگی&#xA;correlation_matrix = numeric_df.corr()&#xA;&#xA;# رسم heatmap&#xA;plt.figure(figsize=(10, 6))&#xA;sns.heatmap(correlation_matrix, annot=True, cmap=&#34;coolwarm&#34;, fmt=&#34;.2f&#34;, linewidths=0.5)&#xA;plt.title(&#34;Correlation Matrix&#34;)&#xA;plt.show()نتیجه :Wheatmeal matrix to solve correlation matrixبه نمودار بالا نگاه کنید .میزان همبستگی داده ها رو با Heart_Disease که تارگتمونه میتونید مشاهده کنیداین اصطلاحات رو یاد بگیرید :اصطلاحات تخصصی Correlationقدم‌های تحلیل دقیق1. تحلیل ویژگی‌ها نسبت به تارگت (Target Correlation)از سطر یا ستون مربوط به Heart_Disease استفاده کن تا بفهمی هر ویژگی چقدر روی تارگت اثر داره.اگر مقدار همبستگی با Heart_Disease بزرگ باشه (مثلاً &gt;0.4 یا &lt;-0.4):این ویژگی احتمالاً اطلاعات مفیدی در مورد پیش‌بینی تارگت داره.✅ نگه‌دار (Strong predictor)اگر مقدار خیلی کم باشه (مثلاً بین -0.1 تا 0.1):نشون می‌ده که ارتباط خطی خاصی با تارگت نداره.🔍 بررسی کن که آیا در مدل‌های پیچیده‌تر مفید هست یا نه.❌ در مراحل اولیه می‌تونه کاندید حذف (Low importance) باشه.📌 این تکنیک اسمش هست: Target-wise Correlation Analysis2. تحلیل همبستگی بین ویژگی‌ها (Multicollinearity Check)اگر دو ویژگی با هم همبستگی بالا (مثلاً &gt;0.85 یا &lt;-0.85) داشته باشن:به احتمال زیاد اطلاعات تکراری دارن و یکی‌شون اضافه‌ست.این مشکل به اسم Multicollinearity شناخته می‌شه.🔁 راهکار: یکی از اون‌ها رو حذف کن (ترجیحاً اونی که با تارگت همبستگی کمتری داره)📌 اسم این تحلیل هست: Redundancy Analysis یا بررسی Multicollinearity2-روش (Wrapper - Recursive Feature Elimination (RFE)):این روش با ترکیب خودش با Logistic Regression (که بعدا در موردش صحبت میکنیم) کار میکنه و برای ما بهترین ویژگی ها رو انتخاب میکنهمراحل انجام RFE:شروع با تمام ویژگی‌ها: ابتدا مدل رو با همه فیچرها آموزش می‌ده.محاسبه اهمیت ویژگی‌ها: بررسی می‌کنه که هر فیچر چقدر در پیش‌بینی تارگت نقش داره.حذف ضعیف‌ترین فیچر: ضعیف‌ترین فیچر رو حذف می‌کنه.تکرار مراحل بالا: این فرآیند رو تکرار می‌کنه تا به تعداد مشخصی از ویژگی‌ها (که ما مشخص می‌کنیم) برسه.مزایای RFE:سفارشی‌پذیر: می‌تونی تعداد ویژگی نهایی رو خودت تعیین کنی (n_features_to_select).قابل ترکیب با مدل‌های مختلف: مثلاً با Logistic Regression برای داده‌های خطی یا با Random Forest برای داده‌های پیچیده‌تر.یادگیرنده‌محور: چون از خود مدل برای تعیین اهمیت ویژگی استفاده می‌کنه، معمولاً دقت خوبی داره.معایب RFE:هزینه محاسباتی زیاد: چون مدل چندین بار آموزش داده می‌شه.ممکنه گیر کنه در local minimum: چون ویژگی‌ها به‌صورت greedy حذف می‌شن.مثال کدی که داریم :from sklearn.feature_selection import RFE&#xA;from sklearn.linear_model import LogisticRegression&#xA;from sklearn.preprocessing import LabelEncoder&#xA;import pandas as pd&#xA;&#xA;categorical_columns = [&#34;Age_Group&#34;, &#34;BP_Category&#34;, &#34;Cholesterol_Level&#34;]&#xA;df_encoded = df.copy()&#xA;for col in categorical_columns:&#xA;        df_encoded[col] = LabelEncoder().fit_transform(df_encoded[&#xA;X = df_encoded.drop(columns=[&#34;PatientID&#34;, &#34;Target&#34;])&#xA;y = df_encoded[&#34;Target&#34;]&#xA;&#xA;model = LogisticRegression()&#xA;rfe = RFE(model, n_features_to_select=4)&#xA;rfe.fit(X, y)&#xA;&#xA;selected_features = X.columns[rfe.support_]که در خروجی به شما یک آرایه میده که بهترین پیشنهادش برای ویژگی ها کدوم ویژگی ها میباشد .[&#39;Blood_Pressure&#39;, &#39;Cholesterol&#39;, &#39;Heart_Rate&#39;, &#39;BP_Category&#39;]یک روش بهتر , Feature Selection Wrapper‌:انتخاب چند زیرمجموعه از ویژگی‌ها → آموزش مدل روی هر زیرمجموعه → ارزیابی عملکرد مدل → انتخاب بهترین زیرمجموعه.۱. Forward Selectionتعریف:شروع با مجموعه خالی از ویژگی‌ها و به تدریج اضافه کردن ویژگی‌هایی که بیشترین بهبود عملکرد مدل را دارند.مزیت: کم‌هزینه‌تر از جستجوی همه زیرمجموعه‌هاکد نمونه:pythonCopyEditfrom sklearn.datasets import load_iris&#xA;from sklearn.linear_model import LogisticRegression&#xA;from sklearn.feature_selection import SequentialFeatureSelector&#xA;&#xA;X, y = load_iris(return_X_y=True)&#xA;model = LogisticRegression(max_iter=200)&#xA;&#xA;sfs = SequentialFeatureSelector(model, n_features_to_select=2, direction=&#39;forward&#39;)&#xA;sfs.fit(X, y)&#xA;&#xA;print(&#34;Selected features indices:&#34;, sfs.get_support(indices=True))۲. Backward Eliminationتعریف:شروع با تمام ویژگی‌ها و حذف تدریجی ویژگی‌هایی که کمترین تاثیر را دارند.مزیت: مناسب وقتی تعداد ویژگی‌ها کم است و می‌خواهیم اطمینان داشته باشیم هیچ ویژگی مهمی حذف نمی‌شودکد نمونه:pythonCopyEditsbs = SequentialFeatureSelector(model, n_features_to_select=2, direction=&#39;backward&#39;)&#xA;sbs.fit(X, y)&#xA;&#xA;print(&#34;Selected features indices:&#34;, sbs.get_support(indices=True))۳. Recursive Feature Elimination (RFE)تعریف:یک مدل آموزش داده می‌شود و ویژگی‌های کم‌اهمیت بر اساس وزن مدل به صورت تکراری حذف می‌شوند تا تعداد مشخصی ویژگی باقی بماند.مزیت: دقت بالا به خاطر ارزیابی دقیق وزن هر ویژگی در مدلکد نمونه:pythonCopyEditfrom sklearn.feature_selection import RFE&#xA;&#xA;rfe = RFE(estimator=model, n_features_to_select=2)&#xA;rfe.fit(X, y)&#xA;&#xA;print(&#34;Selected features indices:&#34;, rfe.get_support(indices=True))</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Wed, 21 May 2025 15:22:55 +0330</pubDate></item><item><title>یادگیری ماشین به زبان من ( مرحله ۹ - Feature Scaling مقیاس‌بندی ویژگی‌ها)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-۹-feature-scaling-مقیاس-بندی-ویژگی-ها-alga0kaxo61z</link><description>تا اینجای کار یاد گرفتیم ویژگی هامون رو مهندسی کنیم و دسته بندی کنیم و ...اما حالا میخوام یک چیزی نشونتون بدم , در نهایت کدی که تو مقاله قبلی زدیم و مهندسی ویژگی انجام دادیم , اما میخوام یک چیزی نشونتون بدم :نمودار توزیع داده ها قبل از مقیاس بندی ویژگی هادقت کنید مثلا رنج اعداد کلسترول بین ۱۶۰ تا ۲۳۰ ولی رنج اعداد Heart_Rate بین ۴۰ تا ۱۰۰ هستش .خب این الان چه مشکلی داره ؟ببینید , مدل هوش مصنوعی اگر داده های یک ویژگی خیلی بزرگ باشن و اون یکی ویژگی خیلی کوچیک باشه , جواب درستی نمیده . یعنی فکر میکنه اون ویژگی که عددش خیلی بزرگتره خیلی هم مهم تره در صورتی که برای ما این نتیجه اصلا مطلوب نیست.مدل هوش مصنوعی ما دوست داره که همه چیز تو یک رنج باشه تا نتیجه بهتری بدهجلوتر که بریم دقیق تر متوجه میشوید که چرا باید Feature Scaling انجام بدیم .مقیاس بندی ویژگی یا Feature Scalingهمانطور که در تصویر بالا مشاهده میکنید توزیع داده ها به شکلی که سمت راست تصویر موجوده برای مدل های ماشین لرنینگ مطلوب تره .پس توی ذهنتون بدونید که شکل توزیع داده ها قبل و بعد از Feature Scaling چقدر متفاوته .برای انجام Feature Scaling تمام مراحل قبلی Data Preprocessingتون رو کامل کرده باشین و ستون های عددیتون رو انتخاب کرده باشین :numeric_cols = df.select_dtypes(include=[&#34;int64&#34;, &#34;float64&#34;]).columnsحالا باید بر اساس الگوریتمی که میخواید ازش استفاده کنید (که در پست های بعدی در موردشون صحبت خواهیم کرد) داده هاتون رو مقایس پذیر کنید .انواع روش های Feature Scaling1-استاندارد سازی (StandardScalar)هر ویژگی رو طوری تغییر می‌ده که میانگینش صفر و انحراف معیارش یک بشه.scaler = StandardScaler()&#xA;scaled_array = scaler.fit_transform(df[numeric_cols])&#xA;scaled_df = pd.DataFrame(scaled_array, columns=numeric_cols)کجا استفاده میشه ؟الگوریتم‌هایی که از فرض نرمال‌بودن داده استفاده می‌کنن مثل:Logistic RegressionLinear RegressionSVMNeural Networks۲-مقیاس بندی به بازه ۰ و ۱ (MinMaxScalar)داده‌ها رو به بازه‌ی دلخواه (پیش‌فرض 0 تا 1) می‌بره.`from sklearn.preprocessing import RobustScaler&#xA;scaler = RobustScaler()&#xA;X_scaled = scaler.fit_transform(X)کی استفاده کنیم؟وقتی داده‌ها پراکندگی خاصی ندارنKNNNeural Networks (در خیلی از موارد)PCA (برای بهتر شدن عملکرد کاهش ابعاد)۳-نرمال سازی سطری (Normalizer)from sklearn.preprocessing import Normalizer&#xA;scaler = Normalizer()&#xA;X_scaled = scaler.fit_transform(X)هر نمونه (ردیف) رو طوری تغییر می‌ده که طولش (norm) برابر با 1 بشهکی استفاده کنیم؟در مسائل بازیابی اطلاعات (IR) یا پردازش متن مثل TF-IDF یا Word Embeddingوقتی بردارها باید نرمال شده باشنخلاصه :از کدوم تکنیک مقیاس بندی ویژگی استفاده کنیماین قسمت هم تموم شد , در قسمت بعدی به آخرین مرحله پیش پردازش داده ها (Data Preprocessing) میرسیم و بعد از اون میریم سراغ مدل های مختلف , Classification , Clustering و سایر ماجرا ...</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Wed, 21 May 2025 14:44:56 +0330</pubDate></item><item><title>یادگیری ماشین به زبان ساده ( مرحله ۸ - مهندسی ويژگی Feature Engineering)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-۸-مهندسی-ويژگی-feature-engineering-doehehq8srs0</link><description>مرحله ۸فیچر یا ویژگی چیست؟ویژگی‌ها همون متغیرها یا ستون‌های داده هستند که به مدل می‌گیم براساس اون‌ها پیش‌بینی یا تصمیم بگیره. مثلاً توی تشخیص بیماری، فیچرها می‌تونن سن، فشار خون، وزن و... باشن.یادگیری ماشین خیلی ساده بهش نگاه کنیم دو بخشه :۱-ویژگی ها (Features)۲-هدف (Target)یک مثال از ویژگی ها و هدفشما تو هر مثال یادگیری ماشین باید بتونید ویژگی ها رو مدیریت کنید و در نهایت به هدفی که میخواید پیش بینی بکنید برسید .هر ستونی که توی اون دیتاست داریم رو ویژگی مینامیم.حالا این ويژگی ها رو قراره مهندسی کنیم . یعنی چی ؟ الان بهتون میگم .اولا که یکسری وقت ها نیازی به مهندسی ويژگی به صورت پیچیده نیست . مثل مثالی که برای درس خوندن زدیم , ما کلا دو تا ویژگی داریم : میزان ساعت درس خوندن و نمره .مثال حل مسئله بدون استفاده از مهندسی ویژگی :تارگت : نمرهویژگی : ۳ ساعت درس خوندنمراحل :1-Data Prepration2-Missing Values3-Categorical Values4-Outliers5-Regressionبعد از رسم رگرسیون هم که خیلی راحت به مدل میرسیم و با مدلی که داریم میتونیم به راحتی پیش بینی کنیم که در ازای فیچر (۳ ساعت درس خوندن) چه تارگتی (نمره ای) میگیریم .تمام مراحلی که در بالا اشاره کردیم رو در مراحل بعدی هم خواهیم داشت فقط خواستم بگم یک وقت هایی که ویژگی ها کم هستن و تارگت با همون تک ویژگی به راحتی هندل میشه میریم سریع سراغ این مراحل و تمام .ولی وقتی مسئله یکم پیچیده تر باشه باید مهندسی ویژگی هم انجام بدیم که کار خیلی سختی نیست و در ادامه باهم یاد میگیریم . پس برو بریم ادامه مطلب ...مهندسی فیچر (Feature Engineering)وقتی داده‌های خام به دست میاد، معمولاً فقط یه سری اعداد و اطلاعات پراکنده و خام هستند. اما مدل‌های یادگیری ماشین برای اینکه بهترین عملکرد رو داشته باشند، نیاز دارند داده‌ها به شکل قابل فهم‌تر، خلاصه‌تر و تاثیرگذارتر برای آنها آماده بشه.مهندسی ویژگی یعنی:انتخاب،ساخت،اصلاح، وتبدیل ویژگی‌های داده،در نتیجه بهترین اطلاعات و مفاهیم ممکن از داده استخراج بشه و مدل بتونه با دقت و سرعت بیشتر یاد بگیره.انواع مهندسی ویژگیانتخاب ویژگی: حذف ویژگی‌های کم‌ارزش یا نویزیساخت ویژگی: ایجاد فیچرهای جدید با ترکیب فیچرهای موجودتبدیل ویژگی: نرمال‌سازی، مقیاس‌بندی، کدگذاری متغیرهای دسته‌ای (مثلاً one-hot encoding)مدیریت مقادیر گمشده: جایگزینی یا حذف داده‌های ناقصحالا میریم سراغ مسائلی که بیشتر از یک ویژگی دارند :این دیتاست رو ببینید :دیتاست پزشکیimport pandas as pd&#xA;data = {     &#xA;    &#39;PatientID&#39;: range(1, 11),     &#xA;    &#39;Age&#39;: [45, 50, 39, 60, 55, 43, 48, 52, 46, 57],     &#xA;    &#39;Blood_Pressure&#39;: [130, 120, 140, 150, 135, 125, 145, 138, 128, 142],     &#xA;    &#39;Cholesterol&#39;: [220, 180, 240, 210, 190, 200, 230, 215, 195, 225],     &#xA;    &#39;Heart_Rate&#39;: [80, 70, 90, 85, 78, 72, 88, 75, 82, 79],     &#xA;    &#39;Smoker&#39;: [1, 0, 1, 0, 1, 0, 1, 0, 1, 0],     &#xA;    &#39;Target&#39;: [1, 0, 1, 1, 0, 0, 1, 1, 0, 1]&#xA; } &#xA;df = pd.DataFrame(data)این دیتاست اطلاعات پزشکی بیماران یک بیمارستان میباشد .ستون Target نشان دهنده اینه که آیا این فرد در ریسک ابتلا به بیماری قلبی هست یا خیر .مهندس ویژگی که پیشنهاد میدم :Age_Group: دسته‌بندی سن به گروه‌های جوان، میانسال و سالمندBP_Category: دسته‌بندی فشار خون (طبیعی، بالا، خیلی بالا)Cholesterol_Level: دسته‌بندی کلسترول (عادی، بالا)Risk_Factor_Score: نمره‌ای ترکیبی از سیگنال‌های خطر مثل سیگار کشیدن، فشار خون بالا و کلسترول بالامهندسی فیچر Age_Groupdef age_group(age):&#xA;    if age &lt; 40:&#xA;        return &#39;Young&#39;&#xA;    elif 40 &lt;= age &lt;= 55:&#xA;        return &#39;Middle_Aged&#39;&#xA;    else:&#xA;        return &#39;Senior&#39;&#xA;&#xA;df[&#39;Age_Group&#39;] = df[&#39;Age&#39;].apply(age_group)مهندسی فیچر BP_Categorydef bp_category(bp):&#xA;    if bp &lt; 130:&#xA;        return &#39;Normal&#39;&#xA;    elif 130 &lt;= bp &lt;= 140:&#xA;        return &#39;High_Normal&#39;&#xA;    else:&#xA;        return &#39;High&#39;&#xA;&#xA;df[&#39;BP_Category&#39;] = df[&#39;Blood_Pressure&#39;].apply(bp_category)مهندسی فیچر Cholesterol_Leveldf[&#39;Cholesterol_Level&#39;] = df[&#39;Cholesterol&#39;].apply(lambda x: &#39;High&#39; if x &gt; 200 else &#39;Normal&#39;)مهندسی فیچر Risk_Factor_Score (مثلا امتیاز از 3)df[&#39;Risk_Factor_Score&#39;] = df[&#39;Smoker&#39;] + (df[&#39;Blood_Pressure&#39;] &gt; 140).astype(int) + (df[&#39;Cholesterol&#39;] &gt; 220).astype(int)در نهایت :بعد از مهندسی ویژگیخب , به انتهای مطلب رسیدیم , در قسمت بعدی آخرین مرحله از Data Preprocessing رو هم انجام میدیم و دیگه وارد بحث Train میشیم .</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Wed, 21 May 2025 14:02:04 +0330</pubDate></item><item><title>یادگیری ماشین به زبان من ( مرحله 7 - گرادیان کاهشی Gradient Decent)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-7-گرادیان-کاهشی-gradient-decent-gff69horeibo</link><description>قسمت 7به این تصویر خوب دقت کنید :تاثیر و ارتباط گرادیان نزولی و رگرسیونببینید گرادیان کاهشی (نزولی) همانطور که در پست قبل خدمتتون گفتم ; یک الگوریتم آموزشی است که به ما کمک میکند به کمینه خطا ها برسیم . خیلی راحت تر بخوام بگم اگر شما الان بالای یک کوه رو تصور کنید و به سمت پایین حرکت کنید تا به زمین برسید ; زمین حکم کمترین خطا رو دارهگرادیان کاهشی Gradient Decentاگه احساس میکنی مطالب داره سخت میشه این ۵ پاراگراف زیر رو بخون یکم انگیزه بگیری اگرم نه بیا ادامه مطلب .ما داریم وارد بخش‌هایی از یادگیری ماشین می‌شیم که ممکنه فرمول‌ها و مفاهیم ریاضی یه‌کم سنگین به‌نظر برسن. شاید به خودتون بگید که «من اصلاً برای این چیزا ساخته نشدم!»خب راستش... منم همین حس رو داشتم.من از همون روز اول برای ریاضیات ساخته نشده بودم! هنوزم نیستم :) نمره‌های ریاضی‌م توی مدرسه همیشه ته جدول بودن. وقتی برای اولین بار با گرادیان نزولی و ماتریس و مشتق و تابع خطا آشنا شدم، ته دلم گفتم «نه دیگه، این یکی مال من نیست».اما یه چیزی رو یاد گرفتم: این مفاهیم با تکرار و تمرین، از اون چیزی که به‌نظر می‌رسن خیلی ساده‌تر می‌شن. مغز ما شاید عاشق ریاضیات نباشه، اما عاشق یاد گرفتنه. کافیه هر روز یه ذره جلو بریم. همین.بد نیست بدونی خیلی از بزرگان حوزه AI هم ریاضی‌دون به دنیا نیومدن.مثلاً Andrew Ng، یکی از معروف‌ترین استادهای یادگیری ماشین، توی مصاحبه‌ای گفته بود که تو دوران دانشگاه، بارها شده بود که مجبور شده از پایه برگرده و مفاهیم ریاضی رو از اول بخونه چون حس می‌کرد نفهمیده.یا Yann LeCun، پدر CNN، توی صحبت‌هاش بارها گفته که با آزمون و خطا یاد گرفته، نه اینکه از اول نابغه ریاضی بوده باشه.اگه الان حس می‌کنی سختته، بدونی که این حس یعنی «داری یاد می‌گیری».و این عالیه. منم کنارت هستم. جلو بریم با هم :)هرجای مقاله هم احساس کردی که متوجه نشدی و نیاز داری به عقب برگردی پایه خودت رو درست کنی میتونی از سیستم های LLM استفاده کنی اونا راهنماییت میکننفرمول گرادیان کاهشی :فرمول گرادیان کاهشیتوضیح :‌توضیح فرمول گرادیان کاهشیاصلا نیازی نیست این فرمول رو حفظ کنید , من فقط این فرمول ها رو خدمتتون توضیح میدم که بدونید چطوری کار میکنه یک درک ذهنی ازش داشته باشید , اگر ریاضیاتتون خیلی عالیه و میخواید با درک این فرمول ها در مراحل بعدی فرمول های جدید درست کنید که کارتون خیلی درسته و پیشنهاد میکنم در مورد Mathematician ها مطالعه کنید .حالا بریم کد بزنیم...این کد رو بنویسید و اجرا کنید :import numpy as np&#xA;import matplotlib.pyplot as plt&#xA;&#xA;X = np.array([1, 2, 3, 4, 5])&#xA;y = np.array([2, 4, 6, 8, 10])&#xA;&#xA;m = 0.5&#xA;b = 1&#xA;y_pred = m * X + b&#xA;&#xA;plt.scatter(X, y, color=&#39;blue&#39;, label=&#39;Real Data&#39;)&#xA;plt.plot(X, y_pred, color=&#39;gray&#39;, label=&#39;Initial Wrong Regression Line&#39;)&#xA;plt.title(&#34;Initial Wrong Line&#34;)&#xA;plt.legend()&#xA;plt.grid(True)&#xA;plt.show()رگرسیون اشتباه ما !حالا در ادامه میایم و گرادیان کاهشی رو پیاده سازی میکنیم :m = 0.5&#xA;b = 1&#xA;learning_rate = 0.01 #پایین تر بهتون میگم این چیه&#xA;epochs = 100&#xA;&#xA;for _ in range(epochs):&#xA;    y_pred = m * X + b&#xA;    error = y - y_pred&#xA;    m_grad = -2 * np.mean(X * error)&#xA;    b_grad = -2 * np.mean(error)&#xA;    m -= learning_rate * m_grad&#xA;    b -= learning_rate * b_grad&#xA;&#xA;final_pred = m * X + b&#xA;&#xA;plt.scatter(X, y, color=&#39;blue&#39;, label=&#39;Real Data&#39;)&#xA;plt.plot(X, final_pred, color=&#39;green&#39;, label=&#39;Improved Line (Gradient Descent)&#39;)&#xA;plt.title(&#34;Line After Gradient Descent&#34;)&#xA;plt.legend()&#xA;plt.grid(True)&#xA;plt.show()بعد از پیاده سازی گرادیان کاهشیدقت کنید تو کد بالا یک متغیر داریم به نام Learning Rate که برای درک بهترش پیشنهاد میکنم این تصویر رو مشاهده کنید :دقت کنید به فلش های به سمت پایین ; اسمش هست Incremental Step این یعنی قدم هایی که بر میداریم برای رسیدن به پایین این کوه چقدر چقدر باشه . که خیلی کمک میکنه چون اگر زیاد باشه و پایین باشه خیلی تفاوت دارن :تاثیر Learning Rate در پیاده سازی گرادیان کاهشیبرای اینکه خیلی بهتر درک کنید Learning Rate رو شدیدا این منبع رو پیشنهاد میکنم :https://alwaysai.co/blog/what-is-gradient-descentاما خیلی ساده بخوایم بگیم بیشترین تاثیر Learning Rate رو سرعت و دقته . که باید بر اساس نوع مسئلمون بهترین عدد رو براش انتخاب کنیم .تاثیر نرخ یادگیری بر روی گرادیان کاهشیاما یک مسئله دیگر و تمام , این که ما به چه صورتی به سمت مقصد حرکت کنیم , یا چقدر حافظه مصرف کنیم و اینکه آیا دقت برامون مهمه یا خیر هم بسیار مسئله مهمیه . برای همین ما چند نوع گرادیان کاهشی داریم !انواع گرادیان کاهشیانواع گرادیان کاهشییا به شکل بصری تر :انواع گرادیان کاهشی1. Batch Gradient Descent (گرادیان‌دسنت دسته‌ای)در این روش در هر تکرار، کل مجموعهٔ آموزش را یک‌جا وارد فرمول هزینه (Cost Function) می‌کنیم، گرادیان را حساب می‌کنیم و سپس پارامترها را به-روز می‌کنیم.مزیت‌: گرادیان دقیق است و مسیر نزول کاملاً یکنواخت پیش می‌رود؛ برای مسائل محدب (Convex) معمولاً به جواب پایدار می‌رسد.عیب‌: روی دیتاست‌های بزرگ به حافظه و زمان زیادی نیاز دارد؛ تا همهٔ داده‌ها پردازش نشوند، هیچ به‌روزرسانی‌ای انجام نمی‌شود، پس هر «ایپوک» طولانی است.2. Stochastic Gradient Descent – SGD (گرادیان‌دسنت تصادفی)در SGD هر بار فقط یک نمونه از داده‌ها انتخاب می‌شود، گرادیان همان نمونه حساب می‌شود و بلافاصله پارامترها تغییر می‌کند.مزیت‌: بسیار سریع و کم‌هزینهٔ حافظه است؛ می‌تواند از مینیمم‌های‌ محلی فرار کند چون به‌دلیل تصادفی‌بودن، مسیرش پرنوسان است.عیب‌: همین نوسان باعث می‌شود مسیر هموار نباشد و نرخ یادگیری باید کوچک باشد تا میانگین حرکت رو به پایین بماند؛ نزدیکی به مینیمم سراسری زمان می‌برد.3. Mini-batch Gradient Descent (گرادیان‌دسنت مینی‌بچ)اینجا دیتاست به زیرمجموعه‌های کوچک (مینی‌بچ‌ها) تقسیم می‌شود (مثلاً ۳۲ یا ۶۴ نمونه). هر مینی‌بچ گرادیان خودش را می‌دهد و پارامترها بعد از هر کدام به‌روز می‌شوند. این روش حدّ واسط Batch و SGD است.مزیت‌:از دید حافظه مثل SGD سبک است، چون فقط یک مینی‌بچ در RAM قرار می‌گیرد.نسبت به SGD نوسان کمتری دارد، چون به‌جای یک نمونه، میانگینی از چند نمونه را می‌بیند.روی GPUها/TPUها عالی مقیاس‌پذیر است (موازی‌سازی).عیب‌: انتخاب اندازهٔ مینی‌بچ حساس است: خیلی بزرگ شود ≈ Batch، خیلی کوچک شود ≈ SGD.خلاصه اینکه از چه نوع گرادیان کاهشی استفاده کنیم :چه نوع گرادیان کاهشی استفاده کنیممنابع :https://alwaysai.co/blog/what-is-gradient-descentاین بود کلیت گرادیان کاهشی , به انتهای این مطلب رسیدیم خوشحال میشم نظرتون رو درمورد این مطلب بدونم و از شما دعوت میکنم قسمت های قبلی و بعدی این سری مقالات رو مشاهده کنید .ممنونم و با تشکر .</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Wed, 21 May 2025 12:10:20 +0330</pubDate></item><item><title>یادگیری ماشین به زبان من ( مرحله 6 - رگرسیون , Regression)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-6-رگرسیون-regression-snpkjbq8zlrw</link><description>مرحله 6رگرسیون (Regression) یعنی پیدا کردن یه رابطه‌ی ریاضی بین چند تا عدد که کمکمون می‌کنه یه چیز ناشناخته رو پیش‌بینی کنیم.فرض کن می‌خوای بدونی قد بچه‌ها بر اساس سن‌شون چطوری تغییر می‌کنه.داده های مارگرسیونکد کامل :import matplotlib.pyplot as plt&#xA;import numpy as np&#xA;from sklearn.linear_model import LinearRegression&#xA;&#xA;X = np.array([[2], [4], [6]])&#xA;y = np.array([85, 100, 115])&#xA;&#xA;model = LinearRegression()&#xA;model.fit(X, y)&#xA;&#xA;x_range = np.linspace(1, 7, 100).reshape(-1, 1)&#xA;y_pred = model.predict(x_range)&#xA;&#xA;plt.figure(figsize=(8, 5))&#xA;plt.scatter(X, y, color=&#39;blue&#39;)&#xA;plt.plot(x_range, y_pred, color=&#39;red&#39;)&#xA;plt.title(&#39;Age vs Height&#39;)&#xA;plt.xlabel(&#39;Age (years)&#39;)&#xA;plt.ylabel(&#39;Hieght (cm)&#39;)&#xA;plt.legend()&#xA;plt.grid(True)&#xA;plt.tight_layout()&#xA;plt.show()حالا این به چه دردی میخوره ؟ الان میتونیم پیش بینی کنیم مثلا:model.predict([[2]]) # 85.0یعنی اگه یه نفر ۲ سالش باشه، مدل پیش‌بینی می‌کنه که قدش حدود ۸۵ هست .و خب... تبریک می‌گم! 🎉شما الان یک مدل ساده‌ی هوش مصنوعی ساختید که می‌تونه پیش‌بینی انجام بده!این رگرسیون یک رگرسیون بسیار ساده بود , همیشه مسائل انقدر ساده نیستن و این نوع رگرسیون حلال همه مشکلات ما نیست , در ادامه به صورت کامل تر در مورد رگرسیون و بهبود رگرسیون صحبت میکنیمچطوری بفهمیم رگرسیونمون داره درست کار میکنه یا خیر ؟سه تا فرمول اصلی وجود داره برای اینکه تست کنیم آیا پیش بینی های رگرسیونمون درسته یا خیر :۱- میانگین خطای قدر مطلق MAE (Mean Absolute Error)۲- میانگین مربعات خطا (MSE (Mean Squared Error۳- ریشه RMSE (Root Mean Squared Error)کدش هم بسیار ساده هستش :from sklearn.metrics import mean_absolute_error, mean_squared_error&#xA;import numpy as np&#xA;y_true = [100, 150, 200, 250]&#xA;y_pred = [110, 140, 195, 260]&#xA;mae = mean_absolute_error(y_true, y_pred)&#xA;mse = mean_squared_error(y_true, y_pred)&#xA;rmse = np.sqrt(mse)&#xA;print(&#34;MAE:&#34;, mae)&#xA;print(&#34;MSE:&#34;, mse)&#xA;print(&#34;RMSE:&#34;, rmse)خروجی کد :MAE: 7.5 (به‌طور میانگین، مدل ۷.۵ واحد خطا داشته)&#xA;MSE: 62.5 (مربع خطاهاست؛ خطاهای بزرگ رو بیشتر جریمه می‌کنه)&#xA;RMSE: 7.905694150420948 (مثل MAE ولی حساس‌تر به خطاهای بزرگ)خب , ببینید تا به اینجای کار ما فهمیدیم که خطای رگرسیونی که کشیدیم چقدرهاما الان میخوایم یک فرمولی یاد بگیریم که به ما بهینه ترین رگرسیون ممکن رو میده , یعنی انقدر تلاش میکنه تا به بهترین رگرسیون ممکن برسونه ما رو !گرادیان نزولی یا Gradient Decentیک الگوریتم آموزش برای پیدا کردن بهترین پارامترها (مثلاً a و b در معادله خط):با استفاده از مشتق متریک خطا (مثل MSE)، مشخص می‌کنه چجوری وزن‌ها رو تغییر بده تا خطا کم بشه.که در پست بعدی کامل در موردش توضیح دادیمواحد های حرفه ای بررسی رگرسیون :ببینید ما الان باید بتونیم تشخیص بدیم دقت مدلمون (رگرسیون) چقدره . یعنی باید خط رگرسیون رو رسم کنیم , یک خط پیش بینی هم رسم کنیم . بعد ببینیم رگرسیونمون به پیش بینی چه نسبتی داره .اگر خط رگرسیون چطوری کشیده شده باشه خوبه یا بده :حالا باید ببینیم ما رگرسیونمون خوبه یا بد :اگر Overfit باشه (حفظ کرده)این یعنی که مدل ما دقیقا مثل کسی هستش که فقط تونسته جزوه رو حفظ بکنه یعنی نیومده درسش رو خونده باشه درک کرده باشه و وقتی ازش سوال بپرسیم بتونه با درک خودش جواب بده . فقط میتونه سوالای تو جزوه رو جواب بدهاگر Underfit باشه (نه حفظ کرده نه یاد گرفته)یعنی نه میتونه بر اساس چیزایی که تو جزوه یاد گرفته جواب بده نه بر اساس منطق خودش از درک درس . و این بدترین نتیجه ممکنه .اگر Optimal باشه ( یعنی هم یاد گرفته و هم حفظ کرده)این حالت چیزی هستش که میخوایم .حالا ما چطوری بفهمیم رگرسیونی که کشیدیم underfit شده یا overfit یا optimal ?مثال با MSE :الان دقت کنید :ما یک مدل Train رو دادیم به سیستم و براش رگرسیون رسم کردیم (جزوه ای که دانش آموز خونده)و داریم با Test مقایسه میکنیم (سوالی که ازش میپرسیم)نتیجه چطور شده :Degree 1 (رگرسیون خطی ساده):Train MSE = 0.485, Test MSE = 0.639خطا روی داده آموزش و تست نسبتاً بالا و نزدیک به هم هست؛ یعنی مدل ساده است و نمی‌تواند الگوهای پیچیده را خوب یاد بگیرد.Degree 3 (رگرسیون چندجمله‌ای درجه ۳):Train MSE = 0.345, Test MSE = 0.529خطاها نسبت به مدل ساده‌تر کمتر شده‌اند و مدل بهتر توانسته پیچیدگی داده را یاد بگیرد؛اما هنوز خطای تست کمی بیشتر از خطای آموزش است که طبیعی است.Degree 10 (رگرسیون چندجمله‌ای درجه ۱۰):Train MSE = 0.067, Test MSE = 0.074خطای آموزش خیلی پایین است (یعنی مدل دقیقاً داده آموزش را یاد گرفته)و خطای تست هم نسبتاً پایین و نزدیک به خطای آموزش است.این یعنی مدل پیچیده است ولی توانسته تعمیم خوبی هم به داده‌های جدید بدهد، پس Overfitting شدید مشاهده نمی‌شود.حالا چرا با MSE نتیجه رو بررسی کردیم ؟ ما که RMSE هم داشتیم .اولا که جدای فرمول هایی که تا الان بهتون گفتم برای بررسی خطای رگرسیون ما ۳ فرمول دیگه هم داریم که ,R-sqared , Adjusted R-Squaredنام دارند و در ادامه در مورد اینکه کدوم یک بهتر هستند برای بررسی نتیجه صحبت خواهیم کرد .ابتدا کد رو ببینید :def print_metrics(y_true, y_pred, n_features, dataset_name):&#xA;        ssres, mse, rmse, r2, adj_r2 = model_metrics(y_true, y_pred, n_features)&#xA;        print(f&#34;{dataset_name}:&#34;)&#xA;        print(f&#34;  SSRes: {ssres:.3f}&#34;)&#xA;        print(f&#34;  MSE: {mse:.3f}&#34;)&#xA;        print(f&#34;  RMSE: {rmse:.3f}&#34;)&#xA;        print(f&#34;  R²: {r2:.3f}&#34;)&#xA;        print(f&#34;  Adjusted R²: {adj_r2:.3f}\n&#34;)&#xA;&#xA;print_metrics(y_train, y_train_pred, n_features=2, dataset_name=&#34;Train&#34;)&#xA;print_metrics(y_test, y_test_pred, n_features=2, dataset_name=&#34;Test&#34;)نتیجه :اگر مدل روی آموزش (Train) : خطاهای خیلی کم و R² خیلی بالا داشته باشهاما روی تست (Test) : خطاها زیاد و R² پایین، یعنی Overfit داریم.اگر هر دو (آموزش و تست) خطاها بالا و R² پایین باشه، یعنی Underfit داریم.هایپرپارامتر های رگرسیونگاهی وقتا توی مدل‌مون کلی ویژگی (feature) داریم، بعضیاشون هم خیلی به درد بخور نیستن. اگه بخوایم با همه‌شون مدل بسازیم، ممکنه مدل‌مون دچار overfitting بشه (یعنی زیادی خودش رو با داده‌های آموزش وفق می‌ده و رو داده‌های جدید عملکردش میاد پایین).اینجاست که Ridge و Lasso میان وسط!هایپرپارامتر Ridge Regression (ریج)تو Ridge، ما یه جور پنالتی (جریمه) می‌ذاریم روی ضرایب بزرگ. یعنی چی؟ یعنی اگه مدل بخواد یه ضریب بزرگ بده به یه ویژگی، بهش می‌گیم: «نه نه نه! یه کم کوتاه بیا!»فرمولش :Loss = MSE + α * (sum of squared coefficients)هایپرپارامتر Lasso Regression (لاسو)همچنین Lasso هم پنالتی می‌ذاره، ولی فرقش اینه که به جای توان دوم ضرایب، خودشون رو مستقیم جمع می‌کنه:Loss = MSE + α * (sum of absolute coefficients)به پایان این مطلب رسیدیم امیدوارم دوست داشته باشید .خوشحال میشم نظراتتون رو بدونم .</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Tue, 20 May 2025 11:24:00 +0330</pubDate></item><item><title>یادگیری ماشین به زبان من ( مرحله ۵ -داده های پرت Outliers)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-۵-داده-های-پرت-outliers-soo0smqddy1c</link><description>قسمت پنجماین تصویر رو ببینید:داده دور افتاده یا Outlierهمچنین کد زیر رو ببینید :[23, 25, 26, 24, 27, 500]وسط ۲۳ و ۲۷ بودیم که یک دفعه سر و کله ۵۰۰ پیدا شد !یا تو تصویری که گذاشتم ببینید همه داده های سبز خیلی خوشگل کنار هم جمع شده بودن که ناگهان ۲ تا داده رفتن اون قسمت .خب مگه مهمه ؟ بزاریم بمونه همونجا کاری باهاش نداریم که :)چرا باید هندلش کنیم ؟ببین اولا که Outlier میتونه خیییییلی خوب باشه چون میتونی باهاش تقلب ها رو کشف کنی , میتونی باهاش بیماری های خاص رو تشخیص بدی و ...اما میتونه افتضاح هم باشه و مدلت رو داغون کنه .مثال :‌نمودار نمره بر اساس ساعت مطالعه :همونطور که میبینید با خط سبزی که کشیده شده (که بعدا در موردش صحبت میکنیم) به راحتی میشه تشخیص داد اگر X ساعت درس خوانده شود Y مقدار نمره میگیریم اما Outlier زده کار رو داغون کرده چون یک دفعه با ۱ ساعت مطالعه طرف نزدیک ۱۰۰ نمره گرفته ! پس باید این رو بتونیم هندل کنیم که مدلمون دچار خطا نشه !چطوری بفهمیم داده ما Outlier دارد یا خیر ؟1. بصری‌سازی با Box Plotنقاطی که خارج از whiskers نمودار هستند، معمولاً Outlier محسوب می‌شن.import seaborn as sns&#xA;import matplotlib.pyplot as plt&#xA;sns.boxplot(y=&#39;StudyHours&#39;, data=df)&#xA;plt.title(&#34;Boxplot of Study Hours&#34;)Box Plot Outlierرسم Outlier تمام ستون ها به صورت یکجا :import matplotlib.pyplot as plt&#xA;import seaborn as sns&#xA;import pandas as pd&#xA;from sklearn.datasets import fetch_california_housing&#xA;&#xA;plt.figure(figsize=(14, 6))&#xA;sns.boxplot(data=df)&#xA;plt.xticks(rotation=45)&#xA;plt.grid(True)&#xA;plt.tight_layout()&#xA;plt.show()2. نمره زی ( Z-Score )هر داده‌ای که بیشتر از ۳ انحراف معیار از میانگین فاصله داشته باشه، معمولاً Outlier در نظر گرفته می‌شه.from scipy import stats&#xA;import numpy as np&#xA;&#xA;z_scores = np.abs(stats.zscore(df[&#39;Score&#39;]))&#xA;outliers = df[z_scores &gt; 3]۳- نمره IQRنمره IQR یعنی اختلاف بین چارک ۳ و ۱Q1 = df[&#39;Score&#39;].quantile(0.25)&#xA;Q3 = df[&#39;Score&#39;].quantile(0.75)&#xA;IQR = Q3 - Q1&#xA;&#xA;outliers = df[(df[&#39;Score&#39;] &lt; Q1 - 1.5 * IQR) | (df[&#39;Score&#39;] &gt; Q3 + 1.5 * IQR)]4- پیاده سازی Isolation Forestبا استفاده از مدل سازی Isolation Forest میتونیم به عدد ۱ یا -۱ برسیم که۱ : عادی-۱ : داده پرت (Outlier) میباشد .from sklearn.ensemble import IsolationForest&#xA;&#xA;iso = IsolationForest(contamination=0.1)&#xA;df[&#39;outlier&#39;] = iso.fit_predict(df[[&#39;Age&#39;, &#39;Score&#39;]])  # خروجی: 1 (عادی) یا -1 (پرت)حالا چیکارشون کنیم ؟۱. حذف Outlierها (Outlier Removal)اگر تعداد Outlier کم باشد و نبودشان تأثیر زیادی روی داده نگذارد، می‌توان آن‌ها را حذف کرد.Q1 = df[&#39;StudyHours&#39;].quantile(0.25)&#xA;Q3 = df[&#39;StudyHours&#39;].quantile(0.75)&#xA;IQR = Q3 - Q1&#xA;&#xA;lower_bound = Q1 - 1.5 * IQR&#xA;upper_bound = Q3 + 1.5 * IQR&#xA;&#xA;df_no_outliers = df[(df[&#39;StudyHours&#39;] &gt;= lower_bound) &amp; (df[&#39;StudyHours&#39;] &lt;= upper_bound)]مزایا:ساده و سریعدر صورت وجود outlierهای واقعی و اشتباهات اندازه‌گیری، مؤثر استبرای مدل‌های حساس مثل Linear Regression مفید استمعایب:حذف داده می‌تواند باعث از دست رفتن اطلاعات مهم شوددر دیتاست‌های کوچک باعث کاهش دقت مدل می‌شودبرای مدل‌هایی که نیاز به تعادل کلاس دارند ممکن است بد باشدمناسب برای مدل های :Linear RegressionKNNSVM۲. جایگزینی با مقدار میانه (Capping)می‌تونی Outlierها رو با نزدیک‌ترین مقدار قابل‌قبول جایگزین کنی (روش Winsorization).df_capped = df.copy()&#xA;df_capped.loc[df_capped[&#39;StudyHours&#39;] &gt; upper_bound, &#39;StudyHours&#39;] = upper_bound&#xA;df_capped.loc[df_capped[&#39;StudyHours&#39;] &lt; lower_bound, &#39;StudyHours&#39;] = lower_boundمزایا:داده حذف نمی‌شودنسبت به حذف مستقیم، اطلاعات بیشتری حفظ می‌شودمعایب:ممکن است داده را مصنوعی و غیرواقعی کنددر صورت زیاد بودن outlierها باعث اختلال در توزیع می‌شودمناسب برای:KNNTree-based modelsLogistic Regression۳. استفاده از اسکیلر مقاوم (Robust Scaler)به‌جای حذف یا جایگزینی، می‌تونی از RobustScaler برای نرمال‌سازی استفاده کنی که نسبت به Outlier حساس نیست.from sklearn.preprocessing import RobustScaler&#xA;&#xA;scaler = RobustScaler()&#xA;df_scaled = df.copy()&#xA;df_scaled[[&#39;StudyHours&#39;, &#39;Score&#39;]] = scaler.fit_transform(df[[&#39;StudyHours&#39;, &#39;Score&#39;]])مزایا:توزیع داده‌ها را نرمال‌تر می‌کندبر عملکرد مدل‌های خطی اثر مثبت داردمعایب:نیاز به نرمال بودن داده دارد (برخی توابع فقط برای داده‌های مثبت کار می‌کنند)ممکن است تفسیر نتایج را سخت کندمناسب برای:Linear ModelsSVMNeural Networks۳. استفاده از لگاریتماگر نمی‌خوای دیتا حذف بشه ولی می‌خوای تأثیر outlierها کمتر شه، می‌تونی از log استفاده کنیimport numpy as np&#xA;&#xA;X_log = X.copy()&#xA;X_log[&#39;Population&#39;] = np.log1p(X_log[&#39;Population&#39;])     # log1p(x) = log(1 + x)&#xA;X_log[&#39;AveOccup&#39;] = np.log1p(X_log[&#39;AveOccup&#39;])برای وقت هایی که نمیخوای دیتا هات پاک بشن عالیه .اگر در نهایت تمایل به استفاده از هیچکدوم از روش ها نداشتیم میتونیم بگذریم و بعدا از مدلی استفاده کنیم که به Outlier حساس نباشه .ممنون که همراهی میکنید , خوشحال میشم نظرتون رو بدونم .</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Mon, 19 May 2025 12:22:59 +0330</pubDate></item><item><title>یادگیری ماشین به زبان من ( مرحله ۴ - Categorical Values)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-۴-categorical-values-hytlk9b3tdvj</link><description>قسمت چهارمداده هایی که با متن دسته بندی شده باشن برای ما غیر قابل قبول هستند , به این تصویر دقت کنید :در سمت چپ یک داده غیر قابل قبول میبینیداین رو یادتون باشه : در ماشین لرنینگ ما نیاز داریم که همه چیز عددی باشه .پس توی این مرحله تنها کاری که میخوایم بکنیم اینه که داده هامون رو از حالت String به Number اما با منطق تبدیل کنیم . حالا چه روش هایی داریم :import pandas as pddf = pd.DataFrame({    &#39;Gender&#39;: [&#39;Male&#39;, &#39;Female&#39;, &#39;Female&#39;, &#39;Male&#39;, &#39;Female&#39;]})1. Label Encodingهر دسته رو به یک عدد تبدیل می‌کنیم.from sklearn.preprocessing import LabelEncoder&#xA;le = LabelEncoder()df[&#39;Gender_encoded&#39;] = le.fit_transform(df[&#39;Gender&#39;])خروجی Label Encoding2. One-Hot Encodingبرای هر دسته، یک ستون جداگانه ایجاد می‌کنیم و فقط یکی از اون‌ها 1 می‌شه، بقیه 0.df = pd.DataFrame({    &#39;Color&#39;: [&#39;Red&#39;, &#39;Blue&#39;, &#39;Green&#39;, &#39;Red&#39;]})df_encoded = pd.get_dummies(df, columns=[&#39;Color&#39;])خروجی one hot encoding3. Ordinal Encodingاگر دسته‌ها ترتیب منطقی دارن (مثل سطح تحصیلات: دیپلم &gt; فوق دیپلم &gt; لیسانس &gt; فوق لیسانس )، می‌تونیم عددگذاری کنیم:df = pd.DataFrame({    &#39;Education&#39;: [&#39;Bachelor&#39;, &#39;PhD&#39;, &#39;High School&#39;, &#39;Master&#39;]})order = {&#39;High School&#39;: 0, &#39;Bachelor&#39;: 1, &#39;Master&#39;: 2, &#39;PhD&#39;: 3}df[&#39;Education_encoded&#39;] = df[&#39;Education&#39;].map(order)خروجی ordinal encodingهمین :) امیدوارم این پست رو دوست داشته باشید و خوشحال میشم نظرتون رو در مورد این پست بدونم</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Mon, 19 May 2025 11:50:49 +0330</pubDate></item><item><title>یادگیری ماشین به زبان من ( مرحله ۳ - دیتا های خالی missing values)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-۳-دیتا-های-خالی-missing-values-ahblvutb64bf</link><description>قسمت سومیک نمونه دیتاست که داده خالی داره نشونتون بدم :import pandas as pd&#xA;import numpy as np&#xA;&#xA;data = {&#xA;&#39;Name&#39;: [&#39;Ali&#39;, &#39;Sara&#39;, &#39;Reza&#39;, &#39;Niloofar&#39;, &#39;Omid&#39;],&#xA;&#39;Age&#39;: [25, 28, np.nan, 22, 30],&#xA;&#39;Score&#39;: [85, np.nan, 78, 90, 88],&#xA;&#39;Gender&#39;: [&#39;M&#39;, &#39;F&#39;, &#39;M&#39;, &#39;F&#39;, np.nan]&#xA;}&#xA;&#xA;df = pd.DataFrame(data)چطوری بفهمیم دیتاستمون داده های NAN داره یا خیر :df.info()یک خروجی میده به این شکل :خروجی کددقت کنید نوشته5 Entries یعنی ما ۵ تا داده ردیف داده داریمحالا نگاه کنیم برای هر ستون نوشته مثلا 4 non-null معنیش میشه اینکه ما ۵ تا داده داریم که ۴ تاش نال نیستن و یکیشون نال هستنیک روش دیگه و باحالتر برای فهمیدن Missing Value ها :import missingno as msno&#xA;%matplotlib inline&#xA;msno.matrix(collisions.sample(250))سفیدی هایی که در تصویر میبینید تعداد مقادیر نال هر ستونند .الان دیتا رو ببینید مقادیری داره که NAN هستند (وجود ندارند) خب حالا باهاشون چیکار کنیم ؟ بیاید بگم بهتون :1-Rows Deletionاگر کیفیت داده‌ها برات مهم‌تر از تعدادشونه یا تعداد داده‌های ناقص کمه، می‌تونی کل سطرهایی که NaN دارن رو حذف کنی.df_drop_rows = df.dropna()2-Column Deletionاگر ستونی مقدارهای زیادی گمشده داره و اطلاعات ارزشمندی منتقل نمی‌کنه، می‌تونی حذفش کنی.df_drop_cols = df.drop(columns=[&#39;Gender&#39;])3-Mean/Median/Mode Imputationاگر نمی‌خوای داده‌ای رو حذف کنی، می‌تونی مقدارهای گمشده عددی رو با میانگین یا میانه پر کنی، و داده‌های متنی (categorical) رو با مد (پُرتکرارترین مقدار).df_mean_imputed = df.copy()&#xA;df_mean_imputed[&#39;Age&#39;].fillna(df[&#39;Age&#39;].mean(), inplace=True)&#xA;df_mean_imputed[&#39;Score&#39;].fillna(df[&#39;Score&#39;].mean(), inplace=True)&#xA;df_mean_imputed[&#39;Gender&#39;].fillna(df[&#39;Gender&#39;].mode()[0], inplace=True)4-Regressionهدف: پر کردن Age گمشده با مدل LinearRegression با توجه به Scorefrom sklearn.linear_model import LinearRegression&#xA;&#xA;# جدا کردن سطرهایی که Age ندارن&#xA;df_reg = df.copy()&#xA;df_known = df_reg[df_reg[&#39;Age&#39;].notna()]&#xA;df_unknown = df_reg[df_reg[&#39;Age&#39;].isna()]&#xA;&#xA;# مدل رگرسیون ساده&#xA;model = LinearRegression()&#xA;model.fit(df_known[[&#39;Score&#39;]], df_known[&#39;Age&#39;])&#xA;&#xA;# پیش‌بینی مقدار گمشده&#xA;predicted_age = model.predict(df_unknown[[&#39;Score&#39;]])&#xA;df_reg.loc[df_reg[&#39;Age&#39;].isna(), &#39;Age&#39;] = predicted_age5-KNN (K-Nearest Neighborhood)هدف: پر کردن مقدار گمشده Score با استفاده از نزدیک‌ترین رکوردهاfrom sklearn.impute import KNNImputer&#xA;&#xA;# انتخاب فقط ستون‌های عددی برای KNN&#xA;df_knn = df[[&#39;Age&#39;, &#39;Score&#39;]].copy()&#xA;&#xA;# اجرای KNN برای پر کردن مقادیر گمشده&#xA;imputer = KNNImputer(n_neighbors=2)&#xA;df_knn_imputed = imputer.fit_transform(df_knn)&#xA;&#xA;# جایگذاری در دیتافریم اصلی&#xA;df_knn_result = df.copy()&#xA;df_knn_result[&#39;Age&#39;] = df_knn_imputed[:, 0]&#xA;df_knn_result[&#39;Score&#39;] = df_knn_imputed[:, 1]امیدوارم از این مطلب هم استفاده کرده باشید و نظرتون رو خوشحال میشم بدونم .</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Mon, 19 May 2025 11:37:08 +0330</pubDate></item><item><title>یادگیری ماشین به زبان من ( مرحله ۲ - پیش پردازش داده Pre Processing)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-۲-پیش-پردازش-داده-pre-processing-gi3xpirfnoxx</link><description>تو پست قبلی گفتم ما مفهومی داریمبه نام دیتاست که داده های قابل پردازش(Train) ما هستن ;ما باید داده هامون رو تا حد ممکن برای یادگیری ماشین آماده و تمیز کنیم .اصلا کار سختی نیست فقط نیازه که این مراحل رو یاد بگیرید و همیشه وقتی دیتاست جدید بهتون میرسه باهاش پیش برید .اسم این مراحل هست Data Preprocessing .Data Preprocessingاصلا نیازی نیست که الان شما با این عکس بالا ارتباطی برقرار کنید :) نگران مفاهمیش نباشید الکی هم جزوه برداری نکنید :)خلاصه که توی این مرحله ما باید اینکار ها رو بکنیم و مقاله تمامی این مراحل موجوده :Data Cleaningحذف مقادیر گمشده (Missing Values)حذف یا اصلاح داده‌های پرت (Outliers)Handling Missing ValuesEncoding Categorical VariablesFeature Engineering &amp;amp;amp; Feature ScalingFeature Selection/ExtractionHandling Imbalanced DataTrain-Test Splitیک کتاب هم میتونم اینجا معرفی کنم که اگه دوست داشیتید یک مکمل کنارتون باشه میتونه گزینه خوبی باشه :Hands On Data Pre-processing in Python by Roy Jafariهمین و تمام , تشریف بیارید مقاله بعدی .</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Mon, 19 May 2025 10:49:37 +0330</pubDate></item><item><title>یادگیری ماشین به زبان من ( مرحله ۱ - درک اولیه و مراحل پیش رو)</title><link>https://virgool.ir/@mahdipakravan.dev/یادگیری-ماشین-به-زبان-ساده-مرحله-۱-درک-اولیه-و-مراحل-پیش-رو-llwekwxbtmco</link><description>سلام و وقت بخیرمن یک دانشجوی هوش مصنوعی هستم که اگر جزوه ننویسم، واقعاً سردرگم می‌شم! به همین خاطر تصمیم گرفتم هر چیزی که در مسیر یادگیری ماشین یاد می‌گیرم، اینجا با شما به اشتراک بگذارم. این سری مطالب نه قرار رسمی باشه، نه سنگین؛ بیشتر شبیه یه دفتر تجربه‌نویسی خودمونه.اگر همیشه دوست داشتی بدونی &#34;یادگیری ماشین دقیقاً چیه و چطور کار می‌کنه؟&#34;، این مجموعه مطالب می‌تونه نقطه شروع خوبی برات باشه.از کجا شروع کنیم؟اول باید یک درک ساده، درست و کلی از مفهوم یادگیری ماشین داشته باشیم. اینکه اصلاً چرا این مبحث مهمه؟ کجا کاربرد داره؟ و چه مراحلی باید طی بشه تا به نتیجه برسیم.فعلاً خیلی خلاصه و مفید نگهش می‌دارم، در ادامه عمیق‌تر می‌شیم.مواد اولیه برای شروع یادگیری ماشین:۱. دیتاست (Dataset)یعنی نمونه‌ای از داده‌هایی که قراره روشون تحلیل انجام بدیم.مثال واقعی:دیتاست تایتانیک – مجموعه‌ای از اطلاعات مسافرهای کشتی تایتانیک.شامل مشخصاتی مثل:جنسیتسنکلاس یا نوع بلیطمحل نشستنو در نهایت اینکه آیا زنده موندن یا نهدیتاست تایتانیک :اطلاعات دقیقی از اینکه هر مسافر دقیقا جنسش چی بوده , کجا نشسته بوده , چند سالش بوده . ...با این دیتا چه کار می‌کنیم؟هدف ما اینه که با استفاده از این دیتاست، یک مدل یادگیری ماشین بسازیم. مدلی که بتونه پیش‌بینی کنه:اگر مشخصات یک مسافر جدید رو بهش بدیم، آیا احتمال زنده موندنش وجود داره یا نه؟برای مثال:ورودی:سن = ۲۰، جنسیت = مرد، کلاس = اقتصادیخروجی مدل:زنده می‌ماند / زنده نمی‌ماندجمع‌بندیاین فقط مقدمه‌ای بود برای شروع؛ ساده، مختصر و بدون پیچیدگی.در قسمت‌های بعدی، مفصل‌تر وارد جزئیات می‌شیم.اگر دوست داشتی، حتماً نظرت رو باهام به اشتراک بذار.سوال، نکته، یا حتی پیشنهاد داری؟ خوشحال می‌شم بخونمش.ادامه‌ی مسیر رو با هم پیش می‌ریم؛ قدم به قدم، قابل فهم و کاربردی.</description><category>Mahdi Pakravan | مهدی پاکروان</category><author>Mahdi Pakravan | مهدی پاکروان</author><pubDate>Mon, 19 May 2025 10:35:39 +0330</pubDate></item></channel></rss>