這幾天在讀石川聰彥寫的 "必學! Pyton 資料科學機器學習最強套件" 這本書時, 在第 12 章看到 Scikit-Learn 內建資料集模組 datasets 裡面有一個 make_blobs() 函式可以用來產生隨機的模擬資料集, 我覺得這很好用, 就動手測試看看, 紀錄如下.
# 必學!Python 資料科學‧機器學習最強套件 (旗標 2021)
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() 用法參考 :
沒有留言 :
張貼留言