全文共3577字,預計學習時長7分鐘python
谷歌、Facebook和微軟這樣的大型科技巨頭正在絕不吝嗇的將最新的機器學習算法和軟件包免費提供給用戶,其緣由在於現在算法領域的入門門檻至關低。git
開源社區和工具(如scikit-learn)已走過了漫長的道路,大量的開源項目推進了數據科學/數字分析和機器學習的發展。能夠確定的是,身處2019年,稀缺的資源並非算法、編程框架和機器學習包(甚至也不是學習這些技術的教程),而是高質量的數據。github
對數據科學和機器學習領域的從業者而言,在對算法進行調整或微調時,數據稀缺每每是一個棘手的問題。本文談論的數據稀缺是在算法研究、教學學習和創建模型方面,而不是擴展和商業運營方面。算法
本文不討論如何獲取用於開發旅行或時尚類應用程序的高質量數據。有專門的議題討論如何收集這類消費者、社交或行爲數據。然而,即便是像爲檢測特定算法的侷限性和不肯定性獲取高質量數據這樣看似簡單的事情,也經常並不是易事。數據庫
爲何須要合成數據集?編程
建議新手從簡單的小規模數據集開始。能夠在二維空間中繪圖,直觀地瞭解其規律,並查看ML算法的運行狀況。bash
然而,隨着數據維度爆炸,視覺判斷必須擴展到更復雜的問題——學習和樣本複雜性、計算效率、類不平衡等概念。微信
此時,須要將實驗靈活性與數據集性質之間的平衡歸入考量範圍。總能找到一個真實的大型數據集來練習算法。但這仍然是一個樣本數量固定,潛在規律固定,而且正負樣本之間類別分離程度固定的數據集。還必須研究如下問題:網絡
• 所選測試和訓練數據比例如何影響算法的性能和健壯性app
• 面對不一樣程度的類別不平衡,衡量指標有多麼健壯
• 如何權衡誤差和方差
• 各類噪聲信號干擾下,算法在訓練和測試數據中的表現(即標籤及特徵集中的噪聲)
• 如何測試和找出ML算法的缺陷?
事實證實,僅靠一個真實的數據集很難解決上述問題。所以,必須使用足夠隨機的合成數據來實現真實數據集的不肯定性,同時這些數據必須足夠可控,纔能有助於科學地研究特定ML Pipeline的優缺點。
雖然本文不會討論這一問題,可是在醫學分類或財務建模這些敏感的應用領域,合成數據集的潛在優點顯著。這些領域獲取高質量標記數據集,每每由於耗資巨大使人卻步。
ML合成數據集的基本特徵
如今應理解合成數據集是經過程序生成的,而不是源自社科實驗、商業交易數據、傳感器讀取或圖像手動標記。然而,這些數據集絕對不是徹底隨機的,生成和使用用於ML的合成數據必須遵循一些整體需求。尤爲是:
• 數據集能夠是數字、二進制或分類的(順序或非順序的),數據集的維度和長度能夠不固定
• 數據集必須具備必定的隨機性,但與此同時,用戶可以按照各類各樣的統計分佈來生成這些數據,便可以精確控制和調整數據背後的隨機過程
• 用於分類算法的數據及須要可以控制類分離程度來調節學習問題的難易程度
• 可以以可控的方式在數據集中插入隨機噪聲
• 數據集可以足夠迅速地生成,以便可以使用大量此類數據集針對任何特定ML算法進行實驗,即,若是合成數據基於實際數據集上的數據增廣,則增廣算法必須具備計算效率
• 對於迴歸問題,可使用複雜非線性生成過程來獲取數據——真實的物理模型可能會對這一問題有所幫助
下一節將介紹如何使用一些最流行的ML庫和編程技術生成合適的數據集。
使用Scikit Learn和Numpy生成標準迴歸、分類和聚類數據集
Scikit-learn是基於Python的數據科學軟件棧中最受歡迎的ML庫。除了性能優良的ML例程和管道構建方法外,還擁有一系列用於合成數據生成的實用方法。
用Scikit Learn建立迴歸問題
Scikit-learn的dataset.make_regression函數能夠建立隨機迴歸問題,該回歸問題具備任意數量的輸入比,輸出目標以及二者之間程度可控的信息耦合。
使用Scikit-Learn進行分類
與上文迴歸函數相似,dataset.make_classification生成一個類分離程度可控而且加入了噪聲數據的隨機多類分類問題。若是須要,還能夠隨機改變任意比例的輸出指徵以建立更高難度的分類數據集。
使用Scikit-Learn進行聚類
scikit-learn實用程序函數能夠生成各類聚類問題。最直接的方法是使用datasets.make_blobs,它生成具備可控距離參數的任意數量聚類。
爲了測試基於類似性的聚類算法或高斯混合模型,生成特殊形狀的聚類十分有用。使用datasets.make_circles函數就能夠達成這一目的。
使用支持向量機(SVM)算法測試非線性核方法時,一般建議使用k-NN之類的最近鄰方法或採用簡單的神經網絡來測試數據。可以使用dataset.make_moon函數生成含有可控噪聲的此類數據。
使用Scikit-Learn生成高斯混合模型
高斯混合模型(GMM)是研究文本處理/ NLP任務中無監督學習和主題建模的不二之選。從下列簡單的函數圖示可以看出採用這一模型生成合成數據是多麼容易:
1. import numpy as np
2. import matplotlib.pyplot as plt
3. import random
4. def gen_GMM(N=1000,n_comp=3, mu=[-1,0,1],sigma=[1,1,1],mult=
[1,1,1]):
5. """ 6. Generates a Gaussian mixture model data, from a given list of Gaussian components 7. N: Number of total samples (data points) 8. n_comp: Number of Gaussian components 9. mu: List of mean values of the Gaussian components 10. sigma: List of sigma (std. dev) values of the Gaussian components 11. mult: (Optional) list of multiplier for the Gaussian components 12. ) """
13. assert n_comp == len(mu), "The length of the list of mean values does not match number of Gaussian components"
14. assert n_comp == len(sigma), "The length of the list of sigma values does not match number of Gaussian components"
15. assert n_comp == len(mult), "The length of the list of multiplie r values does not match number of Gaussian components"
16. rand_samples = []
17. for i in range(N):
18. pivot = random.uniform(0,n_comp)
19. j = int(pivot)
20. rand_samples.append(mult[j]*random.gauss(mu[j],sigma[j]))
21. return np.array(rand_samples)複製代碼
不止Scikit-Learn:來自符號輸入的合成數據
雖然上述函數足以解決許多問題,可是所生成的數據是徹底隨機的,且用戶難以控制生成過程的實際機制。多數狀況下,用戶可能須要一種可控制的方法,使用定義明確的分析函數(涉及線性,非線性,理性或甚至超越方法)生成迴歸或分類問題。
下文展現瞭如何將符號數學工具包SymPy和SciPy中的函數結合起來,依據給定的符號表達式生成綜合迴歸和分類問題。
用符號表達式生成隨機迴歸和分類問題
從給定符號表達式生成的迴歸數據集。
從給定符號表達式生成的分類數據集。
使用Scikit-Image加強圖像數據
深度學習系統和算法須要大量數據。然而,爲了測試深度學習算法的侷限性和魯棒性,一般須要爲算法提供有細微差異的類似圖像。Scikit-image是一個使人驚歎的圖像處理庫,基於與scikit-learn相同的設計原理和API模式,爲圖像數據加強提供數百種好用的函數。
本文選擇性地展現了加強過程的一些示例,從單個圖像開始並基於該圖像建立數十個變體,以有效地成倍增長數據集並建立龐大的合成數據集以便穩健地訓練深度學習模型。
色調,飽和度,通道值
裁剪
隨機噪音
旋轉
扭曲
具有分割的隨機圖像合成器
NVIDIA提供了一個名爲NDDS的UE4插件,它使計算機視覺研究人員可以使用元數據導出高質量的合成圖像。NDDS支持圖像、分割、深度、對象姿式邊框、關鍵點和自定義模板。
除了導出器以外,該插件還包含各類組件,可以生成用於數據加強和對象檢測算法訓練的隨機圖像。隨機化實用程序包括照明,對象,相機位置,姿式,質地和干擾物。這些組件共同幫助深度學習工程師輕鬆建立隨機場景,以訓練CNN算法。
Github連接:https://github.com/NVIDIA/Dataset_Synthesizer
使用pydbgen生成分類數據
Pydbgen是一個輕量級的純python庫,用於隨機生成有用的條目(例如姓名、地址、信用卡號、日期、時間、公司名稱、職位和車牌號等),並將其保存在Pandas數據框對象中或做爲SQLite表存放於數據庫文件或MS Excel文件中。
如下是一些示例:
合成時間序列數據集
有至關多的論文和代碼庫使用現實中多變量時間序列所觀察到的特殊函數和模式生成合成的時間序列數據。可訪問GitHub鏈接查看示例:https://nbviewer.jupyter.org/github/tirthajyoti/Machine-Learning-with-Python/blob/master/Synthetic_data_generation/Synth_Time_series.ipynb
合成音頻信號數據集
音頻/語音處理是深度學習從業者和機器學習愛好者特別感興趣的領域。Google的NSynth數據集就是由多種樂器製做的短音頻文件生成(使用神經自動編碼器及手動標記和啓發式標籤的組合)庫。
數據集的詳細說明:https://magenta.tensorflow.org/datasets/nsynth
強化學習的合成環境
OpenAI Gym
OpenAI Gym是加強機器學習合成學習環境的最大存儲庫,由大量預編程環境組成,用戶能夠在其上實現本身的強化學習算法,以進行性能基準測試或排除潛在漏洞。
隨機網格世界
對於強化學習的初學者來講,使用簡單的網格世界練習和試驗一般是有幫助的。在這個網格世界中,對象必須穿過迷宮到達最終狀態,每一個步驟和最終狀態具備給定的獎勵/懲罰。
經過幾行簡單的代碼,能夠合成具備任意規模和複雜度的網格世界環境(具備用戶指定的終端狀態和獎勵向量的分佈)。
小結
本文討論了一些用於機器學習的合成數據生成示例。讀者應該清楚,這只是部分數據生成技術的示例。事實上,隨着使用大量數據訓練機器學習模型的需求快速增加,除scikit-learn以外,許多商業應用程序也開始提供相同的服務。
做爲數據科學家或ML工程師,建立本身的合成數據生成程序化方法,它能夠節省組織資金和資源,投資第三方應用程序,還可讓總體計劃開發ML Pipeline。
留言 點贊 關注
咱們一塊兒分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 「讀芯術」
(添加小編微信:dxsxbb,加入讀者圈,一塊兒討論最新鮮的人工智能科技哦~)