Scikit-Learn&More,用於機器學習的綜合數據集生成


Scikit-Learn&More,用於機器學習的綜合數據集生成

CDA數據分析師 出品

儘管成熟的算法和開源代碼庫可供機器學習從業人員廣泛使用,但使用足夠的數據去應用這些技術仍然是一個核心挑戰。現在讓我們瞭解如何利用scikit-learn和其他工具來生成適合優化和微調模型的綜合數據。--- Kevin Vu

越來越明顯的是,谷歌,Facebook和微軟等大型科技巨頭對最新的機器學習算法和軟件包非常慷慨(它們免費提供這些),因為目前算法世界的入門門檻很低。開源社區和工具(例如scikit-learn)已經走了很長一段路, 大量的開源計劃正在推動數據科學,數字分析和機器學習的發展。站在2018年,我們可以肯定地說, 算法,編程框架和機器學習套件(甚至是學習這些技術的教程和課程)不是稀缺資源,而是高質量數據。

在調整和微調這些算法時,這通常成為數據科學(DS)和機器學習(ML)從業者的棘手問題。明智的是,從一開始就應該指出當前的文章,與算法研究、教學法學習和模型原型的數據稀缺有關,而不是與擴展和運行商業運作有關。這不是關於如何獲取時尚旅行或時尚應用程序的數據的討論。這種消費者,社會或行為數據收集會給自己帶來問題。但是,即使是訪問質量數據集以測試特定算法方法的侷限性和變化性之類的簡單操作,也往往不是那麼簡單。

為什麼需要綜合數據集?

如果是從頭開始學習,則最合理的建議是從簡單的小規模數據集入手,你可以在二維空間中繪製這些數據集,以直觀地瞭解模式並親自查看ML算法的工作方式。

但是,隨著數據量的爆炸式增長,視覺判斷必須擴展到更復雜的問題上,例如 學習樣本複雜性,計算效率,類不平衡 等概念。

在這一點上,實驗靈活性和數據集性質之間的取捨開始發揮作用。 總會有辦法找到一個龐大的真實數據集來實踐算法。但這仍然是一個固定的數據集,具有固定數量的樣本,固定的基礎模式以及正樣本與負樣本之間的類別分離程度。還必須調查

  • 測試和訓練數據的選定部分如何影響算法的性能和抗干擾性。
  • 面對不同程度的班級失衡,指標的穩定性。
  • 必須進行什麼樣的偏差方差折衷。
  • 在訓練和測試數據(即標籤以及功能集中的噪聲)下,算法在各種噪聲簽名下的性能如何。
  • 如何進行實驗並找出ML算法的弱點?
Scikit-Learn&More,用於機器學習的綜合數據集生成

事實證明,如果使用單個真實數據集很難做到這些,必須願意使用足夠隨機合成的數據來捕獲真實數據集的所有變化,但可控的數據足以幫助我們科學地調查正在構建的特定ML算法的優缺點。

儘管我們不會在本文中討論此問題,但對於敏感的應用程序-醫療分類或財務模型,可以輕鬆地評估此類合成數據集的潛在利益,而獲取高質量的,帶有標籤的數據集通常會很昂貴且令人望而卻步。

ML綜合數據集的基本功能

在這一點上可以理解,合成數據集是通過程序生成的,而不是來自任何種類的社會或科學實驗,業務交易數據,傳感器讀取或圖像的手動標記。但是,此類數據集絕對不是完全隨機的,並且ML的合成數據的生成和使用必須以一些總體需求為指導。特別是:

  • 它可以是數字的,二進制的或分類的(有序或非有序),特徵的數量和數據集的長度可以是任意的。
  • 它必須具有一定程度的隨機性,但同時,用戶應該能夠選擇各種統計分佈來基於此數據,即可以精確控制和調整基礎隨機過程。
  • 如果將其用於分類算法,則類別分離的程度應該是可控制的,以使學習問題變得容易或困難。
  • 可以以可控的方式插入隨機噪聲。
  • 生成速度應該很高,以便能夠針對任何特定的ML算法使用大量此類數據集進行實驗,即,如果合成數據基於現實生活數據集上的數據擴充,則擴充算法必須在計算上有效。
  • 對於迴歸問題,可以使用複雜的非線性生成過程來獲取數據-實際的物理模型可能會有助於這一工作。

在下一節中,我們將展示如何使用一些最受歡迎的ML庫和編程技術來生成合適的數據集。

使用scikit-learn和Numpy生成標準迴歸,分類和聚類數據集

Scikit-learn是用於數據科學的基於Python的軟件中最受歡迎的ML庫。除了優化的ML例程和構建方法外,它還擁有用於合成數據生成的實用方法的可靠集合。

scikit-learn的迴歸

Scikit-learn的dataset.make_regression 函數可以創建具有任意數量的輸入要素 ,輸出目標以及 它們之間的信息耦合程度,可控制隨機迴歸問題 。

Scikit-Learn&More,用於機器學習的綜合數據集生成

使用Scikit學習進行分類

與上面的迴歸函數類似,dataset.make_classification生成一個隨機的多類分類問題,具有可 控制的類分離和增加的噪聲。如果需要,還可以隨機翻轉任意百分比的輸出符號以創建更難的分類數據集。

Scikit-Learn&More,用於機器學習的綜合數據集生成

使用Scikit學習進行聚類

scikit-learn實用程序功能可能會產生各種聚類問題。最直接的方法是使用 datasets.make_blobs,它會生成任意數量的具有可控制距離參數的聚類。

Scikit-Learn&More,用於機器學習的綜合數據集生成

對於測試基於親和力的聚類算法或高斯混合模型,以特殊形狀生成聚類非常有用。我們可以使用 datasets.make_circles 函數來實現。

Scikit-Learn&More,用於機器學習的綜合數據集生成

Scikit-Learn&More,用於機器學習的綜合數據集生成

為了使用支持向量機(SVM) 算法測試非線性核方法,使用 k-NN等最近鄰方法 ,甚至測試簡單的神經網絡,通常建議對某些形狀的數據進行實驗。我們可以使用dataset.make_moon 函數用可控制的噪聲生成此類數據 。

Scikit-Learn&More,用於機器學習的綜合數據集生成

具有Scikit-learn的高斯混合模型

高斯混合模型(GMM)是令人著迷的對象,可用於文本處理/ NLP任務中的無監督學習和主題建模。這是一個簡單函數的說明,以顯示為這種模型生成綜合數據有多麼容易:

import numpy as np

import matplotlib.pyplot as plt

import random

def gen_GMM(N=1000,n_comp=3, mu=[-1,0,1],sigma=[1,1,1],mult=[1,1,1]):

"""

Generates a Gaussian mixture model data, from a given list of Gaussian components

N: Number of total samples (data points)

n_comp: Number of Gaussian components

mu: List of mean values of the Gaussian components

sigma: List of sigma (std. dev) values of the Gaussian components

mult: (Optional) list of multiplier for the Gaussian components

) """

assert n_comp == len(mu), "The length of the list of mean values does not match number of Gaussian components"

assert n_comp == len(sigma), "The length of the list of sigma values does not match number of Gaussian components"

assert n_comp == len(mult), "The length of the list of multiplier values does not match number of Gaussian components"

rand_samples = []

for i in range(N):

pivot = random.uniform(0,n_comp)

j = int(pivot)

rand_samples.append(mult[j]*random.gauss(mu[j],sigma[j]))

return np.array(rand_samples)

Scikit-Learn&More,用於機器學習的綜合數據集生成

Scikit-Learn&More,用於機器學習的綜合數據集生成

Scikit-Learn&More,用於機器學習的綜合數據集生成

Scikit-Learn&More,用於機器學習的綜合數據集生成

超越scikit-learn:來自符號輸入的合成數據

儘管上面的功能可能足以解決許多問題,但生成的數據確實是隨機的,並且用戶對實際機械的控制較少

生成過程的滑稽動作。在許多情況下,可能需要一種可控的方法來基於定義明確的分析函數(涉及線性,非線性等條件)來生成迴歸或分類問題。下一篇文章顯示瞭如何 將符號數學包SymPy和SciPy中的函數結合起來, 以根據給定的符號表達式生成綜合迴歸和分類問題。

帶有符號表達的隨機迴歸和分類問題生成

Scikit-Learn&More,用於機器學習的綜合數據集生成

從給定的符號表達式生成的迴歸數據集。

Scikit-Learn&More,用於機器學習的綜合數據集生成

從給定的符號表達式生成的分類數據集。

使用scikit-image進行圖像數據增強

深度學習系統和算法是大量的數據消費者。但是,為了測試深度學習算法的侷限性和抗干擾性,通常需要向算法提供相似圖像的細微變化。

Scikit-image 是一個了不起的圖像處理庫,它基於與scikit-learn相同的設計原理和API模式構建,提供了數百種十分酷的功能來完成此圖像數據擴充任務。

我們展示了這種增強過程的一些選定示例,從單個圖像開始,在同一圖像上創建數十個變體,以有效地乘以數據集,並創建巨大規模的合成數據集,從而以健壯的方式訓練深度學習模型。

如色相,飽和度,價值渠道:

Scikit-Learn&More,用於機器學習的綜合數據集生成

播種

Scikit-Learn&More,用於機器學習的綜合數據集生成

隨機噪音

Scikit-Learn&More,用於機器學習的綜合數據集生成

旋轉

Scikit-Learn&More,用於機器學習的綜合數據集生成

漩渦

Scikit-Learn&More,用於機器學習的綜合數據集生成

帶分割的隨機圖像合成器

NVIDIA提供了一個稱為NDDS的UE4插件,以使計算機視覺研究人員能夠導出帶有元數據的高質量合成圖像。它支持圖像,分割,深度,對象姿勢,邊界框,關鍵點和自定義模具。除導出程序外,該插件還包括各種組件,這些組件能夠生成隨機圖像以進行數據增強和對象檢測算法訓練。隨機化實用程序包括照明,對象,相機位置,姿勢,紋理和干擾項。這些組件一起使深度學習工程師可以輕鬆創建隨機場景以訓練其CNN。

使用pydbgen生成分類數據

Pydbgen是一個輕量級的純Python庫,用於生成隨機有用的數據(例如名稱,地址,信用卡號,日期,時間,公司名稱,職務,車牌號等)並將其保存在Pandas的dataframe對象中,或作為數據庫文件或MS Excel文件中的SQLite表。

這是一些說明性的例子,

Scikit-Learn&More,用於機器學習的綜合數據集生成

Scikit-Learn&More,用於機器學習的綜合數據集生成

Scikit-Learn&More,用於機器學習的綜合數據集生成

綜合時間序列數據集

有相當多的論文和代碼存儲庫用於使用在現實多元時間序列中觀察到的特殊功能和模式來生成合成時間序列數據。以下Github鏈接給出了一個簡單的示例:

綜合時間序列

Scikit-Learn&More,用於機器學習的綜合數據集生成

合成音頻信號數據集

音頻/語音處理是深度學習從業人員和ML愛好者特別感興趣的領域。 Google的NSynth數據集 是由各種樂器合成的(簡短的音頻文件的)聲音合成庫(使用神經自動編碼器以及人類和啟發式標籤的組合)。這是數據集的詳細說明。

強化學習的綜合環境

OpenAI體育館

OpenAI Gym是用於強化ML的綜合學習環境的最大存儲庫 。它由大量預編程環境組成,用戶可以在其上實施強化學習算法,以對性能進行基準測試或對隱藏的弱點進行故障排除。

Scikit-Learn&More,用於機器學習的綜合數據集生成

隨機網格世界

對於強化學習的初學者而言,它通常有助於在簡單的網格世界中進行練習和實驗,在這種網格世界中,代理人必須穿越迷宮才能到達最終狀態,並獲得每個步驟和最終狀態的獎勵/懲罰。

只需幾行簡單的代碼,就可以合成具有任意大小和複雜度的網格世界環境(具有用戶指定的終端狀態和獎勵向量分佈)。

看看這個Github倉庫,可以瞭解想法和代碼示例。

總結

在本文中,我們介紹了一些用於機器學習的合成數據生成示例。大家應該清楚,它們絕不是數據生成技術的詳盡清單。實際上,除了scikit-learn之外,許多商業應用程序都提供相同的服務,因為使用各種數據訓練ML模型的需求正在快速增長。但是,如果作為數據科學家或ML工程師,你創建了合成數據生成的編程方法,那麼它既可以節省組織的金錢和資源來投資第三方應用程序,又可以把ML開發的既有整體性又時尚。

Scikit-Learn&More,用於機器學習的綜合數據集生成


分享到:


相關文章: