در این مطلب می خواهیم در مورد چگونگی ایجاد یک مدل ساده رگرسیون لجستیک از روی مجموعه داده Titanic صحبت کنیم. مجموعه داده Titanic شامل داده هایی در مورد مسافرهای کشتی تایتانیک است که در آن حادثه یا کشته شده اند و یا اینکه زنده مانده اند. بنابراین دو کلاس کشته شده و زنده مانده (Survived) وجود دارد. مجموعه داده دارای ستون های دیگری نیز است که در ادامه نشان می دهیم چکونه این مجموعه داده را پاک سازی و پیش پردازش کنیم تا برای استفاده در ایجاد مدل رگرسیون لجستیک به کار ببریم. به طور کلی هدف از این مطلب موارد زیر است:

۱ – انجام پیش پردازش و پاک سازی داده ها به منظور پاک کردن داده های معیوب

۲ – پاک کردن و حذف ستون های غیر مفید برای ایجاد مدل

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

۴ – ایجاد مدل رگرسیون لجستیک از روی مجموعه داده های یادگیری

۵ – ارزیابی مدل از روی مجموعه داده های آزمایش

انجام پیش پردازش و پاک سازی داده ها و حذف ستون های غیر مفید

در شکل زیر بخشی از چندین سطر ابتدایی مجموعه داده Titanic را می بینید که در برخی از سطرها، برخی از فیلدها (ستون ها) بدون مقدار (Not a Number یا NAN) هستند، بنابراین لازم است تا این سطرها حذف شوند. اما پیش از هر چیز باید توسط متد ()read_csv تز کتابخانه Pandas مجموعه داده ها را بخوانیم.

در کدهای زیر ابتدا توسط متد ()read_csv فایل CSV خوانده شده است، بنابراین متغیر titanic_dataset از نوع DataFrame کتابخانه Pandas است. سپس توسط متد ()head تنها ۱۰ سطر نخست از متغیر DataFrame نمایش داده شده اند. همانطور که در شکل می بینید، درون برخی از سطرها مقدار فیلدهای Age و Cabin برابر NAN (یا بدون مقدار) است، پس در پیش پردازش داده ها این سطرها باید حذف شوند. در نهایت در انتهای کد بالا و توسط دستور (len(titanic_dataset.index تعداد سطرهای DataFrame نمایش داده می شود.

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

نمایش یکپارچه داده در پایتون توسط DataFrame

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

گفتیم برخی از ستون ها بی مقدار هستند که قاعدتا باید از درون مجموعه داده حذف شوند زیرا اگر آنها را پاک نکنیم، در زمان ایجاد مدل به مشکل بر خواهیم خورد. خط ۱ از قطعه کد زیر برای ۱۰ سطر ابتدایی DataFrame نشان می دهد که در کدام سطرها، ستون ها بدون مقدار هستند. در جایی که ستون مقدار نداشته باشد (Is Null)، مقدار True نشان داده می شود. خط سوم نیز مجموع فیلدهای خالی (Is Null) را برای هر کدام از سطرها نشان می دهد، بنابراین مطابق شکل زیر برای ستون Age تعداد ۱۷۷ فیلد و برای ستون Cabin تعداد ۶۸۷ فیلد خالی وجود دارد.

حال نوبت به این ست که دو عملیات را بر روی مجموعه داده انجام دهیم، ابتدا ستون Cabin را از مجموعه داده پاک می کنیم، زیرا این ستون دارای تعداد زیادی فیلدهای بی مقدار است و اگر بخواهیم سطرهایی را پاک کنیم که این ستون در آن سطرها بدون مقدار است، بنابراین تعداد زیادی از سطرها از میان می روند و از این رو مجموعه داده کوچکی داریم که نمی تواند برای ایجاد مدل مفید باشد. به عبارت دیگر اگر بخواهیم سطرهایی را حدف کنیم که ستون Cabin آنها بی مقدار است، مجموعه داده کوچک شده و از این رو نمی توانیم مجموعه داده های یادگیری (Training Data) و مجموعه داده های آزمایش (Test Data) مناسب برای ایجاد مدل و سپس ارزیابی آن ایجاد کنیم.

همانطور که در شکل زیر می بینید دیگر ستون Cabin در میان ستون های DataFrame وجود ندارد و همچنین می بینید که دیگر هیج ستون بدون مقدار وجود ندارد. تا به اینجا توانستیم DataFrame و به عبارتی مجموعه داده ها را پالایش کنیم. در واقع این بخشی از گام پیش پردازش است ولی در ادامه توضیح داده ایم در مورد این مطلب و به ویژه در مورد این مجموعه داده باید گام های دیگری را برای پیش پردازش داده ها انجام دهیم.

تبدیل داده های رسته ای به مقدارهای دودویی معادل

اگر به اولین شکل نگاه کنید می بینید که مقدارهای ستون های Sex و Embarked به صورت رشته ای هستند و این باعث بروز خطا در زمان ایجاد مدل می شود. به عبارت دیگر توسط متد ()get_dummies از ماژول Pandas یا دیگر روش هایی که مطلب های زیر گفته ایم و با استفاده از خود ابزارهای کتابخانه Scikit-Learn باید مقدار این ستون ها را به معادل های دودویی خود تبدیل کنیم. در واقع در ستون Sex دو مقدار Female و Male وجود دارد که پس از اجرای اولین خط از کد زیر، مقدارهای صفر و یک به ترتیب معادل Female و Male خواهند بود.

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

در این زمان تقریبا مرحله پیش پردازش داده ها تمام شده است ولی لازم است تا ابتدا توسط متد ()concat از ماژول Pandas سه متغیری که در بالا و توسط متد ()get_dummies را ایجاد کرده ایم را به انتهای ‌DataFrame اضافه کنیم. بنابراین یک لیست از نام متغیرها به متد ()concat فرستاده می شود که نام اولین متغیر آن همان نام متغیر titanic_dataset و سه نام دیگر متغیرهایی است که پیش از این ایجاد کرده بودیم.

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

پس از انجام گام های بالا، مجموعه داده تقریبا آماده شده است ولی همچنان یک کار دیگر در گام پیش پردازش باقی مانده است و آن حذف ستون های تکراری از مجموعه داده است. اگر به شکل بالا نگاه کنید دیگر به ستون های Pclass و Sex و Embarked نیازی نیست زیرا آنها توسط متد ()get_dummies به معادل های باینری تبدیل شده اند، پس لازم است ابتدا توسط اولین خط زیر آنها را حذف کنیم. همچنین ستون های دیگری مانند PassangerId (شناسه مسافر)، Name و Ticket نیز برای ایجاد مدل فایده ای ندارند، پس آنها را نیز حذف می کنیم.

پس از گام بالا، پیش پردازش داده ها پایان می یابد و نوبت به ایجاد داده های یادگیری و آزمایش می رسد. توجه کنید در مجموعه داده Titanic، ستون Survived همان ستون برچسب (متغیر وابسته) است و بقیه ستون ها، ویژگی ها (متغیرهای مستقل) هستند. پس باید ابتدا تمامی ستون ها، به جز ستون Survived را درون متغیر X برزیم تا تنها ویژگی ها را داشته باشیم و سپس تنها ستون Survived را درون متغیر y بریزیم تا برچسب ها را داشته باشیم (رگرسیون لجستیک از دسته الگوریتم های طبقه بندی است، پس جز الگوریتم های یادگیری نظارت شده است).

ایجاد مدل رگرسیون لجستیک توسط کلاس LogisticRegression

در کدهای زیر ابتدا توسط ()train_test_split و توسط متغیرهای X و y که پیش از این ایجاد کرده بودیم، دو مجموعه یادگیری و آزمایش را ایجاد می کنیم. در مطلب ایجاد داده های یادگیری و آزمایش در Scikit-Learn در مورد ایجاد مجموعه داده های یادگیری و آزمایش صحبت کرده ایم. سپس کلاس LogisticRegression را به درون فایل ضمیمه و سپس یک شی از آن ایجاد کرده ایم. در نهایت مدل توسط متد ()fit و با فرستادن متغیرهای X_train و y_train ایجاد می شود.

ارزیابی مدل و پیش بینی خروجی برای وردی های جدید

پس از ایجاد مدل می توانیم توسط محتوای متغیر X_test مدل را ارزیابی کنیم. در شکل زیر می توانید ۶ سطر ابتدایی متغیر X_test را ببینید. سپس این متغیر به متد ()predict فرستاده شده تا به ازای هر خط از متغیر X_test، یک پیش بینی انجام شود. در مجموعه داده های Titanic، دو کلاس صفر و یک وجود دارد بنابراین در شکل زیر و در خروجی متد ()predict هر کدام از عنصرهای صفر یا یک، مربوط به کلاس پیش بینی شده برای هر کدام از عنصرهای درون متغیر X_test هستند.