機器學習 - 資料理解



在處理機器學習專案時,通常我們會忽略兩個最重要的部分,即數學資料。資料理解在 ML 中成為一個關鍵步驟的原因在於其資料驅動的方法。我們的 ML 模型產生的結果只會與我們提供給它的資料一樣好或一樣壞。

資料理解基本上涉及分析和探索資料,以識別可能存在的任何模式或趨勢。

資料理解階段通常包括以下步驟:

  • 資料收集 - 這涉及收集您將用於分析的相關資料。資料可以從各種來源收集,例如資料庫、網站和 API。

  • 資料清洗 - 這涉及透過去除任何不相關或重複的資料以及處理缺失資料值來清理資料。資料應以易於分析的方式進行格式化。

  • 資料探索 - 這涉及探索資料以識別可能存在的任何模式或趨勢。這可以使用各種統計技術來完成,例如直方圖、散點圖和相關分析。

  • 資料視覺化 - 這涉及建立資料的視覺表示以幫助您更好地理解它。這可以使用諸如圖形、圖表和地圖之類的工具來完成。

  • 資料預處理 - 這涉及轉換資料,使其適合用於機器學習演算法。這可能包括縮放資料、將其轉換為不同的格式或降低其維度。

在 ML 專案中上傳資料之前,請先了解資料

在將資料上傳到 ML 專案之前瞭解我們的資料非常重要,原因如下:

識別資料質量問題

通過了解您的資料,您可以識別可能影響 ML 模型效能的資料質量問題,例如缺失值、異常值、不正確的資料型別和不一致性。透過解決這些問題,您可以提高模型的質量和準確性。

確定資料相關性

您可以確定您收集的資料是否與您試圖解決的問題相關。通過了解您的資料,您可以確定哪些特徵對您的模型很重要,哪些特徵可以忽略。

選擇合適的 ML 技術

根據資料的特性,您可能需要選擇特定的 ML 技術或演算法。例如,如果您的資料是分類的,您可能需要使用分類技術,而如果您的資料是連續的,您可能需要使用迴歸技術。瞭解您的資料可以幫助您為您的問題選擇合適的 ML 技術。

提高模型效能

通過了解您的資料,您可以設計新的特徵、預處理您的資料並選擇合適的 ML 技術來提高模型的效能。這可以帶來更好的準確性、精確率、召回率和 F1 分數。

使用統計學理解資料

在上一章中,我們討論瞭如何將 CSV 資料上傳到我們的 ML 專案中,但在上傳之前瞭解資料會更好。我們可以透過兩種方式瞭解資料,一種是使用統計學,另一種是使用視覺化。

在本章中,我們將藉助以下 Python 示例來使用統計學方法理解 ML 資料。

檢視原始資料

第一個示例是檢視您的原始資料。檢視原始資料非常重要,因為我們在檢視原始資料後獲得的洞察力將提高我們更好地進行預處理以及處理 ML 專案資料的可能性。

以下是使用 Pandas DataFrame 的 head() 函式在 Pima 印第安人糖尿病資料集上實現的 Python 指令碼,用於檢視前 10 行以更好地瞭解它:

示例

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

輸出

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

從以上輸出中我們可以觀察到,第一列給出了行號,這對於引用特定觀察結果非常有用。

檢查資料的維度

瞭解 ML 專案有多少資料(以行和列表示)始終是一個好習慣。其背後的原因是:

  • 如果我們有太多行和列,則演算法執行和模型訓練將需要很長時間。

  • 如果我們有太少的行和列,則我們就沒有足夠的資料來很好地訓練模型。

以下是透過在 Pandas DataFrame 上列印 shape 屬性實現的 Python 指令碼。我們將它應用於 iris 資料集,以獲取其中行和列的總數。

示例

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

輸出

(150, 4)

我們可以很容易地從輸出中觀察到,我們將要使用的 iris 資料集有 150 行和 4 列。

獲取每個屬性的資料型別

瞭解每個屬性的資料型別是另一個好習慣。其背後的原因是,根據需要,我們有時可能需要將一種資料型別轉換為另一種資料型別。例如,我們可能需要將字串轉換為浮點數或整數以表示分類或序數值。我們可以透過檢視原始資料來了解屬性的資料型別,但另一種方法是使用 Pandas DataFrame 的 dtypes 屬性。藉助 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 示例,但很多時候我們需要檢視該形狀之外的資料摘要。這可以透過 Pandas DataFrame 的 describe() 函式來完成,該函式進一步提供了每個資料屬性的以下 8 個統計屬性:

  • 計數
  • 均值
  • 標準差
  • 最小值
  • 最大值
  • 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印第安人糖尿病資料集的資料統計摘要以及資料的形狀。

檢視類別分佈

類別分佈統計在分類問題中非常有用,在這些問題中我們需要了解類別值的平衡情況。瞭解類別值分佈非常重要,因為如果我們有高度不平衡的類別分佈,即一個類別的觀測值遠多於其他類別,那麼在機器學習專案的“資料準備”階段可能需要進行特殊處理。藉助Pandas DataFrame,我們可以輕鬆地獲取Python中的類別分佈。

示例

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的觀測值數量的兩倍。

檢視屬性之間的相關性

兩個變數之間的關係稱為相關性。在統計學中,計算相關性的最常用方法是皮爾遜相關係數。它可以有以下三個值:

  • 係數值為1 - 表示變數之間存在完全相關。

  • 係數值為-1 - 表示變數之間存在完全相關。

  • 係數值為0 - 表示變數之間不存在相關性。

在將資料集用於機器學習專案之前,審查資料集中的屬性的兩兩相關性始終是一個好習慣,因為如果存在高度相關的屬性,一些機器學習演算法(如線性迴歸和邏輯迴歸)的效能會很差。在Python中,我們可以藉助Pandas DataFrame上的corr()函式輕鬆地計算資料集屬性的相關矩陣。

示例

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

以上輸出中的矩陣給出了資料集中所有屬性對之間的相關性。

檢視屬性分佈的偏度

偏度可以定義為假設為高斯分佈但看起來在一個方向或另一個方向(向左或向右)扭曲或偏移的分佈。由於以下原因,檢視屬性的偏度是一項重要的任務:

  • 資料中存在偏度需要在資料準備階段進行校正,以便我們可以從模型中獲得更高的準確性。

  • 大多數機器學習演算法假設資料服從高斯分佈,即正態分佈或鐘形曲線資料。

在Python中,我們可以透過在Pandas DataFrame上使用skew()函式輕鬆地計算每個屬性的偏度。

示例

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

從以上輸出中,可以觀察到正偏度或負偏度。如果值接近於零,則表示偏度較小。

廣告

© . All rights reserved.