|
2 weeks ago | |
---|---|---|
.. | ||
solution | 3 weeks ago | |
README.md | 2 weeks ago | |
assignment.md | 3 weeks ago | |
notebook.ipynb | 3 weeks ago |
README.md
مقدمهای بر طبقهبندی
در این چهار درس، شما به یکی از موضوعات اساسی یادگیری ماشین کلاسیک - طبقهبندی - خواهید پرداخت. ما با استفاده از الگوریتمهای مختلف طبقهبندی و یک مجموعه داده درباره غذاهای فوقالعاده آسیایی و هندی کار خواهیم کرد. امیدوارم گرسنه باشید!
در این درسها غذاهای آسیایی را جشن بگیرید! تصویر از Jen Looper
طبقهبندی نوعی یادگیری نظارتشده است که شباهت زیادی به تکنیکهای رگرسیون دارد. اگر یادگیری ماشین به پیشبینی مقادیر یا نامها با استفاده از مجموعه دادهها مربوط باشد، طبقهبندی معمولاً به دو گروه تقسیم میشود: طبقهبندی دودویی و طبقهبندی چندکلاسه.
🎥 روی تصویر بالا کلیک کنید تا ویدئویی از جان گوتاگ از MIT درباره طبقهبندی ببینید.
به یاد داشته باشید:
- رگرسیون خطی به شما کمک کرد تا روابط بین متغیرها را پیشبینی کنید و پیشبینیهای دقیقی درباره اینکه یک نقطه داده جدید در رابطه با آن خط کجا قرار میگیرد انجام دهید. به عنوان مثال، شما میتوانستید پیشبینی کنید قیمت یک کدو تنبل در سپتامبر در مقابل دسامبر چقدر خواهد بود.
- رگرسیون لجستیک به شما کمک کرد تا "دستههای دودویی" را کشف کنید: در این نقطه قیمت، آیا این کدو تنبل نارنجی است یا غیر نارنجی؟
طبقهبندی از الگوریتمهای مختلفی برای تعیین برچسب یا کلاس یک نقطه داده استفاده میکند. بیایید با این دادههای مربوط به غذاها کار کنیم تا ببینیم آیا میتوانیم با مشاهده گروهی از مواد اولیه، منشأ غذایی آن را تعیین کنیم.
پیشآزمون درس
این درس به زبان R نیز موجود است!
مقدمه
طبقهبندی یکی از فعالیتهای اساسی محققان یادگیری ماشین و دانشمندان داده است. از طبقهبندی ساده یک مقدار دودویی ("آیا این ایمیل اسپم است یا نه؟") تا طبقهبندی و تقسیمبندی پیچیده تصاویر با استفاده از بینایی کامپیوتری، همیشه مفید است که بتوان دادهها را به کلاسها تقسیم کرد و از آنها سوال پرسید.
برای بیان این فرآیند به صورت علمیتر، روش طبقهبندی شما یک مدل پیشبینی ایجاد میکند که به شما امکان میدهد رابطه بین متغیرهای ورودی و متغیرهای خروجی را ترسیم کنید.
مشکلات دودویی در مقابل چندکلاسه برای الگوریتمهای طبقهبندی. اینفوگرافیک توسط Jen Looper
قبل از شروع فرآیند پاکسازی دادهها، تجسم آنها و آمادهسازی آنها برای وظایف یادگیری ماشین، بیایید کمی درباره روشهای مختلفی که یادگیری ماشین میتواند برای طبقهبندی دادهها استفاده شود، یاد بگیریم.
طبقهبندی که از آمار مشتق شده است، با استفاده از یادگیری ماشین کلاسیک از ویژگیهایی مانند smoker
، weight
و age
برای تعیین احتمال ابتلا به بیماری X استفاده میکند. به عنوان یک تکنیک یادگیری نظارتشده مشابه تمرینهای رگرسیون که قبلاً انجام دادهاید، دادههای شما برچسبگذاری شدهاند و الگوریتمهای یادگیری ماشین از این برچسبها برای طبقهبندی و پیشبینی کلاسها (یا 'ویژگیها') یک مجموعه داده و اختصاص دادن آنها به یک گروه یا نتیجه استفاده میکنند.
✅ لحظهای وقت بگذارید و یک مجموعه داده درباره غذاها را تصور کنید. یک مدل چندکلاسه چه سوالاتی میتواند پاسخ دهد؟ یک مدل دودویی چه سوالاتی میتواند پاسخ دهد؟ اگر بخواهید تعیین کنید که آیا یک غذای خاص احتمالاً از شنبلیله استفاده میکند یا نه، چه؟ اگر بخواهید ببینید که آیا با داشتن یک کیسه خرید پر از بادیان ستارهای، کنگر فرنگی، گلکلم و ترب کوهی میتوانید یک غذای هندی معمولی درست کنید؟
🎥 روی تصویر بالا کلیک کنید تا ویدئویی ببینید. کل ایده برنامه 'Chopped' این است که سرآشپزها باید با انتخاب تصادفی مواد اولیه یک غذا درست کنند. مطمئناً یک مدل یادگیری ماشین میتوانست کمک کند!
سلام به 'طبقهبند'
سوالی که میخواهیم از این مجموعه داده غذایی بپرسیم در واقع یک سوال چندکلاسه است، زیرا چندین غذای ملی بالقوه برای کار داریم. با توجه به یک دسته مواد اولیه، کدام یک از این کلاسهای متعدد با دادهها مطابقت خواهد داشت؟
Scikit-learn چندین الگوریتم مختلف برای طبقهبندی دادهها ارائه میدهد، بسته به نوع مشکلی که میخواهید حل کنید. در دو درس بعدی، درباره چندین الگوریتم از این نوع یاد خواهید گرفت.
تمرین - پاکسازی و متعادلسازی دادهها
اولین وظیفهای که باید انجام دهید، قبل از شروع این پروژه، پاکسازی و متعادلسازی دادهها برای دستیابی به نتایج بهتر است. با فایل خالی notebook.ipynb در ریشه این پوشه شروع کنید.
اولین چیزی که باید نصب کنید imblearn است. این یک بسته Scikit-learn است که به شما امکان میدهد دادهها را بهتر متعادل کنید (در مورد این وظیفه در یک دقیقه بیشتر یاد خواهید گرفت).
-
برای نصب
imblearn
، دستورpip install
را اجرا کنید، به این صورت:pip install imblearn
-
بستههایی را که برای وارد کردن دادهها و تجسم آنها نیاز دارید وارد کنید، همچنین
SMOTE
را ازimblearn
وارد کنید.import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np from imblearn.over_sampling import SMOTE
اکنون آماده هستید تا دادهها را وارد کنید.
-
وظیفه بعدی وارد کردن دادهها است:
df = pd.read_csv('../data/cuisines.csv')
استفاده از
read_csv()
محتوای فایل csv cusines.csv را میخواند و آن را در متغیرdf
قرار میدهد. -
شکل دادهها را بررسی کنید:
df.head()
پنج ردیف اول به این صورت هستند:
| | Unnamed: 0 | cuisine | almond | angelica | anise | anise_seed | apple | apple_brandy | apricot | armagnac | ... | whiskey | white_bread | white_wine | whole_grain_wheat_flour | wine | wood | yam | yeast | yogurt | zucchini | | --- | ---------- | ------- | ------ | -------- | ----- | ---------- | ----- | ------------ | ------- | -------- | --- | ------- | ----------- | ---------- | ----------------------- | ---- | ---- | --- | ----- | ------ | -------- | | 0 | 65 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 1 | 66 | indian | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 2 | 67 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 3 | 68 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | 4 | 69 | indian | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
-
اطلاعاتی درباره این دادهها با فراخوانی
info()
دریافت کنید:df.info()
خروجی شما شبیه به این است:
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2448 entries, 0 to 2447 Columns: 385 entries, Unnamed: 0 to zucchini dtypes: int64(384), object(1) memory usage: 7.2+ MB
تمرین - یادگیری درباره غذاها
اکنون کار شروع به جالبتر شدن میکند. بیایید توزیع دادهها را بر اساس غذا کشف کنیم.
-
دادهها را به صورت نمودار میلهای با فراخوانی
barh()
ترسیم کنید:df.cuisine.value_counts().plot.barh()
تعداد محدودی غذا وجود دارد، اما توزیع دادهها نابرابر است. شما میتوانید این مشکل را حل کنید! قبل از انجام این کار، کمی بیشتر کاوش کنید.
-
ببینید چقدر داده برای هر غذا موجود است و آن را چاپ کنید:
thai_df = df[(df.cuisine == "thai")] japanese_df = df[(df.cuisine == "japanese")] chinese_df = df[(df.cuisine == "chinese")] indian_df = df[(df.cuisine == "indian")] korean_df = df[(df.cuisine == "korean")] print(f'thai df: {thai_df.shape}') print(f'japanese df: {japanese_df.shape}') print(f'chinese df: {chinese_df.shape}') print(f'indian df: {indian_df.shape}') print(f'korean df: {korean_df.shape}')
خروجی به این صورت است:
thai df: (289, 385) japanese df: (320, 385) chinese df: (442, 385) indian df: (598, 385) korean df: (799, 385)
کشف مواد اولیه
اکنون میتوانید عمیقتر به دادهها بپردازید و یاد بگیرید که مواد اولیه معمولی برای هر غذا چیست. شما باید دادههای تکراری را که باعث ایجاد سردرگمی بین غذاها میشود پاک کنید، بنابراین بیایید درباره این مشکل یاد بگیریم.
-
یک تابع
create_ingredient()
در پایتون ایجاد کنید تا یک دیتافریم مواد اولیه بسازد. این تابع با حذف یک ستون غیرمفید شروع میشود و مواد اولیه را بر اساس تعداد مرتب میکند:def create_ingredient_df(df): ingredient_df = df.T.drop(['cuisine','Unnamed: 0']).sum(axis=1).to_frame('value') ingredient_df = ingredient_df[(ingredient_df.T != 0).any()] ingredient_df = ingredient_df.sort_values(by='value', ascending=False, inplace=False) return ingredient_df
اکنون میتوانید از این تابع برای به دست آوردن ایدهای از ده ماده اولیه محبوبترین برای هر غذا استفاده کنید.
-
create_ingredient()
را فراخوانی کنید و آن را با فراخوانیbarh()
ترسیم کنید:thai_ingredient_df = create_ingredient_df(thai_df) thai_ingredient_df.head(10).plot.barh()
-
همین کار را برای دادههای ژاپنی انجام دهید:
japanese_ingredient_df = create_ingredient_df(japanese_df) japanese_ingredient_df.head(10).plot.barh()
-
اکنون برای مواد اولیه چینی:
chinese_ingredient_df = create_ingredient_df(chinese_df) chinese_ingredient_df.head(10).plot.barh()
-
مواد اولیه هندی را ترسیم کنید:
indian_ingredient_df = create_ingredient_df(indian_df) indian_ingredient_df.head(10).plot.barh()
-
در نهایت، مواد اولیه کرهای را ترسیم کنید:
korean_ingredient_df = create_ingredient_df(korean_df) korean_ingredient_df.head(10).plot.barh()
-
اکنون، مواد اولیه رایج که باعث ایجاد سردرگمی بین غذاهای مختلف میشوند را با فراخوانی
drop()
حذف کنید:همه عاشق برنج، سیر و زنجبیل هستند!
feature_df= df.drop(['cuisine','Unnamed: 0','rice','garlic','ginger'], axis=1) labels_df = df.cuisine #.unique() feature_df.head()
متعادلسازی مجموعه داده
اکنون که دادهها را پاک کردهاید، از SMOTE - "تکنیک نمونهبرداری بیش از حد مصنوعی اقلیت" - برای متعادلسازی آن استفاده کنید.
-
fit_resample()
را فراخوانی کنید، این استراتژی نمونههای جدیدی را با استفاده از درونیابی تولید میکند.oversample = SMOTE() transformed_feature_df, transformed_label_df = oversample.fit_resample(feature_df, labels_df)
با متعادلسازی دادهها، نتایج بهتری هنگام طبقهبندی آنها خواهید داشت. به یک طبقهبندی دودویی فکر کنید. اگر بیشتر دادههای شما متعلق به یک کلاس باشد، یک مدل یادگیری ماشین آن کلاس را بیشتر پیشبینی میکند، فقط به این دلیل که دادههای بیشتری برای آن وجود دارد. متعادلسازی دادهها هرگونه عدم تعادل را حذف میکند.
-
اکنون میتوانید تعداد برچسبها برای هر ماده اولیه را بررسی کنید:
print(f'new label count: {transformed_label_df.value_counts()}') print(f'old label count: {df.cuisine.value_counts()}')
خروجی شما شبیه به این است:
new label count: korean 799 chinese 799 indian 799 japanese 799 thai 799 Name: cuisine, dtype: int64 old label count: korean 799 indian 598 chinese 442 japanese 320 thai 289 Name: cuisine, dtype: int64
دادهها تمیز، متعادل و بسیار خوشمزه هستند!
-
آخرین مرحله ذخیره دادههای متعادلشده، شامل برچسبها و ویژگیها، در یک دیتافریم جدید است که میتوان آن را به یک فایل صادر کرد:
transformed_df = pd.concat([transformed_label_df,transformed_feature_df],axis=1, join='outer')
-
میتوانید یک بار دیگر دادهها را با استفاده از
transformed_df.head()
وtransformed_df.info()
بررسی کنید. یک نسخه از این دادهها را برای استفاده در درسهای آینده ذخیره کنید:transformed_df.head() transformed_df.info() transformed_df.to_csv("../data/cleaned_cuisines.csv")
این فایل CSV تازه اکنون در پوشه دادههای ریشه موجود است.
🚀چالش
این برنامه درسی شامل چندین مجموعه داده جالب است. پوشههای data
را بررسی کنید و ببینید آیا مجموعه دادههایی وجود دارند که برای طبقهبندی دودویی یا چندکلاسه مناسب باشند؟ چه سوالاتی میتوانید از این مجموعه داده بپرسید؟
آزمون پس از درس
مرور و مطالعه شخصی
API مربوط به SMOTE را بررسی کنید. این ابزار برای چه مواردی بهترین استفاده را دارد؟ چه مشکلاتی را حل میکند؟
تکلیف
روشهای طبقهبندی را بررسی کنید
سلب مسئولیت:
این سند با استفاده از سرویس ترجمه هوش مصنوعی Co-op Translator ترجمه شده است. در حالی که ما تلاش میکنیم دقت را حفظ کنیم، لطفاً توجه داشته باشید که ترجمههای خودکار ممکن است شامل خطاها یا نادرستیها باشند. سند اصلی به زبان اصلی آن باید به عنوان منبع معتبر در نظر گرفته شود. برای اطلاعات حساس، توصیه میشود از ترجمه حرفهای انسانی استفاده کنید. ما مسئولیتی در قبال سوء تفاهمها یا تفسیرهای نادرست ناشی از استفاده از این ترجمه نداریم.