//
Card image cap

مسیر یادگیری علم داده به زبان ساده با پایتون

چند سال پیش، با ظهور علم داده، جامعه به سمت تجزیه و تحلیل داده‌ها کشیده شد. تحلیل داده و داده‌کاوی به سرعت از جنبه‌های تحقیقاتی به گرایش‌های محبوب تبدیل شدند و به زودی کسب‌وکارها نیز به دلیل مزایای فراوان این زمینه‌ها به آن‌ها توجه کردند.

اگرچه داده‌کاوی از سال‌های زیادی قبل مورد توجه بوده، اما با افزایش توجه به آن، بحرانی در مورد تفاوت‌ها و شباهت‌های علم داده، داده‌کاوی، تحلیل داده و یادگیری ماشین به وجود آمد. امروزه، علاقه به علم داده و داده‌کاوی در حال افزایش است و همچنین توسعه هوش مصنوعی و یادگیری ماشین تحولات اساسی در علم و صنعت ایجاد کرده‌اند.

با این حال، این تحولات باعث ایجاد ابهاماتی در آینده شده‌اند و نیاز به درک دقیق تفاوت‌ها و همبستگی‌های این حوزه‌ها وجود دارد. این رشد فراگیر، آینده این علوم را در دامنه‌ای از ناپایداری قرار داده و پیش‌بینی آینده این حوزه‌ها به یک مسئله چالش‌برانگیز تبدیل شده است.

شاید به زودی عوامل هوشمند، که با استفاده از هوش مصنوعی به نحوی مشابه انسان عمل می‌کنند، توانایی تصمیم‌گیری موثرتر از انسان‌ها را به دلیل تحلیل داده، یادگیری ماشین، و داده‌کاوی، به دست آورده و حاکمیت جهان انسانی را به دست خواهند گرفت!

برای پیاده‌سازی و استفاده از مفاهیم هوش مصنوعی و علم داده، نیاز به ابزارهای مناسبی وجود دارد. در این زمینه، نرم‌افزارهای متعددی معرفی شده‌اند. زبان‌های برنامه‌نویسی محاسباتی مانند R و زبان‌های اسکریپت‌نویسی مثل پایتون، به دلیل ویژگی‌های متعدد، جایگاه خوبی در میان پژوهشگران و علاقمندان به این حوزه پیدا کرده‌اند. با ظهور مفهوم کلان‌داده، ابزارهایی مانند هادوپ، اسپارک، و استورم با قابلیت‌های پردازشی جدید معرفی شدند.

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

در این راهنما، یک برنامه جامع برای یادگیری علم داده با پایتون ارائه شده است، تا افراد به سرعت پایتون را فرا بگیرند و چگونگی استفاده از آن برای علم داده را به طور کاربردی یاد بگیرند.

سرفصل‌های مهم:

  1. مبانی پایتون برای تحلیل داده:

    • چرا بسیاری از افراد برای تحلیل داده پایتون را می‌آموزند؟
      • پایتون به عنوان زبان مناسبی برای تحلیل داده به خود جلب توجه کرده است.
      • مزایایی از جمله متن‌باز بودن، جامعه فعال آنلاین، یادگیری آسان، و قابلیت استفاده برای تحلیل داده و تولید محصولات تحلیلی مبتنی بر وب.
  2. نسخه‌های پایتون:

    • پایتون نسخه ۲.۷ در مقایسه با پایتون ۳.۴.
    • توصیه به فراگیران برای انتخاب نسخه‌ای که به نیازهای کاربری مناسب باشد.

این راهنما به افراد کمک می‌کند تا به سرعت پایتون را یاد بگیرند و از آن برای علم داده بهره‌مند شوند. سعی شده است تا اطلاعات به گونه‌ای ارائه شوند که به شکل کاربردی و قابل درک باشند.

 

چرا پایتون ۲.۷؟
جامعه پشتیبانی فوق‌العاده‌ای دارد. این یکی از چیزهایی است که کاربران در روزهای آغاز کار خود با یک زبان جدید به شدت به آن نیاز پیدا می‌کنند. پایتون ۲ در اواخر سال ۲۰۰۰ میلادی منتشر شد و برای بیش از ۱۵ سال مورد استفاده قرار گرفته است.
میزان بسیار زیادی از کتابخانه‌های شخص ثالث برای این نسخه از پایتون موجود هستند. گرچه کتابخانه‌های زیادی نیز از پایتون نسخه‌های ۳ پشتیبانی می‌کنند اما همچنان تعداد زیادی از ماژول‌ها تنها در نسخه‌های ۲ کار می‌کنند. افرادی که قصد دارند از پایتون برای کاربردهای نرم‌افزاری مانند توسعه وب با وابستگی بالا به ماژول‌های خارجی استفاده کنند، شاید بهتر باشد با پایتون ۲.۷ کار کنند.
برخی از ویژگی‌های نسخه‌های ۳ دارای «سازگاری عقب‌رو» (backward compatibility) هستند و می‌توانند با نسخه ۲.۷ کار کنند.
چرا پایتون ۳.۴؟
این نسخه از پایتون سریع‌تر و شفاف‌تر است. توسعه‌دهندگان پایتون برخی مشکلات موروثی و اشکالات جزئی موجود در این نسخه را به منظور ایجاد بنیانی مستحکم‌تر برای آینده برطرف کرده‌اند. این مساله ممکن است در ابتدا مهم به نظر نیاید اما با گذر زمان اهمیت آن آشکار می‌شود.
این نسخه یک ویژگی محسوب می‌شود! پایتون ۲.۷ آخرین نسخه از خانواده ۲ بوده و همه افراد باید به تدریج به نسخه ۳ جا‌به‌جا شوند. پایتون ۳ نسخه‌های پایداری را برای پنج سال منتشر کرده و به همین شکل ادامه خواهد داد.
در مجموع باید گفت در مقایسه پایتون ۲.۷ و ۳.۴ هیچ برنده مشخصی وجود ندارد، اما به نظر می‌رسد آنچه افراد تازه‌وارد باید روی آن متمرکز شوند فراگیری پایتون به عنوان یک زبان است. جا‌به‌جایی بین نسخه‌ها مساله‌ای است که در گذر زمان مطرح شده و حل می‌شود.

چگونه می‌توان پایتون را نصب کرد؟
دو رویکرد برای نصب پایتون وجود دارد که در ادامه بیان شده‌اند.

می‌توان پایتون را به طور مستقیم از سایت پروژه و مولفه‌های آن و کتابخانه‌های مورد نیاز را نیز به همین صورت دانلود و نصب کرد.
می‌توان یک بسته را دانلود و نصب کرد که دارای کتابخانه‌های از پیش نصب شده است. در این راستا، دانلود و نصب «آناکوندا» (Anaconda) که یک توزیع رایگان و متن‌باز از زبان های برنامه‌نویسی پایتون و R برای کاربردهای مرتبط با علم داده و یادگیری ماشین است توصیه می‌شود. گزینه دیگر Enthought Canopy Express است.
راهکار دوم امکان نصب بدون زحمت را فراهم می‌کند و بنابراین به افراد مبتدی استفاده از این روش توصیه می‌شود. مشکل این روش آن است که کاربر باید همواره منتظر ارتقا (upgrade) کل بسته باشد، حتی اگر تمایل به نصب آخرین بسته یک کتابخانه داشته باشند. البته این مساله تا هنگامی که کاربر قصد انجام پژوهش‌های آماری خاص را نداشته باشد، حائز اهمیت نخواهد بود.

انتخاب یک محیط توسعه
هنگامی که فرد پایتون را نصب کرد، گزینه‌های گوناگونی برای انتخاب محیط توسعه وجود دارد. در ادامه سه مورد از متداول‌ترین گزینه‌ها بیان شده‌اند.

مبتنی بر ترمینال/شِل
 IDLE (محیط پیش‌فرض)
iPython Notebook (شبیه markdown در زبان برنامه‌نویسی R است)

انتخاب محیط توسعه مناسب بسته به نیازهای افراد است و هر شخص متناسب با نیازها و البته سلیقه شخصی یکی یا چند تا از این موارد را انتخاب کند. iPython Notebook یک نرم‌افزار وب متن‌باز است که مورد توجه بسیاری از داده‌کاوها، تحلیلگران داده و دانشمندان داده واقع شده. دلیل این امر ویژگی‌های قابل توجه این نرم‌افزار به ویژه برای انجام پروژه‌های تحلیل داده محسوب می‌شود. از جمله این ویژگی‌ها قابلیت مستندسازی ضمن نوشتن کد و اجرای کدها در بلاک‌های جداگانه است (به جای اجرای خط به خط). از دیگر مزایای iPython Notebook می‌توان به مواردی که در زیر آمده اشاره کرد.

شِل (پوسته) تعاملی (Interactive shells) مبتنی بر ترمینال و کیوت (Qt)
یک رابط نوت‌بوک (notebook interface) مبتنی بر مرورگر با پشتیبانی از کد، متن، عبارات ریاضی، نمودارهای توکار و دیگر رسانه‌ها
پشتیبانی از بصری‌سازی داده تعاملی و استفاده از جعبه‌ابزارهای GUI
مفسرهای توکار و انعطاف‌پذیر برای بارگذاری در پروژه‌ها
وجود ابزارهای پردازش موازی
اجرای چند برنامه ساده در پایتون
می‌توان برای شروع کار از پایتون به عنوان یک ماشین حساب ساده استفاده کرد.

چند نکته شایان توجه:

  • می‌توان iPython notebook را با نوشتن “ipython notebook” در ترمینال یا cmd (بسته به سیستم‌عاملی که کاربر استفاده می‌کند) آغاز کرد.
  • می‌توان iPython notebook را به سادگی و تنها با کلیک کردن روی UntitledO (پس از باز کردن برنامه و ایجاد پروژه جدید) نام‌گذاری کرد.
  • رابط برای نمایش ورودی‌ها از «[*] In» و جهت نمایش خروجی‌ها از «[*] Out» استفاده می‌کند.
  • می‌توان کد نوشته شده را با فشردن «Shift + Enter» یا «ALT + Enter» (در صورتی که کاربر قصد داشته باشد یک سطر اضافی در ادامه کد قرار دهد این گزینه مناسب است) اجرا کرد.

کتابخانه‌ها و ساختارهای داده در پایتون

پیش از آن که به طور جدی‌تر به حل مساله پرداخته شود، یک گام عقب‌تر رفته و به مبانی پایتون پرداخته می‌شود. چنانکه مشهود است ساختارهای داده، حلقه‌ها و ساختارهای شرطی مبانی زبان‌های برنامه‌نویسی را شکل می‌دهند. در پایتون، لیست‌ها (lists)، رشته‌ها (strings)، تاپل‌ها (tuples) و دیکشنری‌ها (dictionaries) از جمله ساختارهای داده، for و while از حلقه‌ها و if-else از جمله ساختارهای شرطی است. در ادامه به طور مشروح‌تری به این موارد پرداخته خواهد شد.

ساختارهای داده در پایتون

در ادامه برخی از ساختارهای داده مورد استفاده در پایتون بیان شده‌اند. برای استفاده درست و موثر از این ساختارها، آشنایی با آن‌ها نیاز است.

لیست‌ها (Lists): لیست‌ها یکی از همه‌کارترین ساختارها در پایتون هستند. یک لیست را می‌توان به سادگی با نوشتن مجموعه‌ای از مقادیر جدا شده به وسیله ویرگول در میان دو کروشه تعریف کرد. لیست‌ها ممکن است شامل آیتم‌هایی از انواع گوناگون باشند، اما معمولا کلیه آیتم‌های یک لیست نوع یکسانی دارند. لیست‌های پایتون و عناصر منفرد از لیست قابل تغییر هستند. در ادامه مثالی برای تعریف لیست و دسترسی به آن ارائه شده است.

 

رشته‌ها (Strings): رشته‌ها را می‌توان به سادگی با استفاده از ( ‘ )، ( ” ) و یا ( ”’ ) تعریف کرد. رشته‌هایی که در میان دو تا ( ”’ ) قرار گرفته‌اند قابلیت گسترش یافتن طی چند خط را دارند و معمولا در docstring‌ها (راهکار پایتون برای مستندسازی توابع) مورد استفاده قرار می‌گیرند. \ به عنوان یک کاراکتر فرار مورد استفاده قرار می‌گیرد. به بیان دیگر، اگر رشته آنقدر طولانی باشد که چندین خط به طول بیانجامد باید آن را در میان ( ”’ ) قرار داد. لطفا توجه کنید که رشته‌های پایتون تغییرناپذیر (immutable) هستند، بنابراین نمی‌توان بخشی از یک رشته را تغییر داد.

 

 

تاپل‌ها (Tuples): یک تاپل به وسیله تعدادی از مقادیر که به وسیله ویرگول‌ها از یکدیگر جدا شده‌اند نمایش داده می‌شود. تاپل‌ها نیز تغییرناپذیر هستند (immutable) و خروجی یک تاپل تعریف شده چنانکه در شکل زیر مشهود است در میان پرانتزها قرار می‌گیرد، بنابراین تاپل‌های تو در تو (nested tuples) به طور صحیحی پردازش می‌شوند. علاوه بر این، با اینکه تاپل ها تغییرناپذیر هستند، در صورت نیاز می‌توانند داده‌های تغییرپذیر (mutable) را نگهداری کنند.

 

 

دیکشنری (Dictionary): دیکشنری یک مجموعه نامرتب از جفت‌های کلید:مقدار (key: value) است که در آن کلیدها باید مقادیری یکتا داشته باشند (در یک دیکشنری). یک جفت آکولاد، یعنی {}، یک دیکشنری خالی می‌سازد.

 

 

ساختارهای شرطی و حلقه‌ها در پایتون

مانند اغلب زبان‌های برنامه‌نویسی، پایتون نیز دارای حلقه for است که پر استفاده‌ترین روش برای تکرار محسوب می‌شود. این متد دارای یک نحو (syntax) بسیار ساده است.

for i in [Python Iterable]:
  expression(i)

در اینجا، عبارت «Python Iterable» می‌تواند از نوع لیست، تاپل یا دیگر ساختارهای داده پیشرفته باشد. به عنوان مثال، برنامه محاسبه فاکتوریل یک عدد در ادامه نوشته شده است.

fact=1
for i in range(1,N+1):
  fact *= i

عبارات شرطی برای اجرای یک بخش از کد براساس یک شرط مورد استفاده قرار می‌گیرند. پرکاربردترین ساختار شرطی if-else محسوب می‌شود که نحو آن به صورت زیر است.

if [condition]:
  __execution if true__
else:
  __execution if false__

برای مثال، در برنامه‌ای که تشخیص دهد عدد زوج است یا فرد و پاسخ مناسب را چاپ کند به صورت زیر عمل می‌شود.

if N%2 == 0:
  print ('Even')
else:
  print ('Odd')

اکنون که مبانی پایتون تشریح شد، می‌توان یک گام به جلو حرکت کرد. پرسشی که در این وهله مطرح می‌شود آن است که چگونه می‌توان وظایف زیر را انجام داد.

  • ضرب کردن دو ماتریس
  • پیدا کردن ریشه یک معادله درجه دوم
  • ترسیم نمودار میله‌ای و هیستوگرام
  • ساخت مدل‌های آماری
  • دسترسی به صفحات وب و گردآوری داده از آن‌ها

اگر کاربر قصد نوشتن همه کدها را از پایه داشته باشد، با کابوسی مواجه خواهد شد که موجب می‌شود بیش از چند روز از پایتون استفاده نکند. اما دلیلی برای نگرانی در این رابطه وجود ندارد. به لطف کتابخانه‌های بسیار زیادی که از پیش - برای زبان برنامه‌نویسی پایتون - تعریف شده‌اند و می‌توان آن‌ها را به طور مستقیم در کد ایمپورت کرد حل مسائلی که در بالا بیان شد و دیگر مسائل به مراتب پیچیده‌تر بسیار ساده خواهد شد. برای نمونه، مثال فاکتوریل که در بالا کد آن ارائه شد را می‌توان با استفاده از کتابخانه‌های از پیش آماده (در اینجا کتابخانه math) تنها با یک خط کد نوشت.

math.factorial(N)

البته نیاز به ایمپورت کردن کتابخانه math برای کد بالا است. در ادامه، کتابخانه‌های گوناگون پایتون مورد بررسی قرار خواهند گرفت.

کتابخانه‌های پایتون

اکنون در سفر علم داده با پایتون، یک گام به پیش رفته تا فراگیران، پایتون را ضمن آشنایی با برخی از کتابخانه‌های مفید و کارآمد علم داده و ریاضیات و جبر خطی فرابگیرند. اولین گام در این راستا، آموختن شیوه ایمپورت کردن کتابخانه به محیط برنامه است. در پایتون چندین راه برای انجام این کار وجود دارد که در زیر نشان داده شده‌اند.

import math as m

و

from math import *

 

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

تذکر: گوگل توصیه می‌کند که از راهکار اول برای ایمپورت کردن کتابخانه‌ها استفاده شود زیرا بدین شکل مشخص است که توابع از کجا آمده‌اند. در ادامه لیستی از کتابخانه‌ها آمده که برای هرگونه محاسبات علمی و تحلیل داده‌ای به آن‌ها نیاز خواهد بود.

NumPy سرنامی برای  Numerical Python است. قدرتمندترین ویژگی این کتابخانه، آرایه‌های n-بُعدی هستند. این کتابخانه همچنین شامل توابع پایه‌ای جبر خطی، تبدیل فوریه، تولید پیشرفته اعداد تصادفی و ابزارهایی جهت یکپارچه‌سازی با دیگر زبان‌های سطح پایین مانند C++ ، C و فورترن (Fortran) است.

SciPy سرنامی برای Scientific Python است. SciPy براساس NumPy ساخته شده و یکی از پرکاربردترین کتابخانه‌ها برای انواع گسترده‌ای از ماژول‌های سطح بالای علمی و مهندسی مانند تبدیل فوریه گسسته (discrete Fourier transform)، جبر خطی، بهینه‌سازی و «ماتریس‌های خلوت یا اسپارس» (Sparse Matrix) محسوب می‌شود.

Matplotlib برای ترسیم انواع گسترده‌ای از نمودارها، از هیستوگرام و نمودارهای خطی گرفته تا نمودارهای حرارتی قابل استفاده است. می‌توان از ویژگی Pylab در ipython notebook (به صورت ipython notebook –pylab = inline) به منظور بهره‌گیری از ویژگی‌ رسم نمودار به صورت خطی استفاده کرد. اگر ویژگی inline توسط کاربر نادیده گرفته شود، pylab محیط ipython را به محیطی بسیار شبیه به «متلب» (Matlab) مبدل می‌کند.

Pandas برای عملیات روی داده‌های ساختار یافته و دستکاری آن‌ها مورد استفاده قرار می‌گیرد. این کتابخانه به طور گسترده‌ای برای «data munging» (این عبارت یک تعریف استاندارد برای انجام تغییرات غیر قابل بازگشت در داده‌ها است. به نظر می‌رسد عبارت mung سرنام برگرفته شده از Mash Until No Good باشد. در واقع، عبارت data munging اغلب به فرآیند دریافت داده‌های خام و تبدیل و نگاشت آن‌ها به دیگر فرمت‌ها به منظور آماده‌سازی مجموعه داده جهت انجام تحلیل‌های تخصصی، اشاره دارد و از آماده‌سازی داده‌ها به عنوان مقدمه‌ای جهت تحلیل‌ها استفاده می‌شود. Pandas در سال‌های اخیر به پایتون اضافه و منجر به افزایش استفاده از آن در جامعه دانشمندان داده شده است.

Scikit Learn کتابخانه‌ای برای یادگیری ماشین است. این کتابخانه بر اساس SciPy، NumPy و matplotlib ساخته شده و شامل ابزارهای کارآمدی برای یادگیری ماشین و مدل‌سازی آماری شامل «دسته‌بندی» (classification)، «رگرسیون» (regression)، «خوشه‌بندی» (clustering) و «کاهش ابعاد» (dimensionality reduction) است.

Statsmodels برای مدل‌سازی آماری مورد استفاده قرار می‌گیرد. این کتابخانه یک ماژول از پایتون است که به کاربران امکان اکتشاف در داده‌ها، تخمین مدل‌های آماری و انجام آزمون‌های آماری را می‌دهد. Statsmodels یک لیست گسترده از «آمار توصیفی» (descriptive statistics)، «آزمون‌های آماری» (statistical tests)، توابع ترسیم نمودار و نتایج آماری برای انواع گوناگونی از داده‌ها و برآوردگرها است.

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

Bokeh برای ساخت نمودارهای تعاملی، دشبوردها و برنامه‌های داده در مرورگرهای مدرن مورد استفاده قرار می‌گیرد. این کتابخانه کاربر را قادر به تولید گرافیک‌های ظریف و مختصری به سبک D3.js می‌سازد. علاوه بر آنچه گفته شد، این کتابخانه توانایی تعامل با کارایی بالا در مجموعه داده‌های بسیار بزرگ یا جریانی را دارا است.

Blaze به منظور گسترش توانایی‌های Numpy و Pandas برای مجموعه داده‌های توزیع شده و جریانی، مورد استفاده قرار می‌گیرد. این کتابخانه قابل استفاده به منظور دسترسی داشتن به داده‌ها از طریق گروه کثیری از منایع شامل Bcolz ،MongoDB ،SQLAlchemy ،Apache Spark ،PyTables و دیگر موارد است. Blaze در کنار کتابخانه Bokeh می‌تواند به عنوان یک ابزار بسیار قدرتمند جهت ساخت آثاری بصری (گرافیک‌ها و نمودارها) و دشبوردهای موثر برای مجموعه‌های عظیم داده مورد استفاده قرار بگیرد.

Scrapy کتابخانه‌ای برای «خزیدن در وب» (web crawling) است. این کتابخانه برای کشف الگوهای خاص در داده‌ها بسیار مفید به حساب می‌آید. Scrapy توانایی آغاز به کار کردن در URL خانگی وب‌سایت و کاوش کردن در صفحه وب برای گردآوری اطلاعات را دارد.

SymPy برای «محاسبات نمادین» (Symbolic Computation) مورد استفاده قرار می‌گیرد و دارای طیف وسیعی از توانایی‌ها از ریاضیات نمادین پایه گرفته تا حساب، جبر، ریاضیات گسسته و فیزیک کوانتوم است. دیگر ویژگی کارآمد این کتابخانه، توانایی قالب‌بندی نتایج محاسبات به صورت کد «لاتک» (LaTeX) است.

Requests برای دسترسی به وب است. این کتابخانه به صورت مشابه با کتابخانه پایتون استاندارد urllib2 مورد استفاده قرار می‌گیرد، اما کد زدن با استفاد از Requests ساده‌تر است. امکان دارد کاربران با تجربه تفاوت‌های ظریفی بین این دو کتابخانه پیدا کنند، اما Requests برای افراد مبتدی راحت‌تر است.

کتابخانه‌های دیگری که ممکن است به آن‌ها نیاز شود عبارتند از:

  • os برای عملیات سیستم‌عامل و فایل
  • networkx و igraph برای دستکاری داده‌های مبتنی بر گراف
  • regular expressions برای یافتن الگوها در داده‌های متنی
  • BeautifulSoup برای گردش در وب قابل استفاده است. این کتابخانه نسبت به Scrapy در درجه دوم قرار می‌گیرد و ناقص‌تر محسوب می‌شود زیرا در یک اجرا تنها توانایی استخراج اطلاعات از یک صفحه وب را دارد.

اکنون که مبانی پایتون و کتابخانه‌های اضافی آن تشریح شد، در ادامه مطلب با نگاهی عمیق به چگونگی حل مساله تحلیل داده با بهره‌گیری از پایتون پرداخته خواهد شد. بله، منظور ساخت یک مدل پیش‌بین است. در فرآیند پیش رو از برخی کتابخانه‌های قدرتمند استفاده و با سطح دیگری از ساختارهای داده کار می‌شود. در ادامه سه فاز کلیدی زیر انجام خواهند شد:

  1. «اکتشاف در داده‌ها» (Data Exploration): کسب اطلاعات بیشتر پیرامون داده‌های موجود
  2. Data Munging: پاک‌سازی داده‌ها و بازی با آن‌ها به منظور مدل‌سازی بهتر داده‌ها انجام می‌شود.
  3. «مدل‌سازی پیش‌بین» (Predictive Modeling): اجرای الگوریتم‌های واقعی و لذت بردن از تحلیل داده‌ها.

تحلیل اکتشافی در پایتون با استفاده از Pandas

به منظور اکتشاف در داده‌ها، نیاز به آشنایی با یک حیوان دیگر، «Pandas»، است (البته اگر آشنایی با پایتون و آناکوندا کافی نبوده باشد).

Pandas یکی از پرکاربردترین کتابخانه‌های تحلیل داده در پایتون به شمار می‌آید. این کتابخانه نقش برجسته‌ای در افزایش استفاده از پایتون در جامعه دانشمندان داده داشته است. اکنون از Pandas برای خواندن یک مجموعه داده از رقابت‌های «Analytics Vidhya» استفاده می‌شود. سپس، تحلیل‌های اکتشافی انجام و اولین الگوریتم دسته‌بندی برای حل این مساله ارائه خواهد شد. پیش از بارگذاری داده‌ها، باید با دو ساختار کلیدی «سری‌ها» (Series) و «DataFrames» در Pandas آشنا شد.

 

مقدمه‌ای بر سری‌ها و DataFrame‌ها در Pandas

سری‌ها را می‌توان به عنوان آرایه‌های تک‌بُعدی برچسب‌گذاری/ایندکس شده دید. می‌توان به عناصر این سری‌ها از طریق برچسب‌ها دسترسی داشت. یک dataframe مشابه «کارپوشه» (workbook) در اکسل (کاربر اسامی ستون‌ها که به ستون‌ها ارجاع دارد و سطرها را دارد و می تواند به آن‌ها از طریق شماره سطرها دسترسی داشته باشد) است.

 

تفاوت اساسی در این میان آن است که در dataframe‌ها، اسامی ستون و شماره سطرها با عنوان ایندکس سطرها و ستون‌ها شناخته می‌شوند. سری‌ها و dataframe‌ها از مدل‌های داده اصلی Pandas در پایتون هستند. مجموعه داده‌ها ابتدا در این چارچوب‌های داده خوانده می‌شوند و سپس عملیات گوناگون (مثلا group و aggregation) به سادگی روی ستون‌های آن‌ها قابل اعمال خواهد بود.

تمرین کار با مجموعه داده‌ها -- مساله پیش‌بینی وام

می‌توان مجموعه داده استفاده شده در این مثال را از اینجا دانلود کرد. توصیف متغیرهای این مجموعه داده در ادامه آمده است.

 

آغاز اکتشاف

برای آغاز، رابط iPython را با نوشتن دستور زیر در ترمینال گنولینوکس/CMD ویندوز در حالت Inline Pylab اجرا کنید.

ipython notebook --pylab=inline

این دستور موجب می‌شود رابط iPython notebook در محیط pylab باز شود که به طور پیش‌فرض برخی از کتابخانه‌های مفید را به صورت ایمپورت شده دارد. همچنین، کاربر قادر خواهد بود تا نمودارها را به صورت inline رسم کند، این کار موجب می‌شود محیط موجود برای تحلیل‌های داده تعاملی جایگاه بسیار خوبی باشد. برای بررسی اینکه محیط به طور صحیح بارگذاری شده، دستور زیر را تایپ کنید (خروجی باید مشابه شکل زیر باشد):

plot(arange(5))

کلیه مراحل این تمرین در سیستم‌عامل گنولینوکس انجام شده و مجموعه داده مورد استفاده در مسیر زیر ذخیره شده است.

 /home/kunal/Downloads/Loan_Prediction/train.csv

ایمپورت کردن کتابخانه‌ها و مجموعه داده

در ادامه، لیست کتابخانه‌هایی که در این راهنما مورد استفاده قرار می‌گیرند بیان شده است.

  • numpy
  • matplotlib
  • pandas

شایان توجه است که نیازی به ایمپورت کردن کتابخانه‌های matplotlib و numpy به دلیل استفاده از محیط Pylab وجود ندارد. با این وجود همچنان در کدهای نوشته شده ایمپورت می‌شوند تا اگر شخصی در محیطی غیر از Pylab از آن‌ها استفاده کرد با خطا مواجه نشود. پس از ایمپورت کردن کتابخانه‌ها، باید مجموعه داده را با استفاده از تابع  .()read_csv خواند. کدهای مربوط به آنچه تا این لحظه بیان شد به صورت زیر هستند.

import pandas as pd
import numpy as np
import matplotlib as plt
%matplotlib inline

df = pd.read_csv("/home/kunal/Downloads/Loan_Prediction/train.csv") #Reading the datase

کتشاف داده سریع

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

df.head(10)

این دستور باید ۱۰ سطر را چاپ کند. همچنین می‌توان با پرینت کردن مجموعه داده تعداد سطرهای بیشتری را دید. گام بعدی داشتن نگاهی به خلاصه فیلدهای عددی با استفاده از تابع ()describe است.

df.describe()

تابع ()describe تعداد عناصر (count)، میانگین (mean)، انحراف معیار (standard deviation | std)، کمینه (min)، چارک‌ها (quartiles) و بیشینه (max) را در خروجی ارائه می‌کند.

در ادامه برخی از نتایجی که می‌توان با نگاه به خروجی تابع ()describe به آن‌ها دست یافت ارائه شده‌اند.

  • LoanAmount دارای ۲۲ مقدار ناموجود (۵۹۲– ۶۱۴) است.
  • Loan_Amount_Term دارای ۱۴ مقدار ناموجود (۶۰۰ - ۶۱۴) است.
  • Credit_History دارای ۵۰ مقدار ناموجود (۵۶۴-۶۱۴) است.

همچنین مشهود است که بالغ بر ٪۸۴ متقاضیان وام (applicants) دارای credit_history هستند. چگونه می‌توان این مطلب را فهمید؟ میانگین فیلد credit_history برابر با 0.84 است (به خاطر داشته باشید که Credit_History دارای مقدار «۱» برای افراد دارای تاریخچه اعتبار و مقدار «۰» برای افراد فاقد آن است). به نظر می‌رسد توزیع ApplicantIncome درست مانند CoapplicantIncome با انتظار مطابقت دارد.

شایان توجه است که می‌توان ایده وجود یک «چولگی» (Skewness) احتمالی در داده‌ها را با مقایسه میانگین و میانه در نظر گرفت. برای مقادیر غیر عددی (برای مثال Property_Area ،Credit_History و دیگر موارد)، برای دانستن اینکه آیا معنادار هستند یا خیر می‌توان نگاهی به توزیع فراوانی داشت. جدول فراوانی را می توان با استفاده از دستور زیر پرینت گرفت.

df['Property_Area'].value_counts()

به طور مشابه، می‌توان مقادیر یکتا در تاریخچه اعتبار را مورد بررسی قرار داد. قابل توجه است که [’dfname[‘column_name d یک روش اندیس‌گذاری پایه برای دستیابی به یک ستون مشخص از dataframe است. این مورد می‌تواند لیستی از ستون‌ها نیز باشد.

تحلیل توزیع

اکنون که با مبانی خصوصیات داده  آشنایی ایجاد شد، توزیع متغیرهای گوناگون مورد بررسی قرار خواهد گرفت. این بررسی از متغیرهای عددی و برای مثال ApplicantIncome و LoanAmount آغاز خواهد شد. ابتدا نمودار هیستوگرام برای این متغیر با استفاده از دستور زیر ترسیم می‌شود.

df['ApplicantIncome'].hist(bins=50)

در اینجا قابل مشاهده است که تعداد ناچیزی مقادیر بسیار بزرگ وجود دارد. به همین دلیل است که برای ترسیم توزیع به طور شفاف نیاز به ۵۰ «رده» (Bin) است (به هیستوگرام متغیرهای گسسته که می‌توانند m مقدار متفاوت داشته باشند، هیستوگرام m-bin گفته می‌شود). در گام بعدی، برای فهمیدن توزیع داده‌ها نمودار جعبه‌ای مورد بررسی قرار می‌گیرد. نمودار جعبه‌ای را می‌توان با دستور زیر ترسیم کرد.

df.boxplot(column='ApplicantIncome')

این نمودار گواهی بر وجود تعداد زیادی مقادیر ناهنجار یا دور افتاده است. این مساله به وجود اختلاف درآمد در میان اقشار مختلف جامعه نسبت داده می‌شود. بخشی از این مساله نیز احتمالا مربوط به این است که افرادی با سطح تحصیلات گوناگون مورد بررسی قرار گرفته‌اند. در ادامه افراد بر اساس سطح تحصیلات جداسازی می‌شوند.

می‌توان به وضوح در نمودار بالا دید که تفاوت قابل توجهی بین میانگین درآمد افراد فارغ‌التحصیل و غیر فارغ‌التحصیل وجود ندارد. اما افراد فارغ‌التحصیل بیشتری با درآمد بسیار بالا وجود دارند که در نمودار به صورت دورافتادگی ظاهر شده است. اکنون نمودار هیستوگرام و جعبه‌ای برای LoanAmount با استفاده از دستوراتی که در ادامه آمده ترسیم می‌شوند.

df['LoanAmount'].hist(bins=50)
df.boxplot(column='LoanAmount')

مجددا، چندین مقدار بسیار زیاد وجود دارد. واضح است که ApplicantIncome و LoanAmount نیازمند munging (پیش‌پردازش) هستند. LoanAmount علاوه بر مقادیر بسیار بزرگ دارای مقادیر ناموجود نیز هست، در حالیکه ApplicantIncome دارای مقادیر بسیار بزرگی است که نیازمند درک عمیق‌تر هستند. به این مسائل در ادامه پرداخته خواهد شد.

تحلیل متغیرهای دسته‌ای

اکنون که توزیع‌های ApplicantIncome و LoanIncome مشخص شد، به متغیرهای دسته‌ای با جزئیات بیشتری پرداخته خواهد شد. در اینجا از سبک جداول محوری (pivot table) و جدول متقاطع (cross-tabulation) در نرم‌افزار اکسل (Excel) استفاده شده است. برای مثال، در نمونه زیر شانس گرفتن وام بر اساس تاریخچه اعتبار بررسی شده. این مورد را می‌توان با جداول محوری (پیوت تیبل) در اکسل انجام داد.

تذکر: در اینجا وضعیت به این صورت کدگذاری شده که ۱ برای «بله» و ۰ برای «خیر» است. بنابراین میانگین احتمال دریافت وام را نشان می‌دهد. اکنون مراحل مورد نیاز برای تولید بینشی مشابه، با استفاده از پایتون، بررسی شده است. از قطعه کد زیر می‌توان برای تولید چیزی مشابه با آنچه از اکسل به دست آمده استفاده کرد.

temp1 = df['Credit_History'].value_counts(ascending=True)
temp2 = df.pivot_table(values='Loan_Status',index=['Credit_History'],aggfunc=lambda x: x.map({'Y':1,'N':0}).mean())
print ('Frequency Table for Credit History:') 
print (temp1)

print ('\nProbility of getting loan for each Credit History class:')
print (temp2)

خروجی، چیزی شبیه pivot_table موجود در اکسل است. این خروجی را می‌توان با استفاده از نمودار میله‌ای و کتابخانه «matplotlib» با استفاده از کد زیر بصری کرد.

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8,4))
ax1 = fig.add_subplot(121)
ax1.set_xlabel('Credit_History')
ax1.set_ylabel('Count of Applicants')
ax1.set_title("Applicants by Credit_History")
temp1.plot(kind='bar')

ax2 = fig.add_subplot(122)
temp2.plot(kind = 'bar')
ax2.set_xlabel('Credit_History')
ax2.set_ylabel('Probability of getting loan')
ax2.set_title("Probability of getting loan by credit history")

این نمودار حاکی از آن است که در صورت وجود تاریخچه اعتباری معتبر، شانس دریافت وام هشت برابر می‌شود. می‌توان گراف مشابهی را با دیگر ویژگی‌ها از جمله Married، Self-Employed و Property_Area ترسیم کرد. همچنین، می‌توان این دو نمودار را در یک «نمودار تجمعی» (stacked chart) ترکیب و نمودار حاصل را ترسیم کرد.

temp3 = pd.crosstab(df['Credit_History'], df['Loan_Status'])
temp3.plot(kind='bar', stacked=True, color=['red','blue'], grid=False)

جنسیت را نیز می‌توان به این ترکیب افزود (مشابه جدول Pivot در اکسل).

پیش‌پرداز داده‌ها (Data Munging) در پایتون با استفاده از Pandas

مخاطبانی که تا این لحظه مطلب را مطالعه کرده‌اند باید به این نکته توجه داشته باشند که پیش‌پردازش داده‌ها مهم‌ترین گام در فرآیند تحلیل داده است که به آن به عبارتی (Data munging) نیز گفته می‌شود.

پیش‌پردازش داده‌ها - خلاصه‌ای از نیازها

در حین فرآیند اکتشاف داده‌ها، چندین مساله در مجموعه داده یافت شد که باید پیش از مدل‌سازی نهایی حل شوند. به این کار پیش‌پردازش داده‌ها یا «Data Munging» گفته می‌شود. مشکلاتی که حین اکتشاف داده‌ها از وقوع آن‌ها آگاهی حاصل شد به شرح زیر هستند:

  • مقادیر ناموجود برای برخی از متغیرها وجود دارند. باید این مقادیر را به طور هوشمندانه‌ای بسته به میزان مقادیر ناموجود و اهمیت آن متغیر تخمین زد.
  • هنگام بررسی توزیع مقادیر برای متغیرها، مشهود بود که ApplicantIncome و LoanAmount دارای مقادیر بسیار بزرگی هستد. گرچه، این مقادیر ممکن است در بردارنده اطلاعات نوآورانه‌ای باشند، اما باید با آن‌ها به شکل مناسبی مواجه شد.

علاوه بر این مسائل که برای مقادیر عددی وجود دارد، باید فیلد مقادیر غیر عددی مانند Education ،Married ،Property_Area و Gender را نیز از جهت وجود اطلاعات ارزشمند در آن‌ها مورد بررسی قرار داد.

بررسی مقادیر ناموجود در مجموعه داده

در این گام باید مقادیر ناموجود برای کلیه متغیرها مورد بررسی قرار بگیرند زیرا اغلب مدل‌ها با داده‌های ناموجود کار نمی‌کنند و حتی در صورت کار کردن نیز حل مشکل این مقادیر بهتر از حل نکردن آن است چون می‌تواند در دقت و صحت خروجی موثر باشد. تعداد nullها/NaNهای موجود در مجموعه داده با استفاده از کد زیر قابل محاسبه است.

 df.apply(lambda x: sum(x.isnull()),axis=0)

دستور بالا باید تعداد مقادیر ناموجود در هر سطر را که ()isnull در صورت هیچ مقدار بودن (null) یک متغیر باز می‌گرداند، در اختیار بگذارد.

گرچه مقادیر از دست رفته تعداد زیادی ندارند، اما متغیرهای زیادی دارای مقادیر ناموجود هستند، بنابراین هر یک از این موارد باید تخمین زده و به داده‌ها اضافه شوند. روش‌های گوناگونی برای حله مساله مقادیر ناموجود وجود دارد که تشریح کلیه آن‌ها از حوصله این بحث خارج است.

تذکر: به خاطر داشته باشید که مقادیر ناموجود همیشه NaN نیستند. برای مثال اگر Loan_Amount_Term برابر با ۰ باشد، این پرسش مطرح می‌شود که صفر دارای معنا است یا باید یک داده ناموجود محسوب شود؟ در اینجا پاسخ صحیح «داده ناموجود» است، بنابراین باید به دنبال چنین مقادیر غیر عملیاتی به عنوان مقادیر ناموجود بود.

چگونه مقادیر ناموجود برای LoanAmount محاسبه می‌شوند؟

راهکارهای گوناگونی برای جای‌گذاری مقادیر ناموجود loan amount وجود دارد. ساده‌ترین راه جایگزینی آن با میانگین است که با استفاده از قطعه کد زیر انجام می‌شود.

 df['LoanAmount'].fillna(df['LoanAmount'].mean(), inplace=True)

راهکار قابل توجه دیگر استفاده از یک روش یادگیری نظارت شده برای پیش‌بینی مقدار وام بر اساس دیگر متغیرها و استفاده از سن در کنار دیگر متغیرها برای پیش‌بینی مقادیر ناموجود است. با توجه به اینکه هدف در حال حاضر آن است که گام‌های data munging انجام شود، رویکردی که اتخاذ می‌شود چیزی بین این دو خواهد بود. یک فرضیه کلیدی آن است که می‌توان از ترکیب تحصیل‌کرده یا خوداشتغال بودن فرد برای ارائه یک تخمین خوب از مقدار وام استفاده کرد. در این راستا، ابتدا نمودار جعبه‌ای زیر از جهت وجود گرایش‌ها بررسی می‌شود.

تغییراتی در میزان وام برای هر گروه وجود دارد و این امر برای نسبت دادن مقادیر قابل استفاده است. اما ابتدا، باید اطمینان حاصل شود که متغیرهای Self_Employed و Education نباید مقادیر ناموجود داشته باشند. همانطور که پیش از این مشاهده شد، Self_Employed دارای تعدادی مقدار از دست رفته است. جدول فراوانی مجددا مورد بررسی قرار می‌گیرد.

با توجه به اینکه نزدیک به %86 مقادیر «No» هستند، می‌توان مقادیر ناموجود را با «No» جایگزین کرد زیرا احتمال آنکه تخمین درستی باشد بالا است. این کار را می‌توان با استفاده از قطعه کد زیر انجام داد.

 df['Self_Employed'].fillna('No',inplace=True)

اکنون باید جدول Pivot ساخته شود تا مقدار میانه را برای همه گروه‌های مقادیر یکتای ویژگی‌های Self_Employed و Education فراهم کند. سپس، یک تابع تعریف می‌شود که مقدار این سلول‌ها را بازگردانده و آن را جایگزین مقادیر ناموجود loan amount می‌کند.

table = df.pivot_table(values='LoanAmount', index='Self_Employed' ,columns='Education', aggfunc=np.median)
# Define function to return value of this pivot_table
def fage(x):
 return table.loc[x['Self_Employed'],x['Education']]
# Replace missing values
df['LoanAmount'].fillna(df[df['LoanAmount'].isnull()].apply(fage, axis=1), inplace=True)

این کد می‌تواند راهکار خیلی خوبی برای جایگزینی مقادیر ناموجود متغیر loan amount باشد.

تذکر: این روش تنها در صورتی پاسخگو است که مقادیر ناموجود با استفاده از راهکار پیش‌تر بیان شده پُر نشده باشند.

چگونه با مقادیر فوق‌العاده در توزیع LoanAmount و ApplicantIncome برخورد شود؟

ابتدا LoanAmount تحلیل می‌شود. با توجه به اینکه مقادیر فوق‌العاده ممکن است صحیح باشند (مثلا برخی افراد ممکن است درخواست وام‌های خیلی زیاد برای نیازهای خاص داشته باشند). بنابراین، به جای مواجهه با آن‌ها به صورت دورافتادگی، از یک تبدیل سوابق برای خنثی کردن تاثیر آن‌ها استفاده می‌شود.

 df['LoanAmount_log'] = np.log(df['LoanAmount'])
df['LoanAmount_log'].hist(bins=20)

بررسی مجدد نمودار هیستوگرام:

اکنون توزیع به نرمال نزدیک‌تر شده و تاثیر مقادیر فوق‌العاده به میزان زیادی فروکش کرده. حالا نوبت به ApplicantIncome رسیده است. یک بینش می‌تواند این باشد که برخی از متقاضیان وام (applicants) درآمد کمتری دارند اما ضامن پشتیبان بسیار قوی دارند. بنابراین، ترکیب درآمدها به صورت درآمد کلی (total income) و تبدیل کردن سوابق آن می‌تواند ایده خوبی باشد.

df['TotalIncome'] = df['ApplicantIncome'] + df['CoapplicantIncome']
df['TotalIncome_log'] = np.log(df['TotalIncome'])
df['LoanAmount_log'].hist(bins=20)

اکنون، می‌توان مشاهده کرد که توزیع داده‌ها بهتر از قبل است. جایگذاری مقادیر ناموجود برای Gender، Married، Dependents، Loan_Amount_Term و Credit_History به مخاطبان سپرده می‌شود. همچنین، توصیه می‌شود به دیگر اطلاعاتی که قابل حصول از داده‌ها هستند فکر شود. برای مثال، ساخت ستونی برای LoanAmount/TotalIncome ممکن است معنادار باشد زیرا ایده‌ای از اینکه درخواست‌کننده وام چقدر خوب بازپرداخت اقساط را انجام می‌دهد فراهم می‌کند. در ادامه، مبحث ساخت مدل پیش‌بین مورد بررسی قرار می‌گیرد.

ساخت یک مدل پیش‌بین در پایتون

پس از آنکه داده‌ها پیش پردازش و برای تحلیل مناسب شد، زمان آن رسیده که از کد پایتون برای ساخت یک مدل پیش‌بین روی مجموعه داده موجود استفاده شود. Skicit-Learn (یا sklearn) پر کاربردترین کتابخانه در پایتون برای این منظور است و در ادامه این مطلب از آن استفاده خوهد شد. از آنجا که برای کار با sklearn همه مقادیر باید عددی باشند، باید همه متغیرهای دسته‌ای را با رمزنگاری به متغیرهای عددی تبدیل کرد. پیش از آن همه مقادیر ناموجود در مجموعه داده با استفاده از قطعه کد زیر پر می‌شود.

df['Gender'].fillna(df['Gender'].mode()[0], inplace=True)
df['Married'].fillna(df['Married'].mode()[0], inplace=True)
df['Dependents'].fillna(df['Dependents'].mode()[0], inplace=True)
df['Loan_Amount_Term'].fillna(df['Loan_Amount_Term'].mode()[0], inplace=True)
df['Credit_History'].fillna(df['Credit_History'].mode()[0], inplace=True)
 from sklearn.preprocessing import LabelEncoder
var_mod = ['Gender','Married','Dependents','Education','Self_Employed','Property_Area','Loan_Status']
le = LabelEncoder()
for i in var_mod:
    df[i] = le.fit_transform(df[i])
df.dtypes

سپس، ماژول‌های مورد نیاز ایمپورت می‌شوند. پس از آن، یک تابع دسته‌بندی عمومی تعریف می‌شود که مدل را به عنوان ورودی دریافت کرده و  صحت و امتیازهای «اعتبارسنجی متقابل» (Cross-Validation) را تعیین می‌کند. با توجه به اینکه این مطلب یک نوشته جامع ولی مقدماتی است، به جزئیات کد زیر پرداخته نمی‌شود.

#Import models from scikit learn module:
from sklearn.linear_model import LogisticRegression
from sklearn.cross_validation import KFold   #For K-fold cross validation
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn import metrics

#Generic function for making a classification model and accessing performance:
def classification_model(model, data, predictors, outcome):
  #Fit the model:
  model.fit(data[predictors],data[outcome])
  
  #Make predictions on training set:
  predictions = model.predict(data[predictors])
  
  #Print accuracy
  accuracy = metrics.accuracy_score(predictions,data[outcome])
  print ("Accuracy : %s" % "{0:.3%}".format(accuracy))

  #Perform k-fold cross-validation with 5 folds
  kf = KFold(data.shape[0], n_folds=5)
  error = []
  for train, test in kf:
    # Filter training data
    train_predictors = (data[predictors].iloc[train,:])
    
    # The target we're using to train the algorithm.
    train_target = data[outcome].iloc[train]
    
    # Training the algorithm using the predictors and target.
    model.fit(train_predictors, train_target)
    
    #Record error from each cross-validation run
    error.append(model.score(data[predictors].iloc[test,:], data[outcome].iloc[test]))
 
  print ("Cross-Validation Score : %s" % "{0:.3%}".format(np.mean(error)))

  #Fit the model again so that it can be refered outside the function:
  model.fit(data[predictors],data[outcome])

رگرسیون لوجستیک

در ادامه یک مدل رگرسیون برای داده‌های موجود که پیش پردازش آن‌ها نیز انجام شده ساخته می‌شود. یک راهکار آن است که همه متغیرها به مدل داده شوند، ولیکن این امر موجب «بیش‌برازش» (Overfitting) می‌شود (برای افرادی که با این مبحث هنوز آشنایی ندارند جای نگرانی وجود ندارد). به بیان ساده، دریافت کلیه متغیرها ممکن است منجر به درک روابط پیچیده موجود به طور خاص در داده‌ها شود و مانع از عمومی‌سازی خوب مدل شود. این مطلب برای مطالعه بیشتر پیرامون رگرسیون لوجستیک توصیه می‌شود. می‌توان به سادگی از چند فرضیه برای شروع کار استفاده کرد. شانس دریافت وام بالاتر خواهد بود اگر:

  • متقاضیان دارای تاریخچه اعتباری باشند (این مورد در اکتشاف داده‌ها مشاهده شد)
  • متقاضایان و ضامن‌های آن‌ها درآمد ورودی بیشتری داشته باشند.
  • متقاضیان سطح تحصیلات بیشتری داشته باشند.
  • متقاضی دارای املاک در نواحی شهری با چشم‌انداز رشد بالا باشد.

با توجه به آنچه بیان شد، اولین مدل با «Credit_History» ساخته می‌شود.

outcome_var = 'Loan_Status'
model = LogisticRegression()
predictor_var = ['Credit_History']
classification_model(model, df,predictor_var,outcome_var)

صحت: %80.945 و امتیاز اعتبارسنجی متقابل: %80.946

#We can try different combination of variables:
predictor_var = ['Credit_History','Education','Married','Self_Employed','Property_Area']
classification_model(model, df,predictor_var,outcome_var)

صحت: %80.945 و امتیاز اعتبارسنجی متقابل: %80.946

به‌طور کلی، انتظار می‌رود که با افزودن متغیرها صحت افزایش پیدا کند. اما این کار چالش برانگیزتر است. صحت و امتیاز اعتبارسنجی متقابل در حضور متغیرهای کم‌اهمیت‌تر تحت تاثیر قرار نمی‌گیرند. Credit_History وضعیت غالب است. اکنون دو گزینه وجود دارد.

  1. مهندسی ویژگی‌ها: اشتقاق اطلاعات جدید و تلاش برای پیش‌بینی آن‌ها. انجام این کار بسته به خلاقیت مخاطبان می‌تواند به صورت‌های گوناگونی انجام پذیرد.
  2. روش‌های مدل‌سازی بهتر. این رویکرد در ادامه مورد بررسی قرار می‌گیرد.

درخت تصمیم

درخت تصمیم (Decision Tree) راهکار دیگری برای ساخت یک مدل پیش‌بین است. این راهکار به داشتن صحت بالاتر نسبت به مدل رگرسیون لوجستیک شناخته شده است.

model = DecisionTreeClassifier()
predictor_var = ['Credit_History','Gender','Married','Education']
classification_model(model, df,predictor_var,outcome_var)

صحت: %81.930 و امتیاز اعتبارسنجی متقابل: %76.656

در اینجا مدل مبتنی بر متغیرهای دسته‌ای نمی‌تواند تاثیر داشته باشد زیرا Credit History بر آن‌ها غلبه دارد. بنابراین، از چند متغیر عددی استفاده می‌شود.

#We can try different combination of variables:
predictor_var = ['Credit_History','Loan_Amount_Term','LoanAmount_log']
classification_model(model, df,predictor_var,outcome_var)

صحت %92.345 و امتیاز اعتبارسنجی متقابل: %71.009

چنانکه مشهود است با افزودن متغیرها، صحت افزایش پیدا کرد و امتیاز اعتبارسنجی متقابل کاهش یافت. این مساله به دلیل آنکه مدل با داده‌ها بیش‌برازش شد به وقوع پیوسته است. اکنون یک الگوریتم پیچیده‌تر مورد استفاده قرار می گیرد تا نتایج حاصل از آن با روش درخت تصمیم و رگرسیون لوجستیک مقایسه شوند.

جنگل تصادفی

«جنگل تصادفی» (Random Forest) الگوریتم دیگری برای حل مسائل  دسته‌بندی محسوب می‌شود. مزیت این الگوریتم آن است که می‌تواند با همه ویژگی‌ها کار کند و یک ماتریس اهمیت ویژگی‌ها باز می‌گرداند که برای انتخاب ویژگی‌ها قابل استفاده است.

model = RandomForestClassifier(n_estimators=100)
predictor_var = ['Gender', 'Married', 'Dependents', 'Education',
       'Self_Employed', 'Loan_Amount_Term', 'Credit_History', 'Property_Area',
        'LoanAmount_log','TotalIncome_log']
classification_model(model, df,predictor_var,outcome_var)

صحت: %100.000 و امتیاز اعتبارسنجی متقابل %78.179

در اینجا مشهود است که صحت مدل برای داده‌های آزمون %۱۰۰ است. این نهایت بیش‌برازش محسوب می‌شود و به دو شکل قابل حل است:

  1. کاهش تعداد پیش‌بین‌ها
  2. تنظیم پارامترهای مدل

در ادامه هر دو راهکار بالا بررسی می‌شوند. ابتدا ماتریس اهمیت ویژگی‌ها که بر اساس آن می‌توان مهم‌ترین ویژگی‌ها را گرفت مشاهده می‌شود.

#Create a series with feature importances:
featimp = pd.Series(model.feature_importances_, index=predictor_var).sort_values(ascending=False)
print (featimp)

اکنون از ۵ متغیر بالاتر برای ساخت مدل استفاده می‌شود. همچنین، پارامترهای جنگل تصادفی نیز کمی تنظیم می‌شوند.

model = RandomForestClassifier(n_estimators=25, min_samples_split=25, max_depth=7, max_features=1)
predictor_var = ['TotalIncome_log','LoanAmount_log','Credit_History','Dependents','Property_Area']
classification_model(model, df,predictor_var,outcome_var)

صحت: ٪82.899 و امتیاز اعتبارسنجی متقابل: %81.461

شایان توجه است که صحت مدل کاهش یافته اما امتیاز اعتبارسنجی متقابل افزایش یافته که نشان می‌دهد مدل به خوبی عمومی‌سازی شده. باید به خاطر داشت که مدل‌های جنگل تصادفی دقیقا قابل تکرار نیستند. به عبارت دیگر، اجراهای گوناگون منجر به تنوع ناچیزی به دلیل تصادفی‌سازی می‌شوند. اما خروجی نباید تغییر قابل توجهی داشته باشد. مشهود است که با انجام تنظیمات کمی در پارامترهای جنگل تصادفی، صحت اعتبارسنجی متقابل بهتری نسبت به رگرسیون لوجستیک به دست آمد. این تمرین یافته‌های قابل توجهی را در اختیار قرار می‌دهد.

  • استفاده از مدل‌های پیچیده‌تر الزاما منجر به نتایج بهتری نمی‌شود.
  • باید از استفاده از روش‌های مدل‌سازی پیچیده به عنوان جعبه سیاه بدون درک مفاهیم آن‌ها ممانعت کرد.
  • مهندسی ویژگی‌ها کلید موفقیت است. هر کسی می‌تواند از یک مدل  Xgboost استفاده کند ولی هنر و خلاقیت واقعی ارتقای ویژگی‌ها برای تناسب بهتر مدل است.

سخن پایانی

امید می‌رود که این راهنما توانسته باشد به علاقمندان علم داده و داده‌کاوی که تمایل داشتند در عمل نیز با بهره‌گیری از زبان پایتون به فعالیت بپردازند کمک کرده باشد. انتظار می‌رود این مطلب علاوه بر روش‌های پایه‌ای تحلیل، چگونگی تحلیل برخی از روش‌های پیچیده‌تر نیز که امروزه به وفور مورد استفاده قرار می‌گیرند کمک کرده باشد.

پایتون یک ابزار فوق‌العاده است که به یک زبان بسیار محبوب در میان دانشمندان داده مبدل شده است. از جمله دلایل این امر سادگی یادگیری آن، قابلیت یکپارچه‌سازی به خوبی با دیگر مجموعه داده‌ها و ابزارهایی مانند «Spark» و «Hadoop» است. در عین حال، پایتون دارای توانایی محاسباتی بسیار بالا و کتابخانه‌های تحلیل داده قدرتمندی است. بنابراین، یادگیری پایتون به منظور انجام هر آنچه در چرخه حیات یک پروژه تحلیل داده قابل اجرا است توصیه می‌شود.



نظرات

برای ثبت نظر لطفا وارد حساب کاربری شوید

ورود / ثبت نام