شناسایی عدد با رگرسیون لجستیک – Scikit-Learn

در مطلب های پیشین در مورد الگوریتم های طبقه بندی (Classification) و به ویژه الگوریتم رگرسیون لجستیک (Logistic Regression) صحبت کرده ایم. گفتیم که رگرسیون لجستیک را می توان برای طبقه بندی دودویی (Binary Classification) و همچنین برای طبقه بندی چند کلاسی (Multiclass Classification) استفاده کنیم. همچنین مثالی از طبقه بندی دودویی توسط مجموعه داده Titanic را برای پیش بینی زنده ماندن یا کشته شدن مسافرها آموزش دادیم. در واقع توسط متد ()fit از کلاس LogisticRegression مدلی را ایجاد کردیم که از آن و توسط متد ()predict می خواهیم بداینم یک مسافر بر اساس ویژگی هایش آیا شانس (احتمال) زنده ماندن دارد (Yes یا Positive) یا نه (No یا Negative)

حال در این مطلب می خواهیم مثال دیگری از مدل های طبقه بندی (Classification Model) را آموزش دهیم که برای شناسایی عددها دست نویس (Handwriten Digit Recognition) استفاده می شود. در واقع در این مسئله رگرسیون لجستیک دیگر به صورت دودویی نیست بلکه در آن ۱۰ کلاس (عددهای صفر تا ۹) وجود دارند.

شناسایی دست خط (Handwriting Recognition یا HWR)، توانایی یک رایانه برای دریافت و تفسیر ورودی دستی نوشته شده (Handwritten) از منابع متفاوتی مانند اسناد کاغذی (Documents)، عکس ها، صفحه نمایش لمسی و سایر دستگاه ها است. اما ماشین (دستگاه همراه، لپ تاپ یا هر ابزار دیگری) چگونه می تواند به طور مثال عددهای دستی نوشته شده را پیدا کند؟ پاسخ به این پرسش، در دست داشتن مجموعه داده هایی است که شامل نمونه های متفاوتی از عددهای صفر تا ۹ است که با دست نوشته شداند.

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

نکنه کلیدی در این مورد این است که چون رگرسیون لجستیک از الگوریتم های یادگیری نظارت شده (Supervised Learning) است، پس مجموعه داده های آن نیز دارای برچسب ها (پاسخ ها – متغیرهای وابسته) هستند. به عبارت دیگر در مجموعه داده در کنار مقدار پیکسل های تصویر عدد، عدد مربوط به آن نیز به عنوان برچسب (Label) نوشته شده است. در شکل زیر یک نمونه ساده از چندین سطر یک فایل CSV نشان داده شده است که هر سطر آن یک ماتریس تصویر هر کدام از عددهای صفر تا ۹ است و ستون Label نیز برچسب آن ماتریس، یعنی عدد مربوط به ماتریس تصویر را نشان می دهد. در واقع برچسب در مجموعه داده های برچسب دار (Labled Data) و در مسئله های طبقه بندی، کلاس مربوط به هر کدام از نمونه ها (سطرها) را نشان می دهد.

مجموعه داده digits در Scikit-Learn

در کتابخانه Scikit-Learn مجموعه داده ای (Dataset) به نام digits وجود دارد که شامل ۱۷۹۷ نمونه از ماتریس تصاویر عددهای دست نویس شده است. تصویرها به صورت 8x8 هستند، بنابراین ماتریس هر کدام از تصویرها دارای ۶۴ عدد است که هر عدد نشان دهنده مقدار یک پیسکل از تصویر است، بنابراین هر تصویر دارای ۶۴ پیکسل است، به عبارت دیگر هر نمونه از ۱۷۹۷ تصویر، دارای ۶۴ ویژگی است. مقدار درایه های (پیکسل های) ماتریس های تصویر درون مجموعه داده ها دارای مقدار های عدد صحیح صفر تا ۱۶ است.

بارگذاری داده ها در کتابخانه Scikit-Learn

بارگذاری فایل های CSV توسط ماژول Pandas

بارگذاری فایل های اکسل توسط ماژول Pandas

در کدهای زیر در آغاز مجموعه داده digits بوسیله متد ()load_digits بارگذاری شده است و سپس بعدهای آن توسط دستورهای digits.data.shape و digits.target.shape نشان داده شده اند. سپس توسط کتابخانه matplotlib چندین نممونه از مجموعه داده ها و توسط متد ()imshow (یا Image Show) نشان داده شده اند. در واقع متد ()imshow ماتریس ورودی را به تصویر دودویی تبدیل می کند.

ایجاد داده های یادگیری و آزمایش

برای ایجاد مدل، لازم است تا بوسیله ()train_test_split دو مجموعه داده یادگیری (Training Data) و داده های آزمایش (Test Data) را ایجاد کنیم. در کدهای زیر دستور digits.data به ویژگی های مجموعه داده یا همان پیکسل های ماتریس های تصویر و دستور digits.target به برچسب های درون مجموعه داده اشاره دارند. در کدهای زیر ۲۵٪ از کل داده ها برای داده های آزمایش و ۷۵٪ دیگر برای داده های یادگیری به کار گرفته می شوند.

ایجاد مدل رگرسیون لجستیک و پیش بینی

پس از ایجاد داده های یادگیری و آزمایش باید توسط کلاس LogisticRegression و متد ()fit از آن، مدلی را برای انجام پیش بینی و طبقه بندی کلاس ماتریس تصویر ورودی ایجاد کنیم. همانطور که در کدهای زیر می بینید، دو متغیر X_train و y_train به متد ()fit فرستاده شده اند. در خط ۸ و درون متد ()predict از کد زیر و بوسیله متد ()reshape از آرایه های NumPy متغیر [X_train[0 را از یک آرایه تک بعدی به یک آرایه دو بعدی (لیستی از لیست ها یا آرایه ای از آرایه ها) تبدیل کرده ایم، زیرا در مطلب های پیشین هم گفتیم که اگر بخواهیم آرایه NumPy را به متد ()fit بفرستیم، باید آنرا به صورت دو بعدی بفرستیم. در خط های ۱۰ و ۱۲ نیز به ترتیب ۱۰ عنصر و کل آرایه X_train را فرستاده ایم.

متدهای ()fit و ()predict در کلاس های کتابخانه NumPy می توانند آرایه های دو بعدی NumPy و یا DataFrame های Pandas را دریافت کنند.

ایجاد آرایه ها بوسیله ماژول NumPy

تغییر بعدهای آرایه NumPy

ایجاد DataFrame توسط ماژول Pandas در پایتون