آموزش درک داده ها با آمار در یادگیری ماشین
آموزش درک داده ها با آمار در یادگیری ماشین
در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش درک داده ها با آمار در یادگیری ماشین خواهیم پرداخت.
پیشنهاد ویژه : پکیج آموزش طراحی وب سایت با پایتون و جنگو
در حالی که با پروژه های یادگیری ماشین کار می کنیم، معمولاً دو بخش مهم به نام ریاضیات و داده ها را نادیده می گیریم. به این دلیل است که ما می دانیم که ML یک رویکرد داده محور است و مدل ML ما فقط به عنوان داده های خوب یا بد نتایج داده شده در اختیار ما قرار می دهد.
در درس قبل، ما در مورد چگونگی بارگذاری داده های CSV در پروژه ML خود بحث کردیم ، اما بهتر است قبل از بارگذاری داده ها، داده ها را درک کنیم. ما می توانیم داده ها را از دو طریق ، با آمار و با تجسم درک کنیم.
در این درس، با کمک دستورالعمل های پایتون ، می خواهیم داده های ML را با آمار درک کنیم.
نگاهی به داده های خام
اولین دستورالعمل این است که به داده های خام خود نگاه کنید. مهم است که به داده های خام توجه شود زیرا بینشی که پس از بررسی داده های خام به دست خواهیم آورد ، شانس ما را برای پیش پردازش بهتر و همچنین کار با داده ها برای پروژه های ML افزایش می دهد.
در زیر اسکریپت پایتون با استفاده از تابع head() Pandas DataFrame در مجموعه داده های دیابت Pima Indians برای بررسی 50 ردیف اول برای درک بهتر از آن پیاده سازی شده است –
مثال
1 2 3 4 5 |
from pandas import read_csv path = r"C:\pima-indians-diabetes.csv" headernames = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] data = read_csv(path, names=headernames) print(data.head(50)) |
خروجی
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
preg plas pres skin test mass pedi age class 0 6 148 72 35 0 33.6 0.627 50 1 1 1 85 66 29 0 26.6 0.351 31 0 2 8 183 64 0 0 23.3 0.672 32 1 3 1 89 66 23 94 28.1 0.167 21 0 4 0 137 40 35 168 43.1 2.288 33 1 5 5 116 74 0 0 25.6 0.201 30 0 6 3 78 50 32 88 31.0 0.248 26 1 7 10 115 0 0 0 35.3 0.134 29 0 8 2 197 70 45 543 30.5 0.158 53 1 9 8 125 96 0 0 0.0 0.232 54 1 10 4 110 92 0 0 37.6 0.191 30 0 11 10 168 74 0 0 38.0 0.537 34 1 12 10 139 80 0 0 27.1 1.441 57 0 13 1 189 60 23 846 30.1 0.398 59 1 14 5 166 72 19 175 25.8 0.587 51 1 15 7 100 0 0 0 30.0 0.484 32 1 16 0 118 84 47 230 45.8 0.551 31 1 17 7 107 74 0 0 29.6 0.254 31 1 18 1 103 30 38 83 43.3 0.183 33 0 19 1 115 70 30 96 34.6 0.529 32 1 20 3 126 88 41 235 39.3 0.704 27 0 21 8 99 84 0 0 35.4 0.388 50 0 22 7 196 90 0 0 39.8 0.451 41 1 23 9 119 80 35 0 29.0 0.263 29 1 24 11 143 94 33 146 36.6 0.254 51 1 25 10 125 70 26 115 31.1 0.205 41 1 26 7 147 76 0 0 39.4 0.257 43 1 27 1 97 66 15 140 23.2 0.487 22 0 28 13 145 82 19 110 22.2 0.245 57 0 29 5 117 92 0 0 34.1 0.337 38 0 30 5 109 75 26 0 36.0 0.546 60 0 31 3 158 76 36 245 31.6 0.851 28 1 32 3 88 58 11 54 24.8 0.267 22 0 33 6 92 92 0 0 19.9 0.188 28 0 34 10 122 78 31 0 27.6 0.512 45 0 35 4 103 60 33 192 24.0 0.966 33 0 36 11 138 76 0 0 33.2 0.420 35 0 37 9 102 76 37 0 32.9 0.665 46 1 38 2 90 68 42 0 38.2 0.503 27 1 39 4 111 72 47 207 37.1 1.390 56 1 40 3 180 64 25 70 34.0 0.271 26 0 41 7 133 84 0 0 40.2 0.696 37 0 42 7 106 92 18 0 22.7 0.235 48 0 43 9 171 110 24 240 45.4 0.721 54 1 44 7 159 64 0 0 27.4 0.294 40 0 45 0 180 66 39 0 42.0 1.893 25 1 46 1 146 56 0 0 29.7 0.564 29 0 47 2 71 70 27 0 28.0 0.586 22 0 48 7 103 66 32 0 39.1 0.344 31 1 49 7 105 0 0 0 0.0 0.305 24 0 |
ما می توانیم از خروجی فوق مشاهده کنیم که ستون اول شماره ردیف را می دهد که می تواند برای ارجاع به یک مشاهده خاص بسیار مفید باشد.
بررسی ابعاد داده ها
این همیشه یک روش خوب است که بدانیم چه مقدار داده از نظر ردیف و ستون برای پروژه ML خود داریم. دلایل وجود دارد –
- فرض کنید اگر تعداد زیادی ردیف و ستون داشته باشیم، اجرای الگوریتم و آموزش مدل زمان زیادی طول می کشد.
- فرض کنید اگر ردیف و ستون خیلی کمتری داشته باشیم، داده های کافی برای آموزش مناسب مدل نداریم.
در زیر یک اسکریپت پایتون با چاپ ویژگی شکل روی Pandas Data Frame پیاده سازی شده است. ما می خواهیم آن را در مجموعه داده های iris برای بدست آوردن تعداد کل ردیف ها و ستون ها در آن پیاده سازی کنیم.
مثال
1 2 3 4 |
from pandas import read_csv path = r"C:\iris.csv" data = read_csv(path) print(data.shape) |
خروجی
1 |
(150 ، 4) |
ما می توانیم به راحتی از خروجی مشاهده کنیم که مجموعه داده های عنبیه ، که قصد استفاده از آن را داریم ، دارای 150 ردیف و 4 ستون است.
دریافت ویژگی هر نوع داده
این یک روش خوب دیگر است که ویژگی هر نوع داده را بدانید. دلیل این امر این است که ، در صورت نیاز ، گاهی اوقات ممکن است نیاز به تبدیل یک نوع داده به نوع دیگر داشته باشیم. به عنوان مثال، برای نمایش مقادیر دسته ای یا ترتیبی ممکن است لازم باشد رشته را به نقطه شناور یا int تبدیل کنیم. با مشاهده داده های خام می توانیم در مورد نوع داده صفت ایده داشته باشیم ، اما روش دیگر استفاده از ویژگی dtypes Pandas DataFrame است. با کمک ویژگی dtypes می توانیم هر نوع ویژگی را نوع داده طبقه بندی کنیم. این را می توان با کمک دنبال کردن اسکریپت پایتون درک کرد –
مثال
1 2 3 4 |
from pandas import read_csv path = r"C:\iris.csv" data = read_csv(path) print(data.dtypes) |
خروجی
1 2 3 4 5 |
sepal_length float64 sepal_width float64 petal_length float64 petal_width float64 dtype: object |
از خروجی فوق می توانیم به راحتی نوع داده های هر ویژگی را بدست آوریم.
خلاصه آماری داده ها
ما دستور پایتون را برای بدست آوردن شکل، یعنی تعداد ردیف ها و ستون ها ، در مورد داده ها بحث کرده ایم ، اما بارها لازم است که خلاصه های خارج از آن شکل داده ها را مرور کنیم. این کار با کمک تابع توصیف ()Pandas DataFrame ،describe انجام می شود که علاوه بر این 8 ویژگی آماری زیر از هر ویژگی داده را فراهم می کند –
- شمردن
- میانگین
- انحراف معیار
- حداقل مقدار
- حداکثر مقدار
- 25٪
- متوسط ؛ 50٪
- 75٪
مثال
1 2 3 4 5 6 7 8 9 |
from pandas import read_csv from pandas import set_option path = r"C:\pima-indians-diabetes.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] data = read_csv(path, names=names) set_option('display.width', 100) set_option('precision', 2) print(data.shape) print(data.describe()) |
خروجی
1 2 3 4 5 6 7 8 9 10 |
(768, 9) preg plas pres skin test mass pedi age class count 768.00 768.00 768.00 768.00 768.00 768.00 768.00 768.00 768.00 mean 3.85 120.89 69.11 20.54 79.80 31.99 0.47 33.24 0.35 std 3.37 31.97 19.36 15.95 115.24 7.88 0.33 11.76 0.48 min 0.00 0.00 0.00 0.00 0.00 0.00 0.08 21.00 0.00 25% 1.00 99.00 62.00 0.00 0.00 27.30 0.24 24.00 0.00 50% 3.00 117.00 72.00 23.00 30.50 32.00 0.37 29.00 0.00 75% 6.00 140.25 80.00 32.00 127.25 36.60 0.63 41.00 1.00 max 17.00 199.00 122.00 99.00 846.00 67.10 2.42 81.00 1.00 |
از خروجی فوق، می توان خلاصه آماری داده های مجموعه داده های دیابت Pima Indian به همراه شکل داده ها را مشاهده کرد.
مرور توزیع کلاس
آمار توزیع کلاس در موارد طبقه بندی مفید است که ما باید تعادل مقادیر کلاس را بدانیم. دانستن توزیع مقدار کلاس از اهمیت زیادی برخوردار است زیرا اگر توزیع کلاس بسیار ناموزونی داشته باشیم یعنی یک کلاس مشاهدات بیشتری نسبت به کلاس دیگر داشته باشد ، در این صورت ممکن است در مرحله آماده سازی داده های پروژه ML به مدیریت خاص نیاز داشته باشد. ما می توانیم به راحتی با کمک Pandas DataFrame توزیع کلاس را در پایتون بدست آوریم.
مثال
1 2 3 4 5 6 |
from pandas import read_csv path = r"C:\pima-indians-diabetes.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] data = read_csv(path, names=names) count_class = data.groupby('class').size() print(count_class) |
خروجی
1 2 3 4 |
Class 0 500 1 268 dtype: int64 |
از خروجی فوق به وضوح مشاهده می شود که تعداد مشاهدات با کلاس 0 تقریباً دو برابر تعداد مشاهدات با کلاس 1 است.
بررسی همبستگی بین ویژگی ها
رابطه بین دو متغیر را همبستگی می نامند. در آمار، متداول ترین روش برای محاسبه همبستگی ضریب همبستگی پیرسون است. این می تواند سه مقدار به شرح زیر داشته باشد –
- مقدار ضریب = 1 – این نشان دهنده همبستگی کامل مثبت بین متغیرها است.
- مقدار ضریب = -1 – این نشان دهنده ارتباط منفی کامل بین متغیرها است.
- مقدار ضریب = 0 – این هیچ ارتباطی بین متغیرها ندارد.
همیشه برای ما خوب است که همبستگی های دوتایی ویژگی ها را در مجموعه داده خود قبل از استفاده در پروژه ML بررسی کنیم زیرا برخی از الگوریتم های یادگیری ماشین مانند رگرسیون خطی و رگرسیون لجستیک اگر ویژگی های بسیار همبستگی داشته باشیم عملکرد ضعیفی دارند. در پایتون ، ما می توانیم به راحتی یک ماتریس همبستگی از ویژگیهای مجموعه داده را با کمک تابع ()corr در Pandas DataFrame محاسبه کنیم.
مثال
1 2 3 4 5 6 7 8 9 |
from pandas import read_csv from pandas import set_option path = r"C:\pima-indians-diabetes.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] data = read_csv(path, names=names) set_option('display.width', 100) set_option('precision', 2) correlations = data.corr(method='pearson') print(correlations) |
خروجی
1 2 3 4 5 6 7 8 9 10 |
preg plas pres skin test mass pedi age class preg 1.00 0.13 0.14 -0.08 -0.07 0.02 -0.03 0.54 0.22 plas 0.13 1.00 0.15 0.06 0.33 0.22 0.14 0.26 0.47 pres 0.14 0.15 1.00 0.21 0.09 0.28 0.04 0.24 0.07 skin -0.08 0.06 0.21 1.00 0.44 0.39 0.18 -0.11 0.07 test -0.07 0.33 0.09 0.44 1.00 0.20 0.19 -0.04 0.13 mass 0.02 0.22 0.28 0.39 0.20 1.00 0.14 0.04 0.29 pedi -0.03 0.14 0.04 0.18 0.19 0.14 1.00 0.03 0.17 age 0.54 0.26 0.24 -0.11 -0.04 0.04 0.03 1.00 0.24 class 0.22 0.47 0.07 0.07 0.13 0.29 0.17 0.24 1.00 |
ماتریس موجود در خروجی فوق همبستگی بین همه جفت های ویژگی را در مجموعه داده ارائه می دهد.
بازبینی Skew توزیع ویژگی
Skew ممکن است به توزیعی گفته شود که گاوسی فرض شده باشد اما به نظر می رسد در یک جهت یا جهت دیگر، یا به سمت چپ یا راست تحریف شده باشد. بازبینی خصوصیات یکی از مهمترین وظایف به دلایل زیر است –
وجود انحراف در داده ها نیاز به اصلاح در مرحله آماده سازی داده ها دارد تا بتوانیم دقت بیشتری را از مدل خود بدست آوریم.
بیشتر الگوریتم های ML فرض می کنند که داده ها دارای توزیع گاوسی هستند ، یعنی از داده های منحنی زنگ نرمال هستند.
در پایتون ، ما می توانیم به راحتی کجی هر ویژگی را با استفاده از تابع ()skew در Pandas DataFrame محاسبه کنیم.
مثال
1 2 3 4 5 |
from pandas import read_csv path = r"C:\pima-indians-diabetes.csv" names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] data = read_csv(path, names=names) print(data.skew()) |
خروجی
1 2 3 4 5 6 7 8 9 10 |
preg 0.90 plas 0.17 pres -1.84 skin 0.11 test 2.27 mass -0.43 pedi 1.92 age 1.13 class 0.64 dtype: float64 |
از خروجی فوق می توان انحراف مثبت یا منفی را مشاهده کرد. اگر مقدار نزدیک به صفر باشد، انحراف کمتری نشان می دهد.
دیدگاه شما