中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

手把手教你從有限的數(shù)據(jù)樣本中發(fā)掘價值(附代碼)

2019-05-22    來源:raincent

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用

本文是系列文章中的一篇,作者對滑鐵盧地區(qū)的Freedom of Information Requests數(shù)據(jù)集進行探索分析,展示了在實踐中拿到一批數(shù)據(jù)時(尤其像本文中的情況,數(shù)據(jù)很稀缺時),該如何一步步進行分析從而得到一些見解。作者的同事也對該數(shù)據(jù)集使用其他方法進行了分析,建議對NLP感興趣的讀者也一并閱讀,將大有裨益

最近我碰到了滑鐵盧地區(qū)的Open Data項目,連同它的Freedom of Information Requests數(shù)據(jù)集。我的同事Scott Jones已經(jīng)在一系列文章中使用機器學習(ML)技術(shù)對其進行了分析。由于數(shù)據(jù)不足,ML表現(xiàn)不佳。雖然Scott做了在這種情況下應該做的事情,即尋找更多數(shù)據(jù)。盡管數(shù)據(jù)很稀缺,但我仍然很好奇這些數(shù)據(jù)還能告訴我什么。畢竟數(shù)據(jù)總是有價值的。

在進入這段8分鐘的閱讀旅程之前,我想說你可以在Github上找到Jupyter notebook里的所有代碼和對這些數(shù)據(jù)的更多見解,由于內(nèi)容太多,文章里無法一一介紹。如果你不想閱讀notebook,可以在下面鏈接的相關(guān)文件中找到全部圖形結(jié)果。

Github相關(guān)鏈接:https://github.com/brodriguezmilla/foir

相關(guān)文件:https://github.com/brodriguezmilla/foir/blob/master/foir_all_figures.pdf

接下來,我向你介紹其中幾個分析的要點。

了解數(shù)據(jù)

我們使用pandas庫來實現(xiàn)這一步,以下是Open Data中的文件之一:

 

1999年的Freedom of Information Requests文件樣本 我們有18個文件,從1999年至2016年每年一個,總共有576個請求(Requests),令人驚訝地是全部都有相同的六列。我們將只使用三個主要列,來源(Source),請求摘要(Summary_of_Request)和決策(Decision)。

 

♦ Source。 這是發(fā)出請求的實體,即請求者。 通過查看多年來的信息,能夠?qū)⑵浜喜?ldquo;Business”,“Individual”,“Individual by Agent”,“Media”,“Business by Agent”和“Individual for dependant”。

♦ Summary_of_Request。 包含已由記錄員編輯過的請求。

♦ Decision。合并后的類別包括:“All information disclosed”,“Information disclosed in part”,“No records exist”,“Request withdrawn”,“Partly non-existent”,“No information disclosed”,“Transferred”,“Abandoned”, “Correction refused”,“Correction granted”,“No additional records exist”。

這些列的相互之間關(guān)系如何?

描述性統(tǒng)計和探索性數(shù)據(jù)分析

在本節(jié)中,我們將重點關(guān)注Source和Decision列。稍后我們將使用一些NLP工具分析這些請求。以下是數(shù)據(jù)的分布:

 

 

大約60%的請求是“All information disclosed”或“Information disclosed in part”。 至少有七種類型的決策少于25個實例,其中一個最重要的決策是“No information disclosed”。 因此,我們不僅數(shù)據(jù)量有限,而且還存在不平衡的情況。 對于機器學習來說這都不太好。

通過另一種數(shù)據(jù)視圖,即Source 與 Decision的透視表,我們看到大多數(shù)請求都是由“Business”,“Individual”和“Individual by Agent”發(fā)起的。

 

 

將每個來源的數(shù)字進行處理,使每一行加起來等于1,我們看到主要的三個來源表現(xiàn)良好,因為“All information disclosed”每個都超過30%,“Information disclosed in part”則增加了18%至34%,甚至更多。 兩者相加在50%以上。此外,“Individual by Agent”的成功率高于“Individual”。幾乎沒有請求的“Media”表現(xiàn)不佳,只有10%的請求被決策為“All information disclosed”。

 

 

自然語言處理(NLP)

現(xiàn)在我們繼續(xù)分析Summary_of_Requests列。為此,我們轉(zhuǎn)投自然語言處理庫,例如NLTK和spaCy,以及scikit-learn的幫助。

從廣義上講,在分析任何文本之前,需要做的步驟其實很少(參見Susan Li的帖子):

https://towardsdatascience.com/topic-modelling-in-python-with-nltk-and-gensim-4ef03213cd21

對文本進行分詞:將文本分解為單個特殊實體/單詞,即token。
刪除任何不需要的字符,比如回車換行和標點符號,像' - ','...','“'等。
刪除網(wǎng)址或?qū)⑵涮鎿Q為某個單詞,例如“URL”。
刪除網(wǎng)名或用某個單詞替換“@”,例如“screen_name”。
刪除單詞的大小寫。
刪除少于等于n個字符的單詞。在本例中,n = 3。
刪除停用詞,即某種語言中含義不大的詞。這些詞可能無助于對我們的文本進行分類。例如“a”,“the”,“and”等詞。但并沒有一個通用的停用詞列表。
詞形還原,它是將單詞的變種形式歸并在一起的過程,這樣它們就可以作為單個詞項進行分析,就可以通過單詞的詞目(lemma)或詞典形式來識別。

因此,在編寫了處理函數(shù)之后,我們可以對文本進行轉(zhuǎn)換:

def prepare_text_tlc(the_text):

text = clean_text(the_text)

text = parse_text(text)

tokens = tokenize(text)

tokens = replace_urls(tokens)

tokens = replace_screen_names(tokens)

tokens = lemmatize_tokens(tokens)

tokens = remove_short_strings(tokens, 3)

tokens = remove_stop_words(tokens)

tokens = remove_symbols(tokens)

return tokens

由于我們會持續(xù)處理此文本,因此我們將預處理過的文本作為新列“Edited_Summary”添加到dataframe中。

 

N元語法(N-grams)和詞云還能如何分析和可視化我們的文本呢?作為第一步,我們可以找到最常用的單詞和短語,即我們可以獲得一元語法(單個tokens)和 n元語法(n-tokens組)及它們在文本中的頻率。

 

def display_top_grams(gram, gram_length, num_grams):
gram_counter = Counter(gram)
if gram_length is 1:
name = 'unigrams'
elif gram_length is 2:
name = 'bigrams'
elif gram_length is 3:
name = 'trigrams'
else:
name = str(gram_length) + '-grams'
print("No. of unique {0}: {1}".format(name, len(gram_counter)))
for grams in gram_counter.most_common(num_grams):
print(grams)
return None

所以對于我們的一元語法:

并使用WordCloud:

 

 

那為什么“remove”這個詞如此突出?事實證明,出于隱私原因,原始請求中寫入的所有姓名,日期和位置都已刪除,并在Open Data的文件中被替換為“{location removed}”或“{date removed}”等短語。這種替換共有30多種變體。 使用正則表達式(regEx)來清理文本,我們得到了一個更好的詞云。這一次,我們也加入了二元語法。

 

 

看一下上面的詞云和三元語法:

 

 

我們看到有一些常見的短語,例如“ontario works”,“environmental site”,“grand river transit”,“rabies control”,“public health inspection”和“food bear illness”(亦如'food borne illness ' – 還記得我們之前曾把tokens進行了詞形還原)。 那么,這些短語在我們的文本中有多常見?包含這些短語的請求信息是否影響請求被批準的可能性?事實證明,46%的數(shù)據(jù)是那些類型的請求,這些短語沒有一個得到“No information disclosed”的決策,并且有明顯的趨勢:

 

 

例如,“rabies control”約有95%披露了全部或部分信息,而5%被轉(zhuǎn)移了。

對Summary_of_Request和Edited_Summary 列統(tǒng)計

我們已經(jīng)知道現(xiàn)有數(shù)據(jù)量是有限的,但到底多有限呢?好吧,只有7個請求超過100個單詞,而分詞后只剩1個。平均每個請求有21個單詞,而中位數(shù)為15,而分詞后平均為9個單詞,中位數(shù)為7。

 

 

 

 

詞性(POS)標記

在這里,我們使用spaCy來識別該文本是如何由名詞,動詞,形容詞等組成的。 我們還使用函數(shù)spacy.explain()來找出這些標記的含義。

full_text_nlp = nlp(full_text) # spaCy nlp()
tags = []
for token in full_text_nlp:
tags.append(token.tag_)
tags_df = pd.DataFrame(data=tags, columns=['Tags'])
print("Number of unique tag values:\
{0}".format(tags_df['Tags'].nunique()))
print("Total number of words: {0}".format(len(tags_df['Tags'])))
# Make a dataframe out of unique values
tags_value_counts = tags_df['Tags'].value_counts(dropna=True,
sort=True)
tags_value_counts_df = tags_value_counts.rename_axis(
'Unique_Values').reset_index(name='Counts')
# And normalizing the count values
tags_value_counts_df['Normalized_Count'] = tags_value_counts_df['Counts'] / len(tags_df['Tags'])
uv_decoded = []
for val in tags_value_counts_df['Unique_Values']:
uv_decoded.append(spacy.explain(val))
tags_value_counts_df['Decoded'] = uv_decoded
tags_value_counts_df.head(10)

 

同時將類別合并,例如“名詞,單數(shù)或大量”和“名詞,復數(shù)”,以形成更通用的版本,以下是這些請求的組成方式:

 

 

使用scikit-learn,Bokeh和t-SNE進行主題建模

在notebook中,我們使用不同的主題建模技術(shù),包括scikit-learn的隱含狄利克雷分布(LDA)函數(shù),潛在語義分析(LSA),并且用 CountVectorizer()和TfidfVectorizer()做對比,gensim的LDA,使用t-SNE用于降維,Bokeh和pyLDAvis用于可視化。 我們不會在此處附上完整代碼,所以鼓勵你去親自查看完整的notebook。鑒于我們數(shù)據(jù)的局限性,所有工具都還表現(xiàn)得不錯。下圖是一個亮點:

幾乎所有最常見的短語都在主題中出現(xiàn)了。正如預期的那樣,一些主題是明確的,例如“ontario works”或“environmental site”,而其他聚類則不然。

 

 

機器學習

我們已經(jīng)知道機器學習效果不會很好,但鑒于這是一個學習練習,我們?nèi)匀灰囈幌。在notebook中,我們比較了三種不同情況下的八種不同機器學習模型。我們無法按原樣比較完整數(shù)據(jù),因為某些情況只有極少數(shù)實例。例如,只有一個請求被“Correction granted”,因此當我們訓練模型時,該情況將要么在訓練集中,要么在測試集中。只有一個案例并不能提供一個良好的基礎(chǔ)。我們的選擇很少:

我們可以刪除少于15個實例的請求,稱之為“Over-15”。

我們將全部決議分成三個基本類別:

All information disclosed(加上“Correction granted”。)

Information disclosed in part(加上“Partly non-existent”。)

No information disclosed(加上' Transferred',' No records exist',' Correction refused',' No additional records exist',' Withdrawn'和' Abandoned'。)這會使我們的數(shù)據(jù)集更平衡。

我們可以刪掉少于15個實例的請求,并且刪掉沒有實際結(jié)果的決策,即撤回或拋棄的情況,稱之為“Independent”。

以下是結(jié)果:

 

 

總體而言,邏輯回歸和多項式樸素貝葉斯分類器結(jié)合tf-idf給出了更好的結(jié)果。 對我們的類別進行分箱(binning)似乎是最合乎邏輯的方法。

可以在以下Github鏈接中找到代碼和完整的結(jié)果:

Github鏈接:

https://github.com/brodriguezmilla/foi

原文標題:

When Data is Scarce… Ways to Extract Valuable Insights

原文鏈接:

https://towardsdatascience.com/when-data-is-scarce-ways-to-extract-valuable-insights-f73eca652009

標簽: [db:TAGG]

版權(quán)申明:本站文章部分自網(wǎng)絡,如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:2019如何玩轉(zhuǎn)人工智能,全球AI大牛給你答案

下一篇:任正非回應一切:美國低估了我們,華為5G絕不會受影響