機器學習即服務之BigML特性介紹和入門教程
【編者按】 如我們之前的介紹, 隨著微軟、Google、AWS陸續加入,機器學習即服務(MLaaS)的爭奪戰已經打響 ,BigML就是其中的一個競爭者。本文詳細介紹了BigML機器學習服務的特性和使用過程,作者認為BigML比AmazonML、AzureML等更接近于SaaS,支持跨云導入數據是它的一個優勢。以下為文章內容。
BigML提供一個建立和共享數據集和模型的管理平臺
機器學習即服務( MLaaS)已經真實存在于云計算市場,而BigML的使命很簡單明了:讓機器學習更容易,更美妙,更加易于為所有人理解。
和IaaS和PaaS競爭對手的機器學習服務相比, BigML更接近于軟件即服務(SaaS)。我最近使用過AmazonML,AzureML和Google Prediction API,所有這些都是一個龐大的網絡服務生態系統的一部分,這個生態包括云存儲、CDN、VPC和部署自動化等。
BigML卻與平臺無關, 能夠利用現有的云計算解決方案是它的優勢。舉個例子,它允許來自AWS S3、MS Azure、Google Storage、Google Drive和Dropbox等的數據導入。這個細節現在看起來似乎微不足道,但很有可能在未來改變游戲規則:一旦公共云基礎設施成為商品,那么跨供應商的 解決方案將是最好的選擇。
BigML特性
BigML只專注于機器學習,提供了一套更廣泛的功能,這些功能都集成在一個可用的 Web UI上。正如你所期望的那樣,你可以加載數據集,訓練和評估你的模型,并生成新的預測(無論逐一或成批)。
下面是我所知道的BigML所獨有的好特性:
- 有各種各樣的方式來加載你的原始數據,包括大多數的云存儲系統,公共鏈接或私有的 CSV/ ARFF文件。
- 大量免費的數據集和模型可供使用,分類條理清晰,可以公開訪問。
- 聚類算法和可視化:數據分析和可視化工具對于提出高質量的模型是必不可少的。
- 異常檢測:應對異常值比較痛苦,而檢測模式異常可以節省你的時間和金錢,甚至先于壓縮你的模型。
- 彈性價格:你可以在訂閱計劃之間進行選擇(最低學生價 $15 /月),賬單到期即付,伴隨著BigML積分,甚至購買你的私人VPC。
如何導入你的數據
根據你的使用情況,你可能希望從現有的云存儲系統中導入數據,提供一個公共網址,或直接上傳 CSV文件。在開發模式下,你甚至可以動態創建一個內聯源。
即使在這一步, BigML也提供了一套很好的功能集:
- CSV解析配置。
- 字段類型選擇。
- 字符串區域選擇(英語,荷蘭語,西班牙語或葡萄牙語)。
- ? 頭文件解析( CSV具有或不具有標題行)。
- 日期—時間域擴張。
- 文本分析(語言檢測,符號化,停用字,詞干提取)。
有趣的是,你可以在任何時間更新你的源( Source)配置,無需任何額外的上傳。
一旦你的源已準備好和正確解析,你可以用它來生成一個新的數據集。或者,你可以從他們的公開數據集畫廊導入準備使用的數據。
數據集完全可重復使用,可擴展及可導出
BigML數據集是很容易重用、編輯、擴展和導出。事實上,你可以很容易地重新命名并添加說明到你的領域中的每一個地方,添加新的成分(通過歸一化、離散化、數學運算、遺漏值置換等),以及生成基于采樣或自定義過濾器的子集。
此外,甚至在訓練你的模型,你是對每個領域進行給定的值分布和統計,而且還是一個很不錯的動態散點圖工具可視化數據,一段時間兩個維度。這里你可能想要探索你的功能空間,尋找模式,導出字符或者只是簡單地獲得樂趣。
在實際應用中,對于大多數操作數據集是你的起點。假設我們的目標是培訓和評估一個分類模型。我們首先需要將我們的數據分割成更小的培訓和測試機組:你可以通過培訓和測試集拆分操作做到這一點。當然,你可以自由選擇如何分配你的記錄: 80/20是默認的拆分邏輯。這個過程實際上將創建兩個新的獨立的數據集,只要你想,你便可以分析和操作它們。
一旦拆分完成后,你要選擇新的訓練集和啟動配置模式操作。
BigML決策樹
機器學習模型可能是任何東西,它能夠分析你的原始數據(最終標記),并能以某種方式學會如何應對新的和未知的數據。
決策樹可能是你可以建立的模型最直觀的類型。它們易于可視化和理解,也更容易儲存,因為它們可以幾乎直接轉換成程序代碼。即使你不是一個程序員,你可以把它作為雙則判決的一個嵌套結構。
這正是每一個 BigML模型所表現出來的。當你訓練模型——從訓練數據集開始——你被要求選擇你的目標領域(即你的目標列)。為了減少數據過度擬合的效果和模型的大小,你通常需要某種形式的統計修剪,盡管你可以可以決定禁用它。
或者視情況,你可以配置更多的選項。
- 缺少拆分:在選擇拆分(默認禁用)時是否包括缺失值。
- 節點閾值:節點的最大數(默認值為 512)。
- 重量:你可以選擇重量記錄字段指定一個權重,或者對你的類分配相對權重,。
- 采樣和訂購:你可以選擇自定義子樣本和混編的邏輯。
訓練結束時,你將能夠可視化你的模型,并獲得翔實的報告,以更好地了解你的哪些領域更相關(見上圖)。此外,模型的預測圖形表示為一顆真實的樹(在左側下面)或者作為旭日(在右側下面)。
在這一點上,你已經可以開始產生新的預測,但當然,我們首先要評估我們的模型的準確性。
多分類器融合可以提高你的預測準確度
多分類器融合,涉及多個可供選擇的模式,這將提供更好的預測性能,是一種能提高你的單模型系統的精度的有據可查的方式。每個模型可以使用數據的子集進行訓練,或專注于特定的級層,以便他們能產生更好的預測協作。
在 BigML你可以很容易地用配置集合數據集的操作來培養決策森林:你僅僅需要了解多少模型須接受培訓。
這種做法極大地糾正過度擬合訓練數據的決策樹的習慣——并因此提高了整體的精度。就我而言,我設法使用 10種模型的多分類器來提高3%的準確性,如果你能承受額外的時間,這可能是有意義的。
我還生成了 100個模型的集合,但是,即使它增加了額外的1%的精確度,無論是在成本和速度方面,這顯然還不是一個好的選擇。
如何評估你的結果
能夠快速評估你的模型以及對照多種評估是機器學習作為服務產品的關鍵功能,我個人認為 BigML已經做了很多工作。
特別地,你想針對你的數據集的一小部分來測試你的模型。我們以前創建的一個 20%測試集,我用它來生成我的兩個模型和集合的評估。你可以開始對模型進行評估操作,或者對你的數據集進行模型評估操作。需要不多的配置,除非你有特殊的取樣或訂貨需求。
每一個評估是一個對象本身,將會被列在名單的評估清單。當然,基于你的模型類型(回歸或分類),你將被示以各種度量。如果你的模型是一個分類器,你將被示以混淆矩陣,包括像準確度,精密度,召回, F值和Phi統計分類。
如果你的混沌矩陣太大了以至于不能再網頁上呈現(假設你和我一樣可能有 6類),你可以下載Excel格式。這將類似于下圖,其中頂部的圖例為你顯示每一個單元格表示什么,相對于主對角線的第一個元素(你可以在主對角線做相同的每個單元)。
但我的多分類器融合如何呢?它可以有更好的表現嗎?
顯然,它還有更好的應用。它使得總精度提升了 2.82%,而且有些類更是高達5.34%。你可以與比較評估操作比較兩個評估,呈現的是有著單一評估的相同的統計,以及對每個指標的相對比例相同的統計數據。
我的模型單獨情況下是非常有效的,我可能不會選擇支付多分類器融合的額外費用——包括在價格和速度兩方面——盡管在許多情況下,過度擬合會消除掉你的預測能力,但是多分類器融合可以大幅度地提高你的準確度。
產生新的 API綁定和BigMLer的預測
我要說的是 BigML既方便用戶也方便開發人員。他們花時間來編寫大量的API客戶端,甚至是一個稱為BigMLer命令行工具。
當然,你可以通過 API完成上面提到的每一個操作,但我相信,離線階段可以更好地處理一個清晰和可靠的UI,特別是在模型和數據集定義中。
我選擇了 Python進行綁定,并編寫了一個簡單的腳本來生成新的預測。
from bigml.api import BigML from bigml.model import Model from bigml.ensemble import Ensemble USE_ENSEMBLE = False labels = { '1': 'walking', '2': 'walking upstairs', '3': 'walking downstairs', '4': 'sitting', '5': 'standing', '6': 'laying' } def main(): api = BigML("alex-1", "YOUR_API_KEY", storage="./cache") if USE_ENSEMBLE: predictor = Ensemble('ensemble/5557c358200d5a7b4300001e', api=api) else: predictor = Model('model/5557ac99200d5a7b42000001', api=api) #generate new prediction #Note: params might differ btw Ensemble and Model, this is an example prediction = predictor.predict(get_input_data(), with_confidence=True) label = prediction[0] confidence = prediction[1] print("You are currently %s (class %s, %s%%)." % (labels[label], label, confidence) ) def get_input_data(): """ Retrieve input data from local CSV file """ with open('record.csv') as f: record_str = f.readline() #generate 'fieldN' dict (I had 562 un-named columns!) record = {} for i,val in enumerate(record_str.split(',')): record['field%s' % (i+2)] = val return record if __name__ == '__main__': main()
就實現性能而言,它只需要 1.5到2秒調用至我的模型,直到我啟用了本地存儲選項:這將在本地存儲所有的模型參數,避免阻塞 API調用每一個未來的預測。本地緩存活躍起來之后,我的腳本執行時間下降到150毫秒。我的10種模型集合第一次大約花20秒鐘來加載,然而每一次調用 最多只用1秒:實際上它比一個單一的模型要慢10倍——雖然有10種預測被執行——但我認為1%的額外預測信任是值得的。也請記住,我的模型對超過560 的輸入功能和6個可能的輸出類都有作用,所以我確信,平均模型的運行速度比我的模型要快很多!
或者,你可以通過點擊下載可執行的模型來轉變你的模型,轉換成十五種不同語言 /格式的程序代碼。我使用Python版本做了一個嘗試,它真的只需要幾毫秒到就可以在本地執行:這可能一個很好的解決方案,假使你不希望安裝新的庫(例如,我能想到的嵌入式設備或網絡隔離的客戶)。
我當然滿意這種服務——作為一個開發者——我非常感謝這么多的編程語言和平臺的支持與努力,使每個人的工作變得簡單。
原文地址 : BigML: Machine Learning made easy (翻譯/王輝 責編/周建丁)