ML - Hiểu dữ liệu với thống kê

Giới thiệu

Trong khi làm việc với các dự án máy học, chúng tôi thường bỏ qua hai phần quan trọng nhất được gọi là mathematicsdata. Đó là bởi vì, chúng tôi biết rằng ML là một cách tiếp cận theo hướng dữ liệu và mô hình ML của chúng tôi sẽ chỉ tạo ra kết quả tốt hoặc xấu như dữ liệu mà chúng tôi cung cấp cho nó.

Trong chương trước, chúng ta đã thảo luận về cách có thể tải dữ liệu CSV lên dự án ML của mình, nhưng sẽ rất tốt nếu bạn hiểu dữ liệu trước khi tải lên. Chúng ta có thể hiểu dữ liệu bằng hai cách, bằng số liệu thống kê và bằng trực quan.

Trong chương này, với sự trợ giúp của các công thức Python sau đây, chúng ta sẽ hiểu dữ liệu ML với số liệu thống kê.

Xem xét dữ liệu thô

Công thức đầu tiên là xem dữ liệu thô của bạn. Điều quan trọng là phải xem dữ liệu thô bởi vì cái nhìn sâu sắc mà chúng ta có được sau khi xem dữ liệu thô sẽ thúc đẩy cơ hội của chúng ta để xử lý trước cũng như xử lý dữ liệu tốt hơn cho các dự án ML.

Sau đây là một tập lệnh Python được triển khai bằng cách sử dụng hàm head () của Pandas DataFrame trên tập dữ liệu bệnh tiểu đường của người da đỏ Pima để xem 50 hàng đầu tiên để hiểu rõ hơn về nó -

Thí dụ

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

Đầu ra

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

Chúng ta có thể quan sát từ kết quả ở trên rằng cột đầu tiên cung cấp số hàng, điều này có thể rất hữu ích để tham khảo một quan sát cụ thể.

Kiểm tra kích thước dữ liệu

Luôn luôn là một thực tiễn tốt để biết chúng ta đang có bao nhiêu dữ liệu, về hàng và cột cho dự án ML của mình. Những lý do đằng sau là -

  • Giả sử nếu chúng ta có quá nhiều hàng và cột thì sẽ mất nhiều thời gian để chạy thuật toán và đào tạo mô hình.

  • Giả sử nếu chúng ta có quá ít hàng và cột thì chúng ta sẽ không có đủ dữ liệu để đào tạo tốt mô hình.

Sau đây là một tập lệnh Python được triển khai bằng cách in thuộc tính hình dạng trên Khung dữ liệu Pandas. Chúng tôi sẽ triển khai nó trên tập dữ liệu iris để lấy tổng số hàng và cột trong đó.

Thí dụ

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

Đầu ra

(150, 4)

Chúng ta có thể dễ dàng quan sát từ đầu ra mà tập dữ liệu mống mắt, chúng ta sẽ sử dụng, có 150 hàng và 4 cột.

Nhận loại dữ liệu của từng thuộc tính

Một phương pháp hay khác là biết kiểu dữ liệu của từng thuộc tính. Lý do đằng sau là, theo yêu cầu, đôi khi chúng ta có thể cần phải chuyển đổi kiểu dữ liệu này sang kiểu dữ liệu khác. Ví dụ: chúng ta có thể cần chuyển đổi chuỗi thành dấu phẩy động hoặc int để biểu diễn các giá trị phân loại hoặc thứ tự. Chúng ta có thể có ý tưởng về kiểu dữ liệu của thuộc tính bằng cách xem dữ liệu thô, nhưng một cách khác là sử dụng thuộc tính dtypes của Pandas DataFrame. Với sự trợ giúp của thuộc tính dtypes, chúng ta có thể phân loại từng kiểu dữ liệu thuộc tính. Nó có thể được hiểu với sự trợ giúp của tập lệnh Python sau:

Thí dụ

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

Đầu ra

sepal_length  float64
sepal_width   float64
petal_length  float64
petal_width   float64
dtype: object

Từ kết quả trên, chúng ta có thể dễ dàng nhận được các kiểu dữ liệu của từng thuộc tính.

Tóm tắt thống kê dữ liệu

Chúng ta đã thảo luận về công thức Python để có được hình dạng tức là số hàng và cột, của dữ liệu nhưng nhiều lần chúng ta cần xem lại các tóm tắt từ hình dạng dữ liệu đó. Nó có thể được thực hiện với sự trợ giúp của hàm description () của Pandas DataFrame cung cấp thêm 8 thuộc tính thống kê sau của mỗi & mọi thuộc tính dữ liệu -

  • Count
  • Mean
  • Độ lệch chuẩn
  • Giá trị tối thiểu
  • Gia trị lơn nhât
  • 25%
  • Trung bình tức là 50%
  • 75%

Thí dụ

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

Đầu ra

(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

Từ kết quả trên, chúng ta có thể quan sát tóm tắt thống kê dữ liệu của bộ dữ liệu bệnh tiểu đường Ấn Độ Pima cùng với hình dạng của dữ liệu.

Xem xét phân phối lớp học

Thống kê phân phối lớp rất hữu ích trong các bài toán phân loại mà chúng ta cần biết số dư của các giá trị lớp. Điều quan trọng là phải biết phân phối giá trị lớp vì nếu chúng ta có phân phối lớp không cân bằng cao, tức là một lớp có nhiều quan sát hơn lớp khác, thì nó có thể cần xử lý đặc biệt ở giai đoạn chuẩn bị dữ liệu của dự án ML của chúng ta. Chúng ta có thể dễ dàng nhận được phân phối lớp bằng Python với sự trợ giúp của Pandas DataFrame.

Thí dụ

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)

Đầu ra

Class
0  500
1  268
dtype: int64

Từ kết quả trên, có thể thấy rõ rằng số lượng quan sát với lớp 0 gần như gấp đôi số quan sát với lớp 1.

Xem xét mối tương quan giữa các thuộc tính

Mối quan hệ giữa hai biến được gọi là tương quan. Trong thống kê, phương pháp phổ biến nhất để tính toán tương quan là Hệ số tương quan của Pearson. Nó có thể có ba giá trị như sau:

  • Coefficient value = 1 - Nó thể hiện đầy đủ positive tương quan giữa các biến.

  • Coefficient value = -1 - Nó thể hiện đầy đủ negative tương quan giữa các biến.

  • Coefficient value = 0 - Nó đại diện cho no tương quan giữa các biến.

Chúng tôi luôn luôn tốt khi xem xét các mối tương quan từng cặp của các thuộc tính trong tập dữ liệu của mình trước khi sử dụng nó vào dự án ML vì một số thuật toán học máy như hồi quy tuyến tính và hồi quy logistic sẽ hoạt động kém nếu chúng tôi có các thuộc tính tương quan cao. Trong Python, chúng ta có thể dễ dàng tính toán ma trận tương quan của các thuộc tính tập dữ liệu với sự trợ giúp của hàm corr () trên Pandas DataFrame.

Thí dụ

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)

Đầu ra

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

Ma trận ở đầu ra ở trên cho biết mối tương quan giữa tất cả các cặp thuộc tính trong tập dữ liệu.

Xem xét lại phần phân bổ thuộc tính

Độ xiên có thể được định nghĩa là sự phân bố được giả định là Gauss nhưng có vẻ bị bóp méo hoặc dịch chuyển theo hướng này hay hướng khác, hoặc sang trái hoặc phải. Xem xét độ lệch của các thuộc tính là một trong những nhiệm vụ quan trọng do những lý do sau:

  • Sự hiện diện của độ lệch trong dữ liệu đòi hỏi phải hiệu chỉnh ở giai đoạn chuẩn bị dữ liệu để chúng tôi có thể có được độ chính xác hơn từ mô hình của mình.

  • Hầu hết các thuật toán ML giả định rằng dữ liệu có phân phối Gaussian tức là chuẩn của dữ liệu cong hình chuông.

Trong Python, chúng ta có thể dễ dàng tính toán độ lệch của từng thuộc tính bằng cách sử dụng hàm xiên () trên Pandas DataFrame.

Thí dụ

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

Đầu ra

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

Từ đầu ra trên, có thể quan sát được độ lệch âm hoặc dương. Nếu giá trị gần bằng 0 thì nó hiển thị ít lệch hơn.