ML - การทำความเข้าใจข้อมูลด้วยสถิติ

บทนำ

ในขณะที่ทำงานกับโปรเจ็กต์แมชชีนเลิร์นนิงโดยปกติเราจะละเลยสองส่วนที่สำคัญที่สุดที่เรียกว่า mathematics และ data. เป็นเพราะเรารู้ว่า ML เป็นแนวทางที่ขับเคลื่อนด้วยข้อมูลและแบบจำลอง ML ของเราจะให้ผลลัพธ์ที่ดีหรือไม่ดีเท่ากับข้อมูลที่เราให้ไว้เท่านั้น

ในบทที่แล้วเราได้กล่าวถึงวิธีที่เราสามารถอัปโหลดข้อมูล CSV ไปยังโครงการ ML ของเราได้ แต่จะเป็นการดีที่จะทำความเข้าใจข้อมูลก่อนที่จะอัปโหลด เราสามารถเข้าใจข้อมูลได้สองวิธีด้วยสถิติและด้วยการแสดงภาพ

ในบทนี้ด้วยความช่วยเหลือของการทำตามสูตร Python เราจะทำความเข้าใจกับข้อมูล ML พร้อมสถิติ

ดูข้อมูลดิบ

สูตรแรกคือการดูข้อมูลดิบของคุณ สิ่งสำคัญคือต้องดูข้อมูลดิบเนื่องจากข้อมูลเชิงลึกที่เราจะได้รับหลังจากดูข้อมูลดิบจะช่วยเพิ่มโอกาสในการประมวลผลล่วงหน้าที่ดีขึ้นรวมทั้งการจัดการข้อมูลสำหรับโครงการ ML

ต่อไปนี้เป็นสคริปต์ Python ที่ใช้งานโดยใช้ฟังก์ชัน head () ของ Pandas DataFrame บนชุดข้อมูลโรคเบาหวาน Pima Indians เพื่อดู 50 แถวแรกเพื่อให้เข้าใจได้ดีขึ้น -

ตัวอย่าง

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))

เอาต์พุต

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 ของเราในรูปของแถวและคอลัมน์ เหตุผลเบื้องหลังคือ -

  • สมมติว่าถ้าเรามีแถวและคอลัมน์มากเกินไปก็ต้องใช้เวลานานในการรันอัลกอริทึมและฝึกโมเดล

  • สมมติว่าถ้าเรามีแถวและคอลัมน์น้อยเกินไปเราก็จะไม่มีข้อมูลเพียงพอที่จะฝึกโมเดลได้ดี

ต่อไปนี้เป็นสคริปต์ Python ที่ใช้งานโดยการพิมพ์คุณสมบัติรูปร่างบน Pandas Data Frame เราจะนำไปใช้กับชุดข้อมูลม่านตาเพื่อรับจำนวนแถวและคอลัมน์ทั้งหมดในนั้น

ตัวอย่าง

from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.shape)

เอาต์พุต

(150, 4)

เราสามารถสังเกตได้อย่างง่ายดายจากผลลัพธ์ที่ชุดข้อมูลม่านตาที่เรากำลังจะใช้มี 150 แถวและ 4 คอลัมน์

รับแต่ละประเภทข้อมูลของแอตทริบิวต์

เป็นอีกแนวทางปฏิบัติที่ดีในการทราบประเภทข้อมูลของแต่ละแอตทริบิวต์ เหตุผลเบื้องหลังก็คือตามข้อกำหนดบางครั้งเราอาจต้องแปลงข้อมูลประเภทหนึ่งไปเป็นอีกประเภทหนึ่ง ตัวอย่างเช่นเราอาจต้องแปลงสตริงเป็นทศนิยมหรือ int เพื่อแสดงค่าหมวดหมู่หรือลำดับ เราสามารถมีแนวคิดเกี่ยวกับประเภทข้อมูลของแอตทริบิวต์ได้โดยดูที่ข้อมูลดิบ แต่อีกวิธีหนึ่งคือการใช้คุณสมบัติ dtypes ของ Pandas DataFrame ด้วยความช่วยเหลือของคุณสมบัติ dtypes เราสามารถจัดประเภทข้อมูลแอตทริบิวต์แต่ละประเภทได้ สามารถเข้าใจได้ด้วยความช่วยเหลือของการทำตามสคริปต์ Python -

ตัวอย่าง

from pandas import read_csv
path = r"C:\iris.csv"
data = read_csv(path)
print(data.dtypes)

เอาต์พุต

sepal_length  float64
sepal_width   float64
petal_length  float64
petal_width   float64
dtype: object

จากผลลัพธ์ข้างต้นเราสามารถรับประเภทข้อมูลของแต่ละแอตทริบิวต์ได้อย่างง่ายดาย

สรุปข้อมูลทางสถิติ

เราได้พูดถึงสูตร Python เพื่อให้ได้รูปร่างเช่นจำนวนแถวและคอลัมน์ของข้อมูล แต่หลายครั้งเราจำเป็นต้องตรวจสอบข้อมูลสรุปจากรูปร่างของข้อมูลนั้น สามารถทำได้ด้วยความช่วยเหลือของฟังก์ชัน description () ของ Pandas DataFrame ที่ให้คุณสมบัติทางสถิติ 8 ประการต่อไปนี้ของแอตทริบิวต์ข้อมูลแต่ละรายการ -

  • Count
  • Mean
  • ส่วนเบี่ยงเบนมาตรฐาน
  • มูลค่าขั้นต่ำ
  • ค่าสูงสุด
  • 25%
  • มัธยฐานคือ 50%
  • 75%

ตัวอย่าง

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())

เอาต์พุต

(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 Diabetes พร้อมกับรูปร่างของข้อมูล

การตรวจสอบการกระจายคลาส

สถิติการแจกแจงคลาสมีประโยชน์ในปัญหาการจำแนกประเภทที่เราต้องทราบความสมดุลของค่าคลาส สิ่งสำคัญคือต้องทราบการแจกแจงค่าคลาสเพราะถ้าเรามีการแจกแจงคลาสที่ไม่สมดุลกันอย่างมากเช่นคลาสหนึ่งมีการสังเกตมากกว่าคลาสอื่น ๆ ก็อาจต้องมีการจัดการพิเศษในขั้นตอนการเตรียมข้อมูลของโปรเจ็กต์ ML เราสามารถรับการกระจายคลาสใน Python ได้อย่างง่ายดายด้วยความช่วยเหลือของ Pandas DataFrame

ตัวอย่าง

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)

เอาต์พุต

Class
0  500
1  268
dtype: int64

จากผลลัพธ์ข้างต้นจะเห็นได้ชัดเจนว่าจำนวนการสังเกตที่มีคลาส 0 นั้นมีมากกว่าจำนวนการสังเกตการณ์คลาส 1 เกือบสองเท่า

การตรวจสอบความสัมพันธ์ระหว่างแอตทริบิวต์

ความสัมพันธ์ระหว่างสองตัวแปรเรียกว่าสหสัมพันธ์ ในทางสถิติวิธีการคำนวณสหสัมพันธ์โดยทั่วไปคือค่าสัมประสิทธิ์สหสัมพันธ์ของเพียร์สัน สามารถมีสามค่าดังนี้ -

  • Coefficient value = 1 - แสดงถึงความเต็ม positive ความสัมพันธ์ระหว่างตัวแปร

  • Coefficient value = -1 - แสดงถึงความเต็ม negative ความสัมพันธ์ระหว่างตัวแปร

  • Coefficient value = 0 - แสดงถึง no ความสัมพันธ์ระหว่างตัวแปร

เป็นเรื่องดีเสมอที่เราจะตรวจสอบความสัมพันธ์แบบคู่ของแอตทริบิวต์ในชุดข้อมูลของเราก่อนที่จะใช้ในโครงการ ML เนื่องจากอัลกอริทึมการเรียนรู้ของเครื่องบางอย่างเช่นการถดถอยเชิงเส้นและการถดถอยโลจิสติกจะทำงานได้ไม่ดีหากเรามีคุณลักษณะที่มีความสัมพันธ์กันสูง ใน Python เราสามารถคำนวณเมทริกซ์สหสัมพันธ์ของแอตทริบิวต์ชุดข้อมูลด้วยความช่วยเหลือของฟังก์ชัน corr () บน Pandas DataFrame

ตัวอย่าง

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)

เอาต์พุต

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

เมทริกซ์ในเอาต์พุตด้านบนให้ความสัมพันธ์ระหว่างคู่ทั้งหมดของแอตทริบิวต์ในชุดข้อมูล

ตรวจสอบความเบ้ของการกระจายคุณสมบัติ

ความเบ้อาจหมายถึงการกระจายที่สมมติว่าเป็น Gaussian แต่ดูเหมือนจะบิดเบี้ยวหรือเลื่อนไปในทิศทางใดทิศทางหนึ่งหรือไปทางซ้ายหรือขวา การตรวจสอบความเบ้ของแอตทริบิวต์เป็นงานที่สำคัญอย่างหนึ่งเนื่องจากเหตุผลดังต่อไปนี้ -

  • การมีข้อมูลที่บิดเบือนจำเป็นต้องมีการแก้ไขในขั้นตอนการเตรียมข้อมูลเพื่อให้เราได้รับความแม่นยำมากขึ้นจากแบบจำลองของเรา

  • อัลกอริทึม ML ส่วนใหญ่ถือว่าข้อมูลมีการแจกแจงแบบเกาส์เช่นปกติของข้อมูลโค้งกระดิ่ง

ใน Python เราสามารถคำนวณความเบ้ของแต่ละแอตทริบิวต์โดยใช้ฟังก์ชัน skew () บน Pandas DataFrame

ตัวอย่าง

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())

เอาต์พุต

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

จากผลลัพธ์ข้างต้นสามารถสังเกตความเบ้บวกหรือลบได้ หากค่าใกล้เคียงกับศูนย์แสดงว่าเบ้น้อยลง