首頁(yè) > AI資訊 > 最新資訊 > 機(jī)器學(xué)習(xí)完全指南:如何用Python生成合成數(shù)據(jù)集?

機(jī)器學(xué)習(xí)完全指南:如何用Python生成合成數(shù)據(jù)集?

新火種    2023-11-03

編者按:機(jī)器學(xué)習(xí)在越來越多的領(lǐng)域中凸顯出其不可替代的重要性,人們開始從各領(lǐng)域滲透機(jī)器學(xué)習(xí)的典型案例,希望其大規(guī)模投入使用,而數(shù)據(jù)集對(duì)機(jī)器學(xué)習(xí)的效果起了決定性作用。這篇文章,原標(biāo)題是How to Make Synthetic Datasets with Python: A Complete Guide for Machine Learning,作者Dario Rade?i?在文中主要介紹了如何用Python生成合成數(shù)據(jù)集,希望對(duì)你有所幫助。

推薦閱讀:2021 年你應(yīng)該學(xué)會(huì)的 5 個(gè) Python 小技巧

圖片來源:Pexels.com @Christina Morillo

我們總是很難找到好的數(shù)據(jù)集。有時(shí)候,你可能只想提出一個(gè)觀點(diǎn)。在這些情況下,繁瑣的加載和準(zhǔn)備工作則會(huì)顯得有點(diǎn)多。

在這篇文章中,我將跟大家分享如何用Python和Scikit-Learn(一個(gè)非常好的機(jī)器學(xué)習(xí)庫(kù))生成合成數(shù)據(jù)集。此外,你還將了解如何處理噪聲,類別平衡和類分離等內(nèi)容。

懶人目錄

生成你的第一個(gè)合成數(shù)據(jù)集

添加噪聲

調(diào)整類別平衡

調(diào)整類分離

生成你的第一個(gè)合成數(shù)據(jù)集

對(duì)于概念和想法展示而言,現(xiàn)實(shí)世界中的數(shù)據(jù)集總是盈千累萬。

假設(shè)你想要直觀地解釋SMOTE算法(一種處理類別平衡的技術(shù))。首先,你必須找到一個(gè)類別不平衡的數(shù)據(jù)集,并且把它映射到二維或三維空間上,以便于可視化工作。

當(dāng)然,還有更好的解決方案。

Scikit-Learn庫(kù)附帶了一個(gè)方便的make_classification()函數(shù)。雖然這個(gè)函數(shù)不是唯一一個(gè)生成合成數(shù)據(jù)集的函數(shù),但你在如今必然會(huì)頻繁地使用它。

這個(gè)函數(shù)接受各種參數(shù),可以讓你控制數(shù)據(jù)集的具體信息,下文中會(huì)進(jìn)一步介紹。

首先,你需要導(dǎo)入所需的庫(kù)。你可以參考以下代碼段:

import numpy as npimport pandas as pdfrom sklearn.datasets import make_classificationimport matplotlib.pyplot as pltfrom matplotlib import rcParamsrcParams['axes.spines.top'] = FalsercParams['axes.spines.right'] = False

你將開始生成自己的第一個(gè)數(shù)據(jù)集。

這個(gè)數(shù)據(jù)集有1000個(gè)樣本,這些樣本被分為0和1兩類,為了確保樣本類別平衡,每一類的占比都是50%。

每個(gè)類別的所有樣本都以一個(gè)單獨(dú)的簇為中心。為了提高可視化效果,該數(shù)據(jù)集只有兩個(gè)特征:

X, y = make_classification( n_samples=1000, n_features=2, n_redundant=0, n_clusters_per_class=1, random_state=42)df = pd.concat([pd.DataFrame(X), pd.Series(y)], axis=1)df.columns = ['x1', 'x2', 'y']# 5 random rowsdf.sample(5)

調(diào)用sample()函數(shù)可以列出五個(gè)隨機(jī)的數(shù)據(jù)點(diǎn):

圖片來源:Dario Rade?i?

這五個(gè)隨機(jī)數(shù)據(jù)點(diǎn)還無法提供數(shù)據(jù)集背后的完整信息。該數(shù)據(jù)集是二維的,所以你可以聲明一個(gè)用于數(shù)據(jù)可視化的函數(shù)。比如,你可以聲明這樣一個(gè)函數(shù):

def plot(df: pd.DataFrame, x1: str, x2: str, y: str, title: str = '', save: bool = False, figname='figure.png'): plt.figure(figsize=(14, 7)) plt.scatter(x=df[df[y] == 0][x1], y=df[df[y] == 0][x2], label='y = 0') plt.scatter(x=df[df[y] == 1][x1], y=df[df[y] == 1][x2], label='y = 1') plt.title(title, fontsize=20) plt.legend() if save: plt.savefig(figname, dpi=300, bbox_inches='tight', pad_inches=0) plt.show()plot(df=df, x1='x1', x2='x2', y='y', title='Dataset with 2 classes')

這是該數(shù)據(jù)集可視化之后的效果:

圖2:合成數(shù)據(jù)集的可視化效果。圖片來源:Dario Rade?i?

整個(gè)過程十分迅速!你現(xiàn)在擁有一個(gè)簡(jiǎn)單的能夠自行處理的合成數(shù)據(jù)集。接下來,你將學(xué)習(xí)如何添加一些噪聲。

添加噪聲

你可以使用make_classification()函數(shù)的flip_y參數(shù)來添加噪聲。

這個(gè)參數(shù)代表y(每一個(gè)樣本中的類成員的整數(shù)標(biāo)簽)噪聲值的比重。更大的值可以將噪聲引入到標(biāo)簽中,并且使得分類任務(wù)更加困難。

值得注意的是,在某些情況下,默認(rèn)設(shè)置flip_y > 0可能會(huì)導(dǎo)致y中缺少n_classes(類別數(shù)量)。

下面是使用該參數(shù)處理我們的數(shù)據(jù)集,為其添加噪聲的演示:

X, y = make_classification( n_samples=1000, n_features=2, n_redundant=0, n_clusters_per_class=1, flip_y=0.15, random_state=42)df = pd.concat([pd.DataFrame(X), pd.Series(y)], axis=1)df.columns = ['x1', 'x2', 'y']plot(df=df, x1='x1', x2='x2', y='y', title='Dataset with 2 classes - Added noise')

下圖是對(duì)應(yīng)的可視化效果。

圖3:在合成數(shù)據(jù)中添加噪聲的可視化效果。圖片來源:Dario Rade?i?

你能看見藍(lán)色簇中有更多的橘色點(diǎn),反之亦如此,至少和圖2比較時(shí),這個(gè)發(fā)現(xiàn)是成立的。

以上就是添加噪聲的方式與過程。接下來我們將講解類別平衡。

調(diào)整類別平衡

在現(xiàn)實(shí)世界的數(shù)據(jù)集中,我們總能看到類別不平衡的情況。一些數(shù)據(jù)集甚至存在極大的類別不平衡問題。例如,1000筆銀行交易中,可能有一筆交易是詐騙交易,這就意味著其平衡比例為1:1000。

你可以使用weights參數(shù)來控制類別平衡。它是一個(gè)有N-1個(gè)值的列表,其中N是特征數(shù)。我們之前設(shè)置的特征數(shù)為2,所以列表中只有一個(gè)值。

現(xiàn)在讓我們來看看如果將值指定為0.95,會(huì)出現(xiàn)什么結(jié)果:

X, y = make_classification( n_samples=1000, n_features=2, n_redundant=0, n_clusters_per_class=1, weights=[0.95], random_state=42)df = pd.concat([pd.DataFrame(X), pd.Series(y)], axis=1)df.columns = ['x1', 'x2', 'y']plot(df=df, x1='x1', x2='x2', y='y', title='Dataset with 2 classes - Class imbalance (y = 1)')

下圖就是數(shù)據(jù)集可視化效果:

圖4:在正類上類別不平衡的合成數(shù)據(jù)集可視化效果。圖片來源:Dario Rade?i?

如圖所示,數(shù)據(jù)集中只有5%的部分屬于類1,你也可以將這一個(gè)分類比例輕松地轉(zhuǎn)換。比如說,如果你將數(shù)據(jù)集中類0的占比改為5%:

X, y = make_classification( n_samples=1000, n_features=2, n_redundant=0, n_clusters_per_class=1, weights=[0.05], random_state=42)df = pd.concat([pd.DataFrame(X), pd.Series(y)], axis=1)df.columns = ['x1', 'x2', 'y']plot(df=df, x1='x1', x2='x2', y='y', title='Dataset with 2 classes - Class imbalance (y = 0)')

下圖就是對(duì)應(yīng)的可視化效果:

圖5:在負(fù)類上類別不平衡的合成數(shù)據(jù)集可視化效果。圖片來源:Dario Rade?i?

這就是關(guān)于類別平衡的全部信息。最后,我們?cè)倏纯凑{(diào)整類分離。

調(diào)整類分離

默認(rèn)狀態(tài)下,類0和類1中總會(huì)有一些重疊的數(shù)據(jù)點(diǎn)。對(duì)此,你可以使用class_sep參數(shù)來控制類分離的情況。Class_sep的默認(rèn)值是1.

如果你將該值設(shè)為5,我們看看會(huì)出現(xiàn)什么結(jié)果:

X, y = make_classification( n_samples=1000, n_features=2, n_redundant=0, n_clusters_per_class=1, class_sep=5, random_state=42)df = pd.concat([pd.DataFrame(X), pd.Series(y)], axis=1)df.columns = ['x1', 'x2', 'y']plot(df=df, x1='x1', x2='x2', y='y', title='Dataset with 2 classes - Make classification easier')

下圖就是數(shù)據(jù)集的可視化效果:

圖6:明顯的類分離合成數(shù)據(jù)集可視化效果。圖片來源:Dario Rade?i?

如圖所示,類分離的情況非常明顯。將class_sep的值設(shè)置得越高,類分離效果就越好,反之亦然。

寫在最后

在這篇文章中,我跟大家分享了如何用Python和Scikit-Learn生成基本的合成分類數(shù)據(jù)集。

你可以在想要證明一個(gè)觀點(diǎn),或是實(shí)現(xiàn)一些數(shù)據(jù)科學(xué)概念的時(shí)候來使用它們。然而,在這種情況下,不建議使用真實(shí)的數(shù)據(jù)集,因?yàn)樗鼈兺枰b密的準(zhǔn)備工作。

譯者:俊一

相關(guān)推薦
免責(zé)聲明
本文所包含的觀點(diǎn)僅代表作者個(gè)人看法,不代表新火種的觀點(diǎn)。在新火種上獲取的所有信息均不應(yīng)被視為投資建議。新火種對(duì)本文可能提及或鏈接的任何項(xiàng)目不表示認(rèn)可。 交易和投資涉及高風(fēng)險(xiǎn),讀者在采取與本文內(nèi)容相關(guān)的任何行動(dòng)之前,請(qǐng)務(wù)必進(jìn)行充分的盡職調(diào)查。最終的決策應(yīng)該基于您自己的獨(dú)立判斷。新火種不對(duì)因依賴本文觀點(diǎn)而產(chǎn)生的任何金錢損失負(fù)任何責(zé)任。

熱門文章