利用 Python、SciKit 和文本分類來實(shí)現(xiàn)行為分析
來源:易賢網(wǎng) 閱讀:1353 次 日期:2015-05-04 14:37:01
溫馨提示:易賢網(wǎng)小編為您整理了“利用 Python、SciKit 和文本分類來實(shí)現(xiàn)行為分析”,方便廣大網(wǎng)友查閱!

簡介

幾乎所有人都會(huì)購物。從基本的必需品(比如食品)到娛樂產(chǎn)品(比如音樂專輯),我們會(huì)購買各種各樣的物品。當(dāng)購物時(shí),我們不僅會(huì)尋找在生活中用到的東西,也會(huì)在表達(dá)我們對某些社會(huì)群體的興趣。我們的在線行為和決策塑造了我們自己的行為特征。

當(dāng)購買產(chǎn)品時(shí),該產(chǎn)品具有多個(gè)屬性,這使得它類似或不同于其他產(chǎn)品。例如,一個(gè)產(chǎn)品的價(jià)格、大小或類型都是它的不同特征。除了這些數(shù)值或枚舉類的結(jié)構(gòu)化屬性之外,還有非結(jié)構(gòu)化的文本屬性。例如,產(chǎn)品描述或客戶評論的文本也構(gòu)成了其明顯的特征。

對于從這些非結(jié)構(gòu)化文本屬性中提取有意義的東西而言,文本分析和其他自然語言處理(NLP)技術(shù)非常有幫助,而這對行為分析等任務(wù)又很有價(jià)值。

本文將介紹如何使用文本分類來構(gòu)建行為描述模型。文中將展示如何使用 SciKit 這個(gè)強(qiáng)大的基于 Python 的機(jī)器學(xué)習(xí)包來實(shí)現(xiàn)模型構(gòu)造和評估,還會(huì)對模擬的客戶及其產(chǎn)品購買歷史記錄應(yīng)用該模型。在這種特定的場景中,將會(huì)構(gòu)造一個(gè)模型,向客戶分配一些音樂聽眾感興趣的特色內(nèi)容,比如狂歡、哥特或金屬音樂。該分配是以每個(gè)客戶的購買的具體產(chǎn)品和相應(yīng)的文本產(chǎn)品說明為基礎(chǔ)的。

音樂行為描述場景

請看下面的場景。您有一個(gè)包含許多客戶個(gè)人資料的數(shù)據(jù)集。每個(gè)客戶個(gè)人資料都包括客戶已經(jīng)購買的所有產(chǎn)品的一個(gè)簡潔的、基于自然語言的描述列表。下面是一款靴子的示例產(chǎn)品描述。

描述:這一款男裝搭扣靴子是一雙哥特式靴子,具有暗波紋亞文化氣息,靴子的鉚釘頭帶來了業(yè)內(nèi)的最新時(shí)尚​​。這款靴子采用了合成的人造皮革鞋面,鞋帶正面使用的是交叉扣,這種交叉一直延續(xù)到了鞋統(tǒng),鞋底是橡膠大底,底部采用了花紋底,而前幫則采用了戰(zhàn)斗風(fēng)格,內(nèi)側(cè)配有拉鏈,方便穿鞋和脫鞋。鞋統(tǒng) 13.5 英寸,腿部開口周長約 16 英寸。(鞋碼為 9.5。)風(fēng)格:男裝搭扣靴子。

我們的目標(biāo)是根據(jù)這些產(chǎn)品描述,將每位當(dāng)前用戶和未來用戶分類到某個(gè)行為配置文件中。

如下所示,負(fù)責(zé)人使用產(chǎn)品示例來建立行為特征、行為模型、客戶特征,以及最終的客戶行為特征。

圖 1. 構(gòu)建客戶行為特征的高層次方法

第一步是假設(shè)負(fù)責(zé)人的作用,并向系統(tǒng)提供對每個(gè)行為特征的理解。實(shí)現(xiàn)此操作的一種方法是手動(dòng)將每個(gè)產(chǎn)品的示例放入系統(tǒng)。示例有助于定義行為特征。本次討論將用戶劃分到以下音樂行為描述之一:

朋克

哥特

嘻哈

金屬

狂歡

向定義為朋克的產(chǎn)品提供示例,比如朋克專輯和樂隊(duì)的描述,例如,Sex Pistols 的 "Never Mind the Bollocks"。其他項(xiàng)目可能包括與發(fā)型或鞋類相關(guān)的產(chǎn)品,比如雞冠頭和 Doc Marten 皮靴。

庫、軟件和數(shù)據(jù)的建立

這篇文章中所使用的全部數(shù)據(jù)和源代碼都可以從 bpro project on JazzHub 下載。在下載并解壓 tar 文件后,需要確保您擁有 Python,SciKit Learn(機(jī)器學(xué)習(xí)和文本分析包),以及所有的依賴關(guān)系(比如 numpy、scipy,等等)。如果使用的是 Mac,那么 SciPy Superpack 可能是您最好的選擇。

在解壓 tar 文件后,您會(huì)注意到兩個(gè)包含簡介數(shù)據(jù)的 YAML 文件。產(chǎn)品描述是通過讀取種子語料(或文檔的正文)來人工生成的。在生成產(chǎn)品描述的過程中,會(huì)考慮到詞語在產(chǎn)品描述中出現(xiàn)的頻率。清單 1 是一個(gè)人工的產(chǎn)品描述。

備注:下面的描述并不是一個(gè)真正的自然語言描述,但在實(shí)際情況中可能會(huì)出現(xiàn)這種描述。

清單 1. 人工的產(chǎn)品描述

customer single clothes for his size them 1978 course group

rhymes have master record-breaking group few starts heard

blue ending company that the band the music packaged

master kilmister not trousers got cult albums heart

commentary cut 20.85 tour...

這個(gè)分析包括兩個(gè)數(shù)據(jù)文件:

customers.yaml:包括一個(gè)客戶列表。對于每個(gè)客戶,包括一個(gè)產(chǎn)品描述列表,以及目標(biāo)標(biāo)簽,或正確的 行為描述。正確的行為描述是指您知道的那個(gè)行為描述是正確的。例如,在實(shí)際的場景中,將會(huì)檢查哥特用戶的特征數(shù)據(jù),以便驗(yàn)證這些購買行為表明該用戶是一個(gè)哥特用戶。

behavioral_profiles.yaml:包含描述文件(朋克、哥特等)的列表,以及定義該描述文件的產(chǎn)品描述的樣本集。

您可以通過運(yùn)行命令 python bpro.py -g 生成自己的模擬文件。

備注:必須先在種子目錄中填充一些內(nèi)容,定義感興趣的流派。進(jìn)入種子目錄,打開任何文件,并了解相關(guān)說明。您可以操縱 bpro.py 文件中的參數(shù),以改變產(chǎn)品描述長度、噪聲量、訓(xùn)練示例的數(shù)量或其他參數(shù)。

構(gòu)建行為描述模型

首先,使用 SciKit 的 CountVectorizer 構(gòu)建一個(gè)基于術(shù)語計(jì)數(shù)的簡單語料庫描述。語料庫對象是包含產(chǎn)品描述的一個(gè)簡單字符串列表。

清單 2. 構(gòu)建一個(gè)簡單的術(shù)語計(jì)數(shù)

vectorizer = CountVectorizer(gmin_df=1)

corpus=[]

for bp in behavioral_profiles:

for pd in bp.product_descriptions:

corpus.append(pd.description)

SciKit 還有其他更先進(jìn)的矢量器(vectorizers),比如 TFIDFVectorizer,它使用術(shù)語頻率/逆文檔頻率 (TF/IDF) 加權(quán)來存儲(chǔ)文檔術(shù)語。TF/IDF 表示有助于讓獨(dú)特的術(shù)語(比如 Ozzy、 raver和 Bauhaus)的權(quán)重比反復(fù)出現(xiàn)的術(shù)語(比如 and、 the 和 for)的權(quán)重還要高。

接下來,將產(chǎn)品描述劃分為單個(gè)單詞,并建立一個(gè)術(shù)語字典。分析器在匹配過程中找到的每個(gè)術(shù)語被賦予一個(gè)與在結(jié)果矩陣中的列相對應(yīng)的惟一整數(shù)索引:

fit_corpus = vectorizer.fit_transform(corpus)

備注:這個(gè)分詞器配置(tokenizer configuration)也丟棄了單字符單詞。

您可以使用 print vectorizer.get_feature_names()[200:210] 打印出一些特性,看看哪些單詞被分詞。此命令的輸出如下所示。

清單 3. print 命令的輸出

[u'better', u'between', u'beyond', u'biafra', u'big',

u'bigger', u'bill', u'billboard', u'bites', u'biting']

請注意,當(dāng)前矢量器沒有詞干化的單詞。詞干化 是為詞尾變化或派生的單詞得到一個(gè)共同的基礎(chǔ)或詞根形式的過程。例如,big 是在前面列表中的 bigger 的一個(gè)常見詞干。SciKit 不處理更復(fù)雜的分詞(比如詞干化、詞簇化和復(fù)合斷詞),但您可以使用自定義分詞器,比如那些來自 Natural Language Toolkit (NLTK) 庫的那些分詞器。關(guān)于自定義分詞器的示例,請參見 scikit-learn.org。

分詞過程(比如,詞干化)有助于減少所需的訓(xùn)練實(shí)例的數(shù)量,因?yàn)槿绻硞€(gè)單詞有多種形式,而且不要求對每種形式都提供統(tǒng)計(jì)表示。您可以使用其他技巧來減少培訓(xùn)需求,比如使用類型字典。例如,如果您有所有哥特樂隊(duì)的樂隊(duì)名稱列表,那么可以創(chuàng)建一個(gè)共同的文字標(biāo)記,比如 goth_band,并在生成特性之前將它添加到您的描述中。通過使用這種方法,如果在描述中第一次遇到某個(gè)樂隊(duì),該模型處理此樂隊(duì)的方式會(huì)與處理模型可以理解其模式的其他樂隊(duì)的方式相同。對于本文中的模擬數(shù)據(jù),我們要關(guān)心的不是減少培訓(xùn)需求,所以我們應(yīng)該繼續(xù)執(zhí)行下一個(gè)步驟。

在機(jī)器學(xué)習(xí)中,出現(xiàn)這樣的監(jiān)督分類問題是因?yàn)槭紫纫獮橐唤M觀察定義一組特性和相應(yīng)的目標(biāo),或者正確的標(biāo)簽。然后,所選擇的算法會(huì)嘗試相應(yīng)的模型,該模型會(huì)找到最適合的數(shù)據(jù),并且參照已知的數(shù)據(jù)集來最大限度地減少錯(cuò)誤。因此,我們的下一步操作是構(gòu)建特性和目標(biāo)標(biāo)簽矢量(參見清單 4)。隨機(jī)化觀察總是一個(gè)好辦法,因?yàn)樗梢苑乐跪?yàn)證技術(shù)沒有這樣做。

清單 4. 構(gòu)建特性和目標(biāo)標(biāo)簽矢量

data_target_tuples=[ ]

for bp in behavioral_profiles:

for pd in bp.product_descriptions:

data_target_tuples.append((bp.type, pd.description))

shuffle(data_target_tuples)

接下來,組裝矢量,如清單 5 所示。

清單 5. 組裝矢量

X_data=[ ]

y_target=[ ]

for t in data_target_tuples:

v = vectorizer.transform([t[1]]).toarray()[0]

X_data.append(v)

y_target.append(t[0])

X_data=np.asarray(X_data)

y_target=np.asarray(y_target)

現(xiàn)在,您可以選擇一個(gè)分類器并修整您的行為描述模型。在此之前,最好先評估模型,這樣做只是為了確保該模型可用,然后再讓客戶試用。

評估行為描述模型

首先使用 Linear Support Vector Machine (SVM),對于此類稀疏矢量問題,這是一個(gè)匹配度很高的不錯(cuò)的模型。使用代碼 linear_svm_classifier = SVC(kernel="linear", C=0.025)。

備注:您可以通過修改這個(gè)模式初始化代碼來切換到其他模型類型。如果需要試用不同的模型類型,那么可以使用這個(gè)分類器映射,它為一些常見的選項(xiàng)設(shè)置了初始化。

清單 6. 使用分類器的映射

classifier_map = dict()

classifier_map["Nearest Neighbors"]=KNeighborsClassifier(3)

classifier_map["Linear SVM"]=SVC(kernel="linear", C=0.025)

classifier_map["RBF SVM"]= SVC(gamma=2, C=1)

classifier_map["Decision Tree"]=DecisionTreeClassifier(max

_depth=5)

classifier_map["Random Forest"]=RandomForestClassifier

(max_depth=5, n_estimators=10, max_features=1)

classifier_map["AdaBoost"]=AdaBoostClassifier()

classifier_map["Naive Bayes"]=GaussianNB()

classifier_map["LDA"]=LDA()

classifier_map["QDA"]=QDA()

因?yàn)檫@是一個(gè)多級分類問題(也就是說,在該問題中,您需要選擇的可能類別多于兩個(gè)),您還需要指定相應(yīng)的策略。一種常見的方法是執(zhí)行一對全的分類。例如,來自 goth 類的產(chǎn)品描述被用于定義一個(gè)類,而另一個(gè)類包括來自其他所有類( metal、rave,等等)的示例描述。最后,作為驗(yàn)證的一部分,您需要確保修整該模型的數(shù)據(jù)不是測試數(shù)據(jù)。一個(gè)常見的技術(shù)是使用交叉折疊驗(yàn)證法。您可以使用此技術(shù)五次,這意味著穿過數(shù)據(jù)的五個(gè)部分的分區(qū)五次。在每次穿過時(shí),五分之四的數(shù)據(jù)被用于修整,其余五分之一用于測試。

清單 7. 交叉折疊驗(yàn)證

scores = cross_validation.cross_val_score(OneVsRestClassifier

(linear_svm_classifier), X_data, y_target, cv=2)

print("Accuracy using %s:%0.2f (+/- %0.2f) and %d folds"

% ("Linear SVM", scores.mean(), scores.std() * 2, 5))

盡管如此,您仍會(huì)得到完全精確的結(jié)果,這標(biāo)志著模擬數(shù)據(jù)有點(diǎn)過于完美。當(dāng)然,在現(xiàn)實(shí)生活中,始終會(huì)有干擾因素,因?yàn)槿后w之間的完美界限并不總是存在。例如,有 goth punk 的問題流派,所以像 Crimson Scarlet 這樣的樂隊(duì)可能會(huì)同時(shí)進(jìn)入 goth 和 punk 的訓(xùn)練示例。您可以試一下 bpro 下載軟件包 中的種子數(shù)據(jù),以便更好地了解這種類型的干擾因素。

在了解一個(gè)行為描述模型之后,您可以再繞回來,用您的所有數(shù)據(jù)修整它。

清單 8. 修整行為描述模型

behavioral_profiler = SVC(kernel="linear", C=0.025)

behavioral_profiler.fit(X_data, y_target)

試用行為模型

現(xiàn)在,您可以玩一下模型,鍵入一些虛構(gòu)的產(chǎn)品描述,看看模型如何工作。

清單 9. 試用模型

print behavioral_profiler.predict(vectorizer.transform(['Some black

Bauhaus shoes to go with your Joy Division hand bag']).toarray()[0])

請注意,它的確會(huì)返回 ['goth']。如果刪除單詞 Bauhaus 并重新運(yùn)行,您可能會(huì)注意到,它現(xiàn)在會(huì)返回 ['punk']。

對您的客戶應(yīng)用行為模型

繼續(xù)將修整過的模型應(yīng)用于客戶及其購買的產(chǎn)品描述。

清單 10. 將修整過的模型應(yīng)用于我們的客戶及其產(chǎn)品描述

predicted_profiles=[ ]

ground_truth=[ ]

for c in customers:

customer_prod_descs = ' '.join(p.description for p in

c.product_descriptions)

predicted = behavioral_profiler.predict(vectorizer

.transform([customer_product_descriptions]).toarray()[0])

predicted_profiles.append(predicted[0])

ground_truth.append(c.type)

print "Customer %d, known to be %s, was predicted to

be %s" % (c.id,c.type,predicted[0])

最后,計(jì)算準(zhǔn)確性,看看您可以多頻繁地分析購物者。

清單 11. 計(jì)算準(zhǔn)確性

a=[x1==y1 for x1, y1 in zip(predicted_profiles,ground_truth)]

accuracy=float(sum(a))/len(a)

print "Percent Profiled Correctly %.2f" % accuracy

如果使用所提供的默認(rèn)描述數(shù)據(jù),結(jié)果應(yīng)該是 95%。如果這是真實(shí)的數(shù)據(jù),那么這是一個(gè)相當(dāng)不錯(cuò)的準(zhǔn)確率。

擴(kuò)展模型

現(xiàn)在,我們已經(jīng)構(gòu)建和測試了模型,可以把它應(yīng)用于數(shù)以百萬計(jì)的客戶個(gè)人資料。您可以使用 MapReduce 框架,并將修整后的行為分析器發(fā)送到工作節(jié)點(diǎn)。然后,每個(gè)工作節(jié)點(diǎn)都會(huì)得到一批客戶個(gè)人資料及其購買歷史,并應(yīng)用模型。保存結(jié)果。此時(shí),模型已被應(yīng)用,您的客戶被分配為一個(gè)行為描述。您可以在很多方面使用該行為描述分配任務(wù)。例如,您可能決定用定制的促銷活動(dòng)來定位目標(biāo)客戶,或者使用行為描述作為產(chǎn)品推薦系統(tǒng)的輸入。

更多信息請查看IT技術(shù)專欄

更多信息請查看技術(shù)文章
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)