十二月是靜靜坐下來總結(jié)過去一年成就的時候。對程序員來說蝌借,則通常是回顧那些今年推出的開源庫昔瞧,或者由于其極好地解決了一個特定問題而最近變的大為流行的開源庫。
過去兩年來菩佑,我們一直通過發(fā)表博文的方式做這件事自晰,指出當(dāng)年 Python 社區(qū)中出現(xiàn)的一些最佳工作÷ǎ現(xiàn)在褐鸥,2017 年即將結(jié)束,又到了總結(jié)的時刻粟瞬。
但是這次開源庫的評選限定在了機(jī)器學(xué)習(xí)的范圍內(nèi)瞧哟。也許非機(jī)器學(xué)習(xí)庫的大牛認(rèn)為我們有偏見混巧,懇請你們原諒。很希望讀者在評論中對本文做出反饋勤揩,幫助我們查缺補(bǔ)遺未收錄的頂級軟件咧党。
因此,放輕松雄可,讓我們開始吧凿傅!
1. Pipenv
項目地址:https://github.com/pypa/pipenv
2017 年排名第一的 python 庫非 Pipenv 莫屬。它在今年初發(fā)行数苫,但卻影響了每個 Python 開發(fā)者的工作流程聪舒,尤其是現(xiàn)在它成了用于管理依賴項的官方推薦工具。
Pipenv 源自大牛 Kenneth Reitz 的一個周末項目虐急,旨在把其他軟件包管理器的想法整合進(jìn) Python箱残。安裝 virtualenv 和 virtualenvwrapper,管理 requirements.txt 文件止吁,確保依賴項的依賴項版本的可復(fù)現(xiàn)性被辑,以上這些統(tǒng)統(tǒng)不需要。借助 Pipenv敬惦,你可以在 Pipfile(通常使用添加盼理、刪除或更新依賴項的命令構(gòu)建它)中指定所有你的依賴項。Pipenv 可以生成一個 Pipfile.lock 文件俄删,使得你的構(gòu)建成為決定性的宏怔,避免了尋找 bug 的困難,因為甚至你也不認(rèn)為需要一些模糊的依賴項畴椰。
當(dāng)然臊诊,Pipenv 還有很多其他特性,以及很好的文檔斜脂,因此確保檢查完畢抓艳,再開始在所有你的 Python 項目上使用它。
2. PyTorch
項目地址:http://pytorch.org/
如果有一個庫在今年特別是在深度學(xué)習(xí)社區(qū)中大為流行帚戳,那么它很可能是 PyTorch玷或。PyTorch 是 Facebook 今年推出的深度學(xué)習(xí)框架。
PyTorch 構(gòu)建在 Torch 框架之上片任,并對這個(曾經(jīng)庐椒?)流行框架做了改善,尤其是 PyTorch 是基于 Python 的蚂踊,這與 Lua 形成鮮明對比约谈。鑒于過去幾年人們一直在使用 Python 進(jìn)行數(shù)據(jù)科學(xué)研究,這為深度學(xué)習(xí)的普及邁出了重要一步犁钟。
最值得注意的是棱诱,由于其實現(xiàn)了全新的動態(tài)計算圖(Dynamic Computational Graph)范式,PyTorch 成為了眾多研究者的首選框架之一涝动。當(dāng)使用其他框架比如 TensorFlow迈勋、CNTK、MXNet 編寫代碼時醋粟,必須首先定義一個稱之為計算圖的東西靡菇。該圖指定了由我們的代碼構(gòu)建的所有操作與數(shù)據(jù)流重归,且它在構(gòu)建完后會進(jìn)行編譯和利用框架潛在地優(yōu)化,因此靜態(tài)計算圖能很自然地在 GPU 上實現(xiàn)并行處理厦凤。這一范式被稱為靜態(tài)計算圖鼻吮,它很棒,因為你可以利用各種優(yōu)化较鼓,并且這個圖一旦建成即可運行在不同設(shè)備上(因為執(zhí)行與構(gòu)建相分離)椎木。但是,在很多任務(wù)中比如自然語言處理中博烂,工作量經(jīng)常是變動的:你可以在把圖像饋送至算法之前把其大小重新調(diào)整為一個固定的分辨率香椎,但是相同操作不適用于語句,因為其長度是變化的禽篱。這正是 PyTorch 和動態(tài)圖發(fā)揮作用的地方畜伐。通過在你的代碼中使用標(biāo)準(zhǔn)的 Python 控制指令,圖在執(zhí)行時將被定義躺率,給了你對完成若干任務(wù)來說很關(guān)鍵的自由烤礁。
當(dāng)然,PyTorch 也會自動計算梯度(正如你從其他現(xiàn)代深度學(xué)習(xí)框架中所期望的一樣)肥照,這非辰抛校快,且可擴(kuò)展舆绎,何不試一試呢鲤脏?
3. Caffe2
項目地址:https://caffe2.ai/
也許這聽起來有點瘋狂,但是 Facebook 在今年也發(fā)布了另外一個很棒的深度學(xué)習(xí)框架吕朵。原始的 Caffe 框架多年來一直被廣泛使用猎醇,以無與倫比的性能和經(jīng)過測試的代碼庫而聞名。但是努溃,最近的深度學(xué)習(xí)趨勢使得該框架在一些方向上停滯不前硫嘶。Caffe2 正是一次幫助 Caffe 趕上潮流的嘗試。
Caffe2 支持分布式訓(xùn)練梧税、部署(甚至在移動端平臺)和最新的 CPU沦疾、支持 CUDA 的硬件。盡管 PyTorch 更適合于研究第队,但是 Caffe2 適合大規(guī)模部署哮塞,正如在 Facebook 上看到的一樣。
同樣忆畅,查看最近的 ONNX 工作。你可以在 PyTorch 中構(gòu)建和訓(xùn)練你的模型尸执,同時使用 Caffe2 來部署家凯!這是不是很棒缓醋?
4. Pendulum
項目地址:https://github.com/sdispater/pendulum
去年,Arrow——一個旨在為你減負(fù)同時使用 Python datatime 的庫入選了榜單绊诲;今年送粱,該輪到 Pendulum 了。
Pendulum 的優(yōu)點之一在于它是 Python 標(biāo)準(zhǔn) datetime 類的直接替代品驯镊,因此你可以輕易地將其與現(xiàn)有代碼整合葫督,并在你真正需要時利用其功能竭鞍。作者特別注意以確保時間區(qū)正確處理板惑,默認(rèn)每個實例意識到時間區(qū)。你也會獲得擴(kuò)展的 timedelta 來簡化日期時間的計算偎快。
與其他現(xiàn)有庫不同冯乘,它努力使 API 具有可預(yù)測性行為,因此知道該期望什么晒夹。如果你正在做一個涉及 datetime 的重要工作裆馒,它會使你更開心。查看該文件獲得更多信息:https://pendulum.eustace.io/docs/丐怯。
5. Dash
項目地址:https://plot.ly/products/dash/
研究數(shù)據(jù)科學(xué)的時候你可以在 Python 生態(tài)系統(tǒng)中使用如 Pandas 和 scikit-learn 等非常棒的工具喷好,還可以使用 Jupyter Notebook 管理工作流程,這對于你和同事之間的協(xié)作非常有幫助读跷。但是梗搅,當(dāng)你的分享對象并不知道如何使用這些工具的時候,該怎么辦效览?如何建立一個可以讓人們輕松地處理數(shù)據(jù)并進(jìn)行可視化的接口无切?過去的辦法是建立一個專業(yè)的熟悉 JavaScript 前端設(shè)計團(tuán)隊,以建立所需要的 GUI丐枉,沒有其它辦法哆键。
Dash 是幾年發(fā)布的用于構(gòu)建網(wǎng)頁應(yīng)用(特別針對于數(shù)據(jù)可視化的高效利用)的純 Python 開源庫。它建立在 Flask瘦锹、Plotly.js 和 React 的頂部籍嘹,可以提供數(shù)據(jù)處理的抽象層次的接口,從而讓我們不需要再學(xué)習(xí)這些框架弯院,進(jìn)行高效的開發(fā)噩峦。該 app 可在瀏覽器上使用,以后將發(fā)布低延遲版本抽兆,以在移動設(shè)備上使用识补。
可以在這個網(wǎng)站中查看 Dash 的有趣應(yīng)用:https://plot.ly/dash/gallery。
6. PyFlux
項目地址:https://github.com/RJT1990/pyflux
Python 中有很多庫可以用于研究數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)辫红,但是當(dāng)你的數(shù)據(jù)點是隨時間演化的度量的時候(例如股價凭涂,甚至任何儀器測量值)祝辣,這就不一樣了。
PyFlux 就是一個專用于處理時序數(shù)據(jù)的開源 Python 庫切油。對時序數(shù)據(jù)的研究是統(tǒng)計學(xué)和經(jīng)濟(jì)學(xué)的一個子領(lǐng)域蝙斜,其研究的目的可以是描述時序數(shù)據(jù)的(關(guān)于隱變量或感興趣特征的)演化行為,也可以是預(yù)測時序數(shù)據(jù)的未來狀態(tài)澎胡。
PyFlux 允許使用概率方法對時序數(shù)據(jù)建模孕荠,擁有多種現(xiàn)代時序數(shù)據(jù)模型的實現(xiàn),例如 GARCH攻谁。
7. Fire
項目地址:https://github.com/google/python-fire
大多數(shù)情況下稚伍,我們需要為項目創(chuàng)建一個命令行界面(CLI)。除了傳統(tǒng)的 argparse 之外戚宦,Python 還有 clik 和 docopt 等很棒的工具个曙。Fire 是今年谷歌發(fā)布的軟件庫,它在解決這個問題上采取了不同的方法受楼。
Fire 是能為任何 Python 項目自動生成 CLI 的開源庫垦搬。這里的關(guān)鍵點是自動化:我們幾乎不需要編寫任何代碼或文檔來構(gòu)建 CLI。我們只需要調(diào)用一個 Fire 方法并把它傳遞到所希望構(gòu)建到 CLI 中的目標(biāo)艳汽,例如函數(shù)猴贰、對象、類河狐、字典或根本不傳遞參數(shù)(這樣將會把整體代碼導(dǎo)入 CLI)米绕。
一般我們需要閱讀該項目下的指導(dǎo)手冊,以便通過案例了解它是如何工作的甚牲。
8. imbalanced-learn
項目地址:https://github.com/scikit-learn-contrib/imbalanced-learn
在理想的情況中义郑,我們總會有完美的平衡數(shù)據(jù)集,用它來訓(xùn)練模型將十分舒爽丈钙。但不幸的是非驮,在實際中我們總有不平衡的數(shù)據(jù)集,甚至有些任務(wù)擁有非常不平衡的數(shù)據(jù)雏赦。例如劫笙,在預(yù)測信用卡欺詐的任務(wù)中絕大多數(shù)交易(99%+)都是合法的,只有極少數(shù)的行為需要算法識別為欺詐星岗。如果我們只是樸素地訓(xùn)練 ML 算法填大,那么算法的性能可能還不如全都預(yù)測為占比大的數(shù)據(jù),因此在處理這一類問題時我們需要非常小心俏橘。
幸運的是允华,該問題已經(jīng)經(jīng)過充分的探討,且目前存在各種各樣的技術(shù)以解決不平衡數(shù)據(jù)。imbalanced-learn 是一個強(qiáng)大的 Python 包靴寂,它提供了很多解決數(shù)據(jù)不平衡的方法磷蜀。此外,imbalanced-learn 與 scikit-learn 相互兼容百炬,是 scikit-learn-contrib 項目的一部分褐隆。
9. FlashText
項目地址:https://github.com/vi3k6i5/flashtext
在大多數(shù)數(shù)據(jù)清理流程或其它工作中,我們可能需要搜索某些文本以替換為其它內(nèi)容剖踊,通常我們會使用正則表達(dá)式完成這一工作庶弃。在大多數(shù)情況下,正則表達(dá)式都能完美地解決這一問題德澈,但有時也會發(fā)生這樣的情況:我們需要搜索的項可能是成千上萬條歇攻,因此正則表達(dá)式的使用將變得十分緩慢。
為此圃验,F(xiàn)lashText 提供了一個更好的解決方案掉伏。在該項目作者最初的基準(zhǔn)測試中缝呕,它極大地縮短了整個操作的運行時間澳窑,從 5 天到 15 分鐘。FlashText 的優(yōu)點在于不論搜索項有多少供常,它所需要的運行時都是相同的摊聋。而在常用的正則表達(dá)式中,運行時將隨著搜索項的增加而線性增長栈暇。
# FlashText替代關(guān)鍵詞
>>> keyword_processor.add_keyword('New Delhi','NCR region')
>>> new_sentence = keyword_processor.replace_keywords('I love Big Apple and new delhi.')
>>> new_sentence
>>># 'I love New York and NCR region.'
FlashText 證明了算法和數(shù)據(jù)結(jié)構(gòu)設(shè)計的重要性麻裁,即使對于簡單的問題,更好的算法也可以輕松超越在最快處理器上運行的樸素實現(xiàn)源祈。
10. Luminoth
項目地址:https://luminoth.ai/
如今圖像無處無在煎源,理解圖像的內(nèi)容對于許多應(yīng)用程序來說都是至關(guān)重要的。值得慶幸的是香缺,由于深度學(xué)習(xí)的進(jìn)步手销,圖像處理技術(shù)已經(jīng)有了非常大的進(jìn)步。
Luminoth 是用于計算機(jī)視覺的開源 Python 工具包图张,它使用 TensorFlow 和 Sonnet 構(gòu)建锋拖,且目前支持 Faster R-CNN 等目標(biāo)檢測方法。此外祸轮,Luminoth 不僅僅是一個特定模型的實現(xiàn)兽埃,它的構(gòu)建基于模塊化和可擴(kuò)展,因此我們可以直接定制現(xiàn)有的部分或使用新的模型來擴(kuò)展它而處理不同的問題适袜,即盡可能對代碼進(jìn)行復(fù)用柄错。
它還提供了一些工具以輕松完成構(gòu)建 DL 模型所需要的工程工作:將數(shù)據(jù)(圖像等)轉(zhuǎn)換為適當(dāng)?shù)母袷揭责佀偷礁鞣N操作流程中,例如執(zhí)行數(shù)據(jù)增強(qiáng)、在一個或多個 GPU 中執(zhí)行訓(xùn)練(分布式訓(xùn)練是訓(xùn)練大規(guī)模模型所必需的)售貌、執(zhí)行評價度量冕房、在 TensorBoard 中可視化數(shù)據(jù)或模型和部署模型為一個簡單的 API 接口等。所以因為 Luminoth 提供了大量的方法趁矾,我們可以通過它完成很多關(guān)于計算機(jī)視覺的任務(wù)耙册。
此外,Luminoth 可以直接與 Google Cloud 的 ML 引擎整合毫捣,所以即使我們沒有強(qiáng)大的 GPU详拙,我們也可以在云端進(jìn)行訓(xùn)練。
更多優(yōu)秀的 Python 庫
除了以上十個非常流行與強(qiáng)大的 Python 庫蔓同,今年還有一些同樣值得關(guān)注的 Python 庫饶辙,包括 PyVips、Requestium 和 skorch 等斑粱。
1. PyVips
項目地址:https://github.com/jcupitt/pyvips
你可能還沒聽過 libvips 庫弃揽,但你一定聽說過 Pillow 或 ImageMagick 等流行的圖像處理庫,它們支持廣泛的格式则北。然而相比這些流行的圖像處理庫矿微,libvips 更加快速且只占很少的內(nèi)存。例如一些基準(zhǔn)測試表明它相比 ImageMagick 在處理速度上要快三倍尚揣,且還節(jié)省了 15 倍的內(nèi)存占用涌矢。
PyVips 是最近發(fā)布用于 libvips 的 Python 綁定包,它與 Python 2.7-3.6(甚至是 PyPy)相兼容快骗,它易于使用 pip 安裝娜庇。所以如果你需要處理圖像數(shù)據(jù)的應(yīng)用,那么這個庫是我們所需要關(guān)注的方篮。
2. skorch
項目地址:https://github.com/dnouri/skorch
假設(shè)你很喜歡使用 scikit-learn 的 API名秀,但卻遇到了需要使用 PyTorch 工作的情況,該怎么辦藕溅?別擔(dān)心匕得,skorch 是一個封裝,可以通過類似 sklearn 的接口提供 PyTorch 編程蜈垮。如果你熟悉某些庫耗跛,就會希望使用相應(yīng)的直觀可理解的句法規(guī)則。通過 skorch攒发,你可以得到經(jīng)過抽象的代碼调塌,從而將精力集中于重要的方面。