دسته بندی سلول های سرطانی با پایتون – به زبان ساده


«یادگیری ماشین» (Machine Learning) یک شاخه از «هوش مصنوعی» (Artificial Intelligence) است که به سیستمها توانایی یادگیری توسط خودشان و انجام امور بدون آنکه به طور صریح برای آنها برنامهنویسی شده باشند را میدهد. یادگیری ماشین برای بسیاری از مسائل جهان واقعی قابل استفاده است. در این مطلب، روش دسته بندی سلول های سرطانی با پایتون بر پایه ویژگیهای آنها و تعیین اینکه تومورها «خوشخیم» (Benign) یا «بدخیم» (Malignant) هستند، مورد بررسی قرار گرفته است.
دسته بندی سلول های سرطانی با پایتون
در ادامه، از کتابخانه «سایکیت لِرن» (Scikit-learn) برای حل این مساله یادگیری ماشین استفاده میشود. Scikit-learn یک کتابخانه «پایتون» (Python Programming Language) «متنباز» (Open Source) برای یادگیری ماشین، «دادهکاوی» (Data Mining) و «تحلیل داده» (Data Analytics) است.
مجموعه داده
کتابخانه سایکیت لرن دارای چند «مجموعه داده» (Data Set) استاندارد است که نیاز به دانلود هیچ فایلی از وبسایتهای خارجی ندارد. مجموعه دادهای که در اینجا برای مساله یادگیری ماشین استفاده شده، مجموعه داده «تشخیص سرطان سینه ویسکانسین» (Breast Cancer Wisconsin Dataset) است.
مجموعه داده مذکور حاوی دادههایی پیرامون تومورهای سرطان سینه با برچسبهای دستهبندی (خوشخیم و بدخیم) است. این کتابخانه را میتوان با استفاده از تابع زیر، بارگذاری کرد.
این مجموعه داده حاوی ۵۶۹ نمونه یا در واقع، دادههای ۵۶۹ تومور است. همچنین، برای هر نمونه داده یا هر تومور، ۳۰ ویژگی ارائه شده است که از این جمله میتوان به شعاع، الگو، محیط و مساحت تومور اشاره کرد.
نصب ماژولهای لازم
در پروژههای یادگیری ماشین، نیاز به ماژول پایتون «Scikit-learn» است. اگر این کتابخانه در سیستم کاربر نصب نشده باشد، میتواند آن را با استفاده از دستور زیر دانلود و نصب کند.
pip install scikit-learn
شایان توجه است که میتوان از هر «محیط توسعه یکپارچهای» (Integrated Development Network) برای انجام این پروژه استفاده کرد؛ اما به شدت توصیه میشود که از «ژوپیتر نوتبوک» (Jupyter Notebook) برای انجام پروژه استفاده شود. زیرا پایتون یک زبان مفسری است و میتوان با استفاده از ژوپیتر نوتبوک،.از مزایای مفسری بودن آن به طور کامل بهرهمند شد و برای هر بخش از کد، با اجرا کردن آن، بررسی کرد که چه اتفاقاتی به طور گام به گام در حال وقوع است. این کار کمک میکند که بدون نوشتن اسکریپت کامل و اجرای یکباره آن، برنامه را بررسی کرد. ژوپیتر نوتبوک را میتوان با اجرای دستور زیر در خط فرمان، دانلود و نصب کرد:
pip install jupyter
پیادهسازی مرحله به مرحله دستهبندی سلولهای سرطانی به دو دسته بدخیم و خوشخیم با استفاده از کتابخانه سایکیت لرن در ادامه انجام شده است.
گام اول: وارد کردن ماژولهای لازم
به کتابخانه سایکیتلِرن و مجموعه داده سرطان سینه نیاز است.
گام دوم: بارگذاری مجموعه داده
خصیصههای مهمی که باید از مجموعه داده در نظر گرفته شود، «target-names» (معنای برچسبها)، «feature_names» (معنای ویژگیها) و «data» (دادههایی که باید یاد گرفته شوند) است.
گام سوم: سازماندهی دادهها و بررسی آنها
برای کسب درک بهتر از آنچه که مجموعه داده حاوی آن است و چگونگی استفاده از دادهها برای آموزش مدل، ابتدا دادهها سازماندهی میشوند. در ادامه، ابتدا دادهها سازماندهی میشوند و سپس، با استفاده از دستور print() محتوای آنها بررسی میشود.
سپس، با استفاده از تابع print()، دادهها آزموده میشوند.
# looking at the data print(label_names)
خروجی قطعه کد بالا، به صورت زیر است.
['malignant' 'benign']
همانطور که مشخص است، دادههای مجموعه داده با «benign» (خوشخیم) و «malignant» (بدخیم) برچسبگذاری شدهاند.
print(labels)
خروجی قطعه کد بالا به صورت زیر است.
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1]
از این خروجیها میتواند مشاهده کرد که هر برچسب به مقدار دودویی آن (۰ و ۱) پیوند خورده است. ۰ به معنای تومور بدخیم و ۱ به معنای تومور خوشخیم است.
خروجی قطعه کد بالا به صورت زیر است.
['mean radius' 'mean texture' 'mean perimeter' 'mean area' 'mean smoothness' 'mean compactness' 'mean concavity' 'mean concave points' 'mean symmetry' 'mean fractal dimension' 'radius error' 'texture error' 'perimeter error' 'area error' 'smoothness error' 'compactness error' 'concavity error' 'concave points error' 'symmetry error' 'fractal dimension error' 'worst radius' 'worst texture' 'worst perimeter' 'worst area' 'worst smoothness' 'worst compactness' 'worst concavity' 'worst concave points' 'worst symmetry' 'worst fractal dimension']
در اینجا میتوان همه سی ویژگی یا خصیصهای که هر یک از تومورها دارند را مشاهده کرد. در ادامه، از مقادیر عددی این ویژگیها برای آموزش دادن مدل و انجام پیشبینی صحیح استفاده شده است. این در حالی است که خوشخیم یا بدخیم بودن تومورها بستگی به این ویژگیها دارد.
خروجی قطعه کد بالا در ادامه ارائه شده است.
[[1.799e+01 1.038e+01 1.228e+02 ... 2.654e-01 4.601e-01 1.189e-01] [2.057e+01 1.777e+01 1.329e+02 ... 1.860e-01 2.750e-01 8.902e-02] [1.969e+01 2.125e+01 1.300e+02 ... 2.430e-01 3.613e-01 8.758e-02] ... [1.660e+01 2.808e+01 1.083e+02 ... 1.418e-01 2.218e-01 7.820e-02] [2.060e+01 2.933e+01 1.401e+02 ... 2.650e-01 4.087e-01 1.240e-01] [7.760e+00 2.454e+01 4.792e+01 ... 0.000e+00 2.871e-01 7.039e-02]]
این مجموعه داده بزرگ حاوی همه مقادیر عددی از ۳۰ خصیصه برای همه ۵۶۹ نمونه از دادههای تومور است. بنابراین، با توجه به دادههای بالا، میتوان از دادههای بالا نتیجه گرفت که نمونه اول از تومور بدخیم و دارای میانگین شعاع 1.79900000e+01 است.
گام چهارم: سازماندهی دادهها در مجموعهها
برای تست صحت «دستهبند» (Classifier)، باید مدل را روی دادههای مشاهده نشده اجرا کرد. بنابراین، پیش از ساخت مدل، باید دادهها را به دو مجموعه آموزش و تست تقسیم کرد.
از مجموعه آموزش برای آموزش و ارزیابی مدل استفاده میشود. سپس، از مدل آموزش دیده برای انجام پیشبینی روی دادههای تست دیده نشده (Unseen Test Data) استفاده میشود. در ادامه از ماژول sklearn استفاده شده است که دادهها را به طور خودکار به این دو مجموعه (آموزش و تست) تقسیم میکند.
# importing the function from sklearn.model_selection import train_test_split # splitting the data train, test, train_labels, test_labels = train_test_split(features, labels,
تابع train_test_split() به طور تصادفی دادهها را با استفاده از پارامتر test_size تقسیم میکند. در اینجا، ٪۳۳ از دادهها در مجموعه داده تست قرار گرفتهاند و ٪۶۷ باقیمانده، دادههای آموزش هستند. همچنین، برچسبهای متناظر برای متغیرهای آموزش و تست با عناوین train_labels و test_labels وجود دارد. برای فراگیری بیشتر پیرامون چگونگی استفاده از تابع train_test_split()، میتوان به مستندات رسمی کتابخانه سایکیتلِرن [+] مراجعه کرد.
گام پنجم: ساخت مدل
مدلهای یادگیری ماشین بسیاری وجود دارند که میتوان از آنها برای حل این مساله استفاده کرد. هر یک از این روشها مزایا و معایب خودشان را دارند. برای این مدل، از الگوریتم «بیز ساده» (Naive Bayes) استفاده شده است که معمولا در «دستهبندی دودویی» (Binary Classification) عملکرد خوبی دارد. ابتدا، ماژول GaussianNB «وارد» (Import) و با استفاده از تابع GaussianNB()، مقداردهی اولیه به آن انجام میشود. سپس، مدل با استفاده از دادههای مجموعه داده مورد استفاده و با متد Fit برازش داده میشود.
# importing the module of the machine learning model from sklearn.naive_bayes import GaussianNB # initializing the classifier gnb = GaussianNB() # training the classifier model = gnb.fit(train, train_labels)
پس از آن که آموزش کامل شد، میتوان از مدل آموزش دیده برای انجام پیشبینی روی مجموعه تستی استفاده کرد که برای این کار آماده شده است. برای انجام این کار از تابع توکار predict() استفاده میشود که یک آرایه را از مقادیر پیشبینی شده برای نمونه دادهها در مجموعه تست باز میگرداند. سپس، پیشبینی انجام شده با استفاده از تابع print() چاپ میشود.
خروجی قطعه کد بالا به صورت زیر است.
[1 0 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0 1 1 0 0 0 1 1 1 0 0 1 1 0 1 0 0 1 1 0 0 0 1 1 1 0 1 1 0 0 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0 0 1 1]
از خروجی بالا، میتوان مشاهده کرد که تابع predict() آرایهای از صفرها و یکها را باز میگرداند. این مقادیر، مقادیر پیشبینی شده مجموعه تست از کلاس تومور را نمایش میدهند (خوشخیم یا بدخیم).
گام ششم: ارزیابی صحت مدل آموزش دیده شده
پس از آنکه مقادیر پیشبینی شده فراهم شدند، میتوان صحت مدل را با مقایسه آن با برچسبهای کنونی مجموعه تست مقایسه کرد.
بدین منظور، از تابع توکار accuracy_score() در ماژول sklearn استفاده شده است.
خروجی قطعه کد بالا به صورت زیر است.
0.9414893617021277
بنابراین، مشخص میشود که این دستهبند یادگیری ماشین مبتنی بر الگوریتم نایو بیز دارای صحت ٪۹۴.۱۵ در تعیین خوشخیم یا بدخیم بودن یک تومور است.
- مجموعه آموزشهای دادهکاوی و یادگیری ماشین
- آموزش دادهکاوی (Data Mining) در متلب
- مجموعه آموزشهای آمار و احتمالات
- دادهکاوی (Data Mining) — از صفر تا صد
- یادگیری علم داده (Data Science) با پایتون — از صفر تا صد
- دادهکاوی (Data Mining) و پایتون برای تحلیل چاقی کودکان — راهنمای کاربردی
^^