自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何在時間緊迫情況下進行機器學(xué)習(xí):構(gòu)建標(biāo)記的新聞

人工智能 機器學(xué)習(xí)
本文介紹了作者和他的三位朋友參加了編程馬拉松,開發(fā)出了一個根據(jù)Hacker News提交的文章進行分類的分類器,緊接著作者分享了比賽過程中的一些經(jīng)驗。

[[195898]]

譯者注:本文介紹了作者和他的三位朋友參加了編程馬拉松,開發(fā)出了一個根據(jù)Hacker News提交的文章進行分類的分類器,緊接著作者分享了比賽過程中的一些經(jīng)驗。以下為譯文。

本周末,三位朋友(Chris Riederer,Nathan Gould和我的孿生兄弟Dan)和我參加了2017 TechCrunch Disrupt Hackathon。 我們以前都會去參加幾個這樣的編程馬拉松,也喜歡挑戰(zhàn)在短時間內(nèi)開發(fā)一個可用的應(yīng)用程序,同時學(xué)習(xí)一些新技術(shù)。

我們四個人中有三個是數(shù)據(jù)科學(xué)家,因此知道應(yīng)該尋找一個數(shù)據(jù)驅(qū)動的項目,因為最好的編程馬拉松項目往往是可用的應(yīng)用程序(而不是分析或lib庫),我們認(rèn)為應(yīng)該開發(fā)一個以機器學(xué)習(xí)為驅(qū)動的產(chǎn)品,想到了程序員社區(qū)Hacker News的分類器,它會根據(jù)文本自動分配每個提交的主題。

該項目需要下載數(shù)據(jù),培訓(xùn)機器進行學(xué)習(xí),并在24小時內(nèi)將其變成可用的網(wǎng)站。 在這里我分享了我們在開發(fā)過程中學(xué)到的一些經(jīng)驗教訓(xùn)。

(請注意,我關(guān)注的是數(shù)據(jù)方面,因為這是我負(fù)責(zé)的模塊,但是Nathan和Dan在開發(fā)和設(shè)計站點方面做了大量工作,同時為了使站點與Hacker News保持同步,他們也付出了很多心血。)

檢索Hacker News的帖子和文章

Hacker News收集了用戶提交和上傳的文章,通常是程序員社區(qū)感興趣的內(nèi)容(不只是關(guān)于編程的文章)。我們的任務(wù)是檢索每篇文章的文本,并將其分類為哪一種主題。

 

很快我們就知道了,我們需要大量的訓(xùn)練數(shù)據(jù)——也許是成千上萬篇文章——為了能夠成功地識別新文章的主題。要做到這一點,我們需要去Hacker News抓取每一篇提交的文章和對應(yīng)的鏈接,然后查詢每一篇文章來檢索它的文本內(nèi)容。

這里犯了一個錯誤,就是依賴Hacker News API從而一次只下載一個提交的文章,這樣的話,想獲得25,000個鏈接得需要好幾個小時,這是一個緩慢的過程。在黑客馬拉松結(jié)束后,我們了解到在Google BigQuery上有一個 Hacker News的數(shù)據(jù)集——在大約20分鐘的配置之后,我就可以下載100萬個鏈接。在比賽的壓力下,我們很難做到一直去尋找類似于這種簡單的解決方案,相反,為了最終實現(xiàn)可能會采用一些效率很低的解決方案(但這也是樂趣的一部分)。

一旦我們有了文章的鏈接,就需要每篇文章的文本內(nèi)容。這是一種挑戰(zhàn),因為這些文章來自于不同的網(wǎng)站,格式也各不一樣,但是設(shè)計python-goose正是為了這個目的。我們把其中的三臺電腦專門用來抓取文章,這樣每小時可以收集幾千篇。你可以在這個GitHub庫中找到我們的抓取代碼和一些結(jié)果。

通常在這樣的項目中,我們會讓抓取任務(wù)在夜間運行,但對我們來說,這并不是一個可取的選擇!當(dāng)數(shù)據(jù)開始下載時,我們分成了兩組:Nathan和Dan負(fù)責(zé)建立網(wǎng)站,而Chris和我負(fù)責(zé)開發(fā)收集數(shù)據(jù)的機器學(xué)習(xí)算法。

開發(fā)一個受監(jiān)督的培訓(xùn)集

要訓(xùn)練一個受監(jiān)督的分類器,你需要一個標(biāo)簽集:我們應(yīng)該能夠知道文章的正確分類是什么。我們沒有足夠的時間手工給例子貼上標(biāo)簽。那怎么得到一系列已經(jīng)正確標(biāo)記好的例子呢?

好吧,如果你瀏覽過幾頁Hacker News,你會發(fā)現(xiàn)有些文章通過標(biāo)題幾乎就已經(jīng)明確地告訴你主題是什么了,或者有些是通過簡單的模式匹配也可以知道??纯词醉?,比如Why Amazon is eating the world就是關(guān)于亞馬遜的,Why do many math books have so much detail and so little enlightenment?是關(guān)于數(shù)學(xué)的,Don’t tell people to turn off Windows Update是關(guān)于微軟/Windows的。因此,我們決定根據(jù)文章標(biāo)題通過正則表達式創(chuàng)建一個訓(xùn)練集。

這個過程進行了一些試驗,包括一些在文章標(biāo)題中對常見詞和集群的探索性分析。我最喜歡的圖形之一就是通過文字的形式創(chuàng)建的一個關(guān)于網(wǎng)絡(luò)的圖形(請參閱我們的圖書Text Mining with R的這一章節(jié)),這是一個更好地理解數(shù)據(jù)的好機會。

 

我們注意到詞匯中的集群,例如一個帶有“機器/深度學(xué)習(xí)”的ML集群,以及各種各樣的政治集群,如“網(wǎng)絡(luò)/中立性”和“trump/fbi”。這幫助我們把注意力集中在可用的話題上。

下面是我們用來訓(xùn)練模型的正則表達式。當(dāng)我們研究結(jié)果的分類是否正確,移除導(dǎo)致清除錯誤的正則表達式,并添加一些我們遺漏的部分時,這都是需要進行大量的迭代和調(diào)整。

 

R語言中的fuzzyjoin使得匹配這些標(biāo)題變得很容易。你可以在這個存儲庫中找到代碼和一些分析程序,以及我們的機器學(xué)習(xí)工作。

最后我們得到了一個大約10,000個標(biāo)記文檔的訓(xùn)練集(注意不是所有的標(biāo)題都匹配任何正則表達式,有些可以匹配多個)。與每一個正則表達式匹配的是:

 

(我們起初還有一些其他的主題,比如“Web開發(fā)”和“Javascript”,但最終基于分類的結(jié)果刪除了它們)。注意,這并不意味著這些就是站點上最流行的主題!它完全基于我們?yōu)槊總€主題決定的正則表達式——如果一些主題比其他主題更容易識別,或者如果這些正則表達式有一些疏漏,那么該文章將不會被反映出來。

在標(biāo)題上使用正則表達式是一種非常粗糙的獲取示例的方式,而且不會完全準(zhǔn)確(例如,關(guān)于“調(diào)整窗口大小(resizing windows)”的標(biāo)題將被標(biāo)記為Microsoft)。但是,它可以是一種快速有效的方法來構(gòu)建一個規(guī)模龐大的訓(xùn)練集,并且手工檢查的結(jié)果使我們確信它是準(zhǔn)確的。

一旦我們在這些標(biāo)題上訓(xùn)練了算法,它就能夠識別出標(biāo)題中沒有任何這些特征的文章。例如,在標(biāo)題拒絕信( Rejection Letter)中沒有提到它的主題,所以它不在我們的訓(xùn)練集里,但是因為標(biāo)題包含了諸如“安全”、“勒索軟件”、“防病毒”和“蠕蟲”之類的單詞,在我們的訓(xùn)練集里經(jīng)常出現(xiàn)的單詞——這個算法很容易把它標(biāo)記為“安全”。

培訓(xùn)和生產(chǎn)ML模型

在我們用R語言來探索數(shù)據(jù)之后,我們使用Python的scikit學(xué)習(xí)包讓機器進行學(xué)習(xí)。這需要三個步驟:

  • 標(biāo)記化:我們把每一篇文章都變成了一組單詞,用一種“單詞袋(bag of words)”方法(我們忽略了單詞的順序和結(jié)構(gòu))。
  • 維度減少:我們使用了由(gensim Python包)實現(xiàn)的Latent Dirichlet分配,將單詞適合于主題模型,將每個文檔轉(zhuǎn)換為長度為100的向量。每一主題都與數(shù)據(jù)相匹配,與特定的單詞組相關(guān)聯(lián)(例如,一個主題可能與“特朗普”、“科米”、“俄羅斯”有高度關(guān)聯(lián),而另一個主題則側(cè)重于“設(shè)計”、“photoshop”、“css”)。
  • 監(jiān)督分類:我們使用一種監(jiān)督分類器來預(yù)測。我們嘗試了兩種方法:正則化邏輯回歸和隨機森林。

我以前寫過主題建模(它在我們的《Text Mining with R》書中扮演著重要的角色)。在這里,我們不是用它來做結(jié)論,而是用它將我們數(shù)以萬計的特性(“這篇文章包含了“比特幣”這個詞,而不是“)減少到100維的數(shù)據(jù)集里。通過一些試驗,我們發(fā)現(xiàn)添加這個主題建模步驟(而不是直接使用文字作為特性)提高了我們對模型的準(zhǔn)確性。

我們還發(fā)現(xiàn),隨機森林在我們訓(xùn)練集上的交叉驗證的AUC(ROC曲線下的區(qū)域)方面打敗了正則化邏輯回歸:

 

這與圍繞這些模型的普遍聲譽相吻合。邏輯回歸更快地進行了訓(xùn)練,并且有了更多的解釋,但是在處理許多特性交互的情況下,它并沒有那么好。例如,它不會注意到“學(xué)習(xí)”這個詞與“大學(xué)”或“教育”這個詞的含義不同。

當(dāng)然,這個訓(xùn)練集的“準(zhǔn)確性”只是意味著“可以預(yù)測文章的標(biāo)題是否與我們認(rèn)為的正則表達式相符”,但我們希望這將轉(zhuǎn)化為對新文章的現(xiàn)實預(yù)測。

生產(chǎn)模型

當(dāng)Chris和我在建造這個模型時,Nathan和Dan已經(jīng)使用Django開發(fā)好了網(wǎng)站,部署在Heroku上,并注冊了一個域名。它每隔十分鐘與Hacker News API同步,但作為一個占位符,它被指定為完全隨機的主題。大約凌晨2點,我和Chris有了一個訓(xùn)練有素的模型,是時候把我們的努力結(jié)合起來了。

理論上,在Python中構(gòu)建算法和網(wǎng)站應(yīng)該是很簡單的,因為我們可以將它直接插入到站點中的一個函數(shù)中。我已經(jīng)習(xí)慣通過與我的團隊合作將R轉(zhuǎn)換為ci來生產(chǎn)模型,因此,用pickle將模型序列化并直接加載到應(yīng)用程序的能力當(dāng)然是很方便的,并且讓我們能夠靈活地使用我們實現(xiàn)的模型。

但這并不意味著部署就是十分順利的!我們遇到的兩個最大的問題是:

使用nltk Heroku。最初使用nltk庫進行標(biāo)記化,因為它是Python自然語言處理最強大的工具包。但是它是一個龐大而又笨重的庫,開始在Heroku上運行一些關(guān)于安裝和使用它的模糊錯誤消息。為了方便,最終切換到gensim(已經(jīng)需要進行主題建模)的記號賦予器,這需要重新培訓(xùn)算法。

Python 2和3之間的pickle:可以在python3上安裝這個模型,但是用來查詢文章文本的Goose,不是Python 3兼容的,我們的生產(chǎn)站點必須在python2中。這就是我們在Python 2和3之間遇到了bug的時候。那時是凌晨4點,修復(fù)需要一些非常不雅的黑客攻擊。

最初考慮將機器學(xué)習(xí)過程作為一個微服務(wù)(通過網(wǎng)站傳遞文本內(nèi)容以及返回分類的獨立的服務(wù))。它將會使機器學(xué)習(xí)算法的切換變得更加輕松(給web團隊一個API端點,而不是代碼和一個軟件包需求列表)。

交流和分享

而且,我們在taggernews.com網(wǎng)站上有一個實時網(wǎng)站。從那以后我們改變了網(wǎng)站,但是當(dāng)我們在凌晨4點30分提交項目的時候它看起來是這樣的:

 

Tagger News可以自動對Hacker News的文章進行分類和排序

# HackDisrupt pic.twitter.com/2mEbrGXIce

——TechCrunch(@TechCrunch),2017年5月14日

演講結(jié)束后,TechCrunch采訪了我們,寫了一篇關(guān)于我們的項目的文章,在這些黑客馬拉松活動中,我們是第一個!黑客馬拉松結(jié)束后,我決定完成這個剩余部分,并將TechCrunch的文章提交給Hacker News,我們很高興用戶可以在社區(qū)看到并且喜歡:

 

我們在產(chǎn)品搜尋上也做得很好。

根據(jù)Google Analytics的數(shù)據(jù),昨天Tagger News大概有6,000訪客,而且數(shù)量還在繼續(xù)增長。我們也很緊張當(dāng)訪問量達到更多的時候,應(yīng)用程序會如何處理——我們在凌晨4:30完成的,而且沒有足夠的時間進行測試。但是除了一些關(guān)于設(shè)計的評論和一些無意中錯誤分類的文章,反饋還是非常積極的!該網(wǎng)站不斷添加新故事,而且大部分內(nèi)容都是正確分類的。它是一個概念的證明,但是是一個功能性的,它讓我們嘗試一個有趣的分類問題并把方法付諸實踐。 

責(zé)任編輯:龐桂玉 來源: 36大數(shù)據(jù)
相關(guān)推薦

2023-03-02 08:19:43

不加鎖程序實時性

2022-08-24 15:08:19

模型數(shù)據(jù)技術(shù)

2023-03-27 13:00:13

Javascript前端

2018-12-07 11:15:20

設(shè)置Windows 10命令

2018-07-31 16:20:12

Windows 10Windows密碼

2019-10-16 11:52:15

MIT機器學(xué)習(xí)

2022-11-15 11:02:21

2019-09-03 09:55:48

DevOps云計算安全

2021-02-19 09:44:00

云計算IT服務(wù)IT團隊

2019-09-10 08:00:00

微軟Account網(wǎng)站瀏覽器

2020-10-13 09:27:18

電腦Windows軟件

2018-06-27 23:10:12

數(shù)據(jù)中心IT管理運維

2024-09-06 08:36:34

2019-07-26 11:51:20

云計算IT系統(tǒng)

2016-01-12 10:38:58

Angular.js代碼調(diào)試

2020-08-11 10:25:38

數(shù)據(jù)成本數(shù)據(jù)大數(shù)據(jù)

2017-12-05 13:25:40

PHP開發(fā)服務(wù)器內(nèi)存

2016-12-28 19:16:55

大數(shù)據(jù)數(shù)據(jù)庫技術(shù)

2016-12-30 14:01:44

數(shù)據(jù)庫投入

2021-07-13 06:23:10

petite-vueVite源碼
點贊
收藏

51CTO技術(shù)棧公眾號