2023年12月7日 星期四

Python 學習筆記 : 用 Scikit-learn 的 make_blobs() 產生模擬資料集

這幾天在讀石川聰彥寫的 "必學! Pyton 資料科學機器學習最強套件" 這本書時, 在第 12 章看到 Scikit-Learn 內建資料集模組 datasets 裡面有一個 make_blobs() 函式可以用來產生隨機的模擬資料集, 我覺得這很好用, 就動手測試看看, 紀錄如下.  



Source : 博客來


make_blobs() 是 sklearn.datasets 模組裡面的函式, 使用前要先匯入 :

from sklearn.datasets import make_blobs   

此函式可傳入 4 個參數來產生隨機的模擬資料集 :

make_blobs(n_samples, n_features, centers [, random_state])

參數說明如下 :
  • n_samples : 欲產生的資料筆數
  • n_features : 特徵 (變數) 個數
  • centers : 資料的群數
  • random_state : 隨機種子
其中 centers 為資料的群數, 即標籤之數量, 例如 centers=2 則標籤為 [0, 1]; 若 centers=4, 則標籤為 [0, 1, 2, 3] 依此類推. random_state 參數可有可無, 指定隨機種子主要是固定亂數產出規則, 使每次產出的結果都一樣 (程式員常用 42, 這是有典故的). 

Python 3.11.3 (C:/Python311/python.exe)
>>> from sklearn.datasets import make_blobs    

先產出 10 筆隨機紀錄來檢視 :

>>> X, y=make_blobs(n_samples=10, n_features=2, centers=2, random_state=0)    

這會產生 10 筆有兩個特徵與兩個資料群的模擬資料集, 傳回值為一個兩元素的 tuple, 第一個元素為特徵資料, 第二元素為標籤資料 :

>>> X        # 特徵資料
array([[ 1.12031365,  5.75806083],
       [-0.49772229,  1.55128226],
       [ 1.9263585 ,  4.15243012],
       [ 2.49913075,  1.23133799],
       [ 3.54934659,  0.6925054 ],
       [ 1.7373078 ,  4.42546234],
       [ 2.91970372,  0.15549864],
       [ 2.84382807,  3.32650945],
       [ 0.87305123,  4.71438583],
       [ 2.36833522,  0.04356792]])
>>> y        # 標籤資料
array([0, 1, 0, 1, 1, 0, 1, 0, 0, 1])

可見因為 centers 參數設為 2, 標籤只有 0, 1 兩種 (即資料分成兩類). 

接著用 500 筆資料來繪分布圖 :
 
>>> from sklearn.datasets import make_blobs  
>>> import matplotlib.pyplot as plt 
>>> X, y=make_blobs(n_samples=10, n_features=2, centers=2)  
>>> X, y=make_blobs(n_samples=500, n_features=2, centers=2, random_state=0)   

檢視特徵資料 (500 筆) :

>>> X  
array([[ 3.79956040e-01,  4.25122003e+00],
       [ 2.23919302e+00,  5.12173900e-01],
       [ 5.76821049e-01,  4.67384322e+00],
       [ 2.70899127e+00,  4.98828843e+00],
       [ 3.01596092e+00,  2.22672651e+00],
       ...... (略) ....

檢視標籤 (500 筆) : : 

>>> y   
array([0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1,
       1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0,
       1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1,
       ...... (略) ....

繪製兩個特徵的分布圖, 因為橫軸與縱軸都需要一個列向量, 所以要將 500*2 的 X 陣列轉置為 2*500 的陣列, 這樣 X[0] 與 X[1] 就是 1*500 的列向量了 : 

>>> plt.scatter(X.T[0], X.T[1], c=y, cmap='Dark2')   
<matplotlib.collections.PathCollection object at 0x000001CA315F0B10>
>>> plt.grid(True)     
>>> plt.show()     

此處分布圖以 X.T[0] 為 X 軸, X.T[1] 當縱軸, 資料點樣式參數 C 就指定為標籤 y, 這樣同群的資料點樣式就會相同, 色系 cmap 指定為 'Dark2', 結果如下 :




以上測試數據與書中範例相同 (主要是因 randon_state 都設為 0). 

關於 Matplotlib 散布圖函式 scatter() 用法參考 :


沒有留言 :