概覽
完整的代碼可以從這里下載:
介紹老實(shí)說(shuō),你在亞馬遜上有注意到網(wǎng)站為你推薦的內(nèi)容嗎(Recommended for you部分)? 自從幾年前我發(fā)現(xiàn)機(jī)器學(xué)習(xí)可以增強(qiáng)這部分內(nèi)容以來(lái),我就迷上了它。每次登錄Amazon時(shí),我都會(huì)密切關(guān)注該部分。 Netflix、谷歌、亞馬遜、Flipkart等公司花費(fèi)數(shù)百萬(wàn)美元完善他們的推薦引擎是有原因的,因?yàn)檫@是一個(gè)強(qiáng)大的信息獲取渠道并且提高了消費(fèi)者的體驗(yàn)。 讓我用一個(gè)最近的例子來(lái)說(shuō)明這種作用。我去了一個(gè)很受歡迎的網(wǎng)上市場(chǎng)購(gòu)買(mǎi)一把躺椅,那里有各種各樣的躺椅,我喜歡其中的大多數(shù)并點(diǎn)擊了查看了一把人造革手動(dòng)躺椅。 請(qǐng)注意頁(yè)面上顯示的不同類(lèi)型的信息,圖片的左半部分包含了不同角度的商品圖片。右半部分包含有關(guān)商品的一些詳細(xì)信息和部分類(lèi)似的商品。 而這是我最喜歡的部分,該網(wǎng)站正在向我推薦類(lèi)似的商品,這為我節(jié)省了手動(dòng)瀏覽類(lèi)似躺椅的時(shí)間。 在本文中,我們將構(gòu)建自己的推薦系統(tǒng)。但是我們將從一個(gè)獨(dú)特的視角來(lái)處理這個(gè)問(wèn)題。我們將使用一個(gè)NLP概念--Word2vec,向用戶推薦商品。如果你覺(jué)得這個(gè)教程讓你有點(diǎn)小期待,那就讓我們開(kāi)始吧! 在文中,我會(huì)提及一些概念。我建議可以看一下以下這兩篇文章來(lái)快速?gòu)?fù)習(xí)一下
word2vec - 詞的向量表示我們知道機(jī)器很難處理原始文本數(shù)據(jù)。事實(shí)上,除了數(shù)值型數(shù)據(jù),機(jī)器幾乎不可能處理其他類(lèi)型的數(shù)據(jù)。因此,以向量的形式表示文本幾乎一直是所有NLP任務(wù)中最重要的步驟。 在這個(gè)方向上,最重要的步驟之一就是使用 word2vec embeddings,它是在2013年引入NLP社區(qū)的并徹底改變了NLP的整個(gè)發(fā)展。 事實(shí)證明,這些 embeddings在單詞類(lèi)比和單詞相似性等任務(wù)中是最先進(jìn)的。word2vec embeddings還能夠?qū)崿F(xiàn)像 有兩種?word2vec模型——Continuous Bag of Words模型和Skip-Gram模型。在本文中,我們將使用Skip-Gram模型。 首先讓我們了解word2vec向量或者說(shuō)embeddings是怎么計(jì)算的。 如何獲得word2vec embeddings?word2vec模型是一個(gè)簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)模型,其只有一個(gè)隱含層,該模型的任務(wù)是預(yù)測(cè)句子中每個(gè)詞的近義詞。然而,我們的目標(biāo)與這項(xiàng)任務(wù)無(wú)關(guān)。我們想要的是一旦模型被訓(xùn)練好,通過(guò)模型的隱含層學(xué)習(xí)到的權(quán)重。然后可以將這些權(quán)重用作單詞的embeddings。 讓我舉個(gè)例子來(lái)說(shuō)明word2vec模型是如何工作的。請(qǐng)看下面這句話: 假設(shè)單詞“teleport”(用黃色高亮顯示)是我們的輸入單詞。它有一個(gè)大小為2的上下文窗口。這意味著我們只考慮輸入單詞兩邊相鄰的兩個(gè)單詞作為鄰近的單詞。 注意:上下文窗口的大小不是固定的,可以根據(jù)我們的需要進(jìn)行更改。 現(xiàn)在,任務(wù)是逐個(gè)選擇鄰近的單詞(上下文窗口中的單詞),并給出詞匯表中每個(gè)單詞成為選中的鄰近單詞的概率。這聽(tīng)起來(lái)應(yīng)該挺直觀的吧? 讓我們?cè)倥e一個(gè)例子來(lái)詳細(xì)了解整個(gè)過(guò)程。 準(zhǔn)備訓(xùn)練數(shù)據(jù)我們需要一個(gè)標(biāo)記數(shù)據(jù)集來(lái)訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型。這意味著數(shù)據(jù)集應(yīng)該有一組輸入和對(duì)應(yīng)輸入的輸出。在這一點(diǎn)上,你可能有一些問(wèn)題,像:
等等。 然而我要告訴你的是:我們可以輕松地創(chuàng)建自己的標(biāo)記數(shù)據(jù)來(lái)訓(xùn)練word2vec模型。下面我將演示如何從任何文本生成此數(shù)據(jù)集。讓我們使用一個(gè)句子并從中創(chuàng)建訓(xùn)練數(shù)據(jù)。 第一步: 黃色高亮顯示的單詞將作為輸入,綠色高亮顯示的單詞將作為輸出單詞。我們將使用2個(gè)單詞的窗口大小。讓我們從第一個(gè)單詞作為輸入單詞開(kāi)始。 所以,關(guān)于這個(gè)輸入詞的訓(xùn)練樣本如下: 第二步: 接下來(lái),我們將第二個(gè)單詞作為輸入單詞。上下文窗口也會(huì)隨之移動(dòng)?,F(xiàn)在,鄰近的單詞是“we”、“become”和“what”。 新的訓(xùn)練樣本將會(huì)被添加到之前的訓(xùn)練樣本中,如下所示: 我們將重復(fù)這些步驟,直到最后一個(gè)單詞。最后,這句話的完整訓(xùn)練數(shù)據(jù)如下: 我們從一個(gè)句子中抽取了27個(gè)訓(xùn)練樣本,這是我喜歡處理非結(jié)構(gòu)化數(shù)據(jù)的許多方面之一——憑空創(chuàng)建了一個(gè)標(biāo)記數(shù)據(jù)集。 獲得 word2vec Embeddings現(xiàn)在,假設(shè)我們有一堆句子,我們用同樣的方法從這些句子中提取訓(xùn)練樣本。我們最終將獲得相當(dāng)大的訓(xùn)練數(shù)據(jù)。 假設(shè)這個(gè)數(shù)據(jù)集中有5000個(gè)惟一的單詞,我們希望為每個(gè)單詞創(chuàng)建大小為100維的向量。然后,對(duì)于下面給出的word2vec架構(gòu):
輸入將是一個(gè)熱編碼向量,而輸出層將給出詞匯表中每個(gè)單詞都在其附近的概率。 一旦對(duì)該模型進(jìn)行訓(xùn)練,我們就可以很容易地提取學(xué)習(xí)到的權(quán)值矩陣 正如你在上面看到的,權(quán)重矩陣的形狀為5000 x 100。這個(gè)矩陣的第一行對(duì)應(yīng)于詞匯表中的第一個(gè)單詞,第二個(gè)對(duì)應(yīng)于第二個(gè)單詞,以此類(lèi)推。 這就是我們?nèi)绾瓮ㄟ^(guò)word2vec得到固定大小的詞向量或embeddings。這個(gè)數(shù)據(jù)集中相似的單詞會(huì)有相似的向量,即指向相同方向的向量。例如,單詞“car”和“jeep”有類(lèi)似的向量: ![]() 這是對(duì)word2vec如何在NLP中使用的高級(jí)概述。 在我們開(kāi)始構(gòu)建推薦系統(tǒng)之前,讓我問(wèn)你一個(gè)問(wèn)題。如何將word2vec用于非nlp任務(wù),如商品推薦?我相信自從你讀了這篇文章的標(biāo)題后,你就一直在想這個(gè)問(wèn)題。讓我們一起解出這個(gè)謎題。 在非文本數(shù)據(jù)上應(yīng)用word2vec模型你能猜到word2vec用來(lái)創(chuàng)建文本向量表示的自然語(yǔ)言的基本特性嗎? 是文本的順序性。每個(gè)句子或短語(yǔ)都有一個(gè)單詞序列。如果沒(méi)有這個(gè)順序,我們將很難理解文本。試著解釋下面這句話:
這個(gè)句子沒(méi)有順序,我們很難理解它,這就是為什么在任何自然語(yǔ)言中,單詞的順序是如此重要。正是這個(gè)特性讓我想到了其他不像文本具有順序性質(zhì)的數(shù)據(jù)。 其中一類(lèi)數(shù)據(jù)是消費(fèi)者在電子商務(wù)網(wǎng)站的購(gòu)買(mǎi)行為。大多數(shù)時(shí)候,消費(fèi)者的購(gòu)買(mǎi)行為都有一個(gè)模式,例如,一個(gè)從事體育相關(guān)活動(dòng)的人可能有一個(gè)類(lèi)似的在線購(gòu)買(mǎi)模式: ![]() 如果我們可以用向量表示每一個(gè)商品,那么我們可以很容易地找到相似的商品。因此,如果用戶在網(wǎng)上查看一個(gè)商品,那么我們可以通過(guò)使用商品之間的向量相似性評(píng)分輕松地推薦類(lèi)似商品。 但是我們?nèi)绾蔚玫竭@些商品的向量表示呢?我們可以用word2vec模型來(lái)得到這些向量嗎? 答案當(dāng)然是可以的! 把消費(fèi)者的購(gòu)買(mǎi)歷史想象成一句話,而把商品想象成這句話的單詞: ![]() 更進(jìn)一步,讓我們研究在線零售數(shù)據(jù),并使用word2vec構(gòu)建一個(gè)推薦系統(tǒng)。 案例研究:使用Python中的word2vec進(jìn)行在線商品推薦現(xiàn)在讓我們?cè)僖淮未_定我們的問(wèn)題和需求: 我們被要求創(chuàng)建一個(gè)系統(tǒng),根據(jù)消費(fèi)者過(guò)去的購(gòu)買(mǎi)行為,自動(dòng)向電子商務(wù)網(wǎng)站的消費(fèi)者推薦一定數(shù)量的商品。 我們將使用一個(gè)在線零售數(shù)據(jù)集,你可以從這個(gè)鏈接下載:
讓我們啟動(dòng)Jupyter Notebook,快速導(dǎo)入所需的庫(kù)并加載數(shù)據(jù)集。 import pandas as pd
![]() 以下是該數(shù)據(jù)集中字段的描述:
df.shape
數(shù)據(jù)集包含541,909個(gè)記錄,這對(duì)于我們建立模型來(lái)說(shuō)相當(dāng)不錯(cuò)。 處理缺失數(shù)據(jù)# 檢查缺失值數(shù)據(jù) ![]() 由于我們有足夠的數(shù)據(jù),我們將刪除所有缺少值的行。
準(zhǔn)備數(shù)據(jù)讓我們將StockCode轉(zhuǎn)換為string數(shù)據(jù)類(lèi)型: df['StockCode']= df['StockCode'].astype(str) 讓我們來(lái)看看我們的數(shù)據(jù)集中消費(fèi)者的數(shù)量:
Output: 4372 在我們的數(shù)據(jù)集中有4,372個(gè)消費(fèi)者,對(duì)于這些消費(fèi)者,我們將提取他們的購(gòu)買(mǎi)歷史。換句話說(shuō),我們可以有4372個(gè)購(gòu)買(mǎi)序列。 留出數(shù)據(jù)集的一小部分用于驗(yàn)證是一個(gè)很好的方法。因此,我將使用90%消費(fèi)者的數(shù)據(jù)來(lái)創(chuàng)建word2vec embeddings。讓我們開(kāi)始分割數(shù)據(jù)。
我們將在數(shù)據(jù)集中為訓(xùn)練集和驗(yàn)證集創(chuàng)建消費(fèi)者購(gòu)買(mǎi)的序列。 # 存儲(chǔ)消費(fèi)者的購(gòu)買(mǎi)歷史
為商品構(gòu)建word2vec Embeddings# 訓(xùn)練word2vec模型 因?yàn)槲覀儾淮蛩氵M(jìn)一步訓(xùn)練模型,所以我們?cè)谶@里調(diào)用
讓我們來(lái)看看“model”的相關(guān)參數(shù): print(model)
我們的模型有3151個(gè)唯一的單詞,每個(gè)單詞的向量大小為100維。接下來(lái),我們將提取詞匯表中所有單詞的向量,并將其存儲(chǔ)在一個(gè)地方,以便于訪問(wèn)。 # 提取向量
可視化word2vec Embeddings可視化你所創(chuàng)建的embeddings是很有幫助的。在這里,我們有100維的Embeddings。我們甚至無(wú)法可視化4維空間,更不用說(shuō)100維了,那么我們?cè)趺醋瞿? 我們將使用UMAP算法將商品Embeddings的維數(shù)從100降到2,UMAP算法通常用于降維。 import umap ![]() 這個(gè)圖中的每個(gè)點(diǎn)都是一個(gè)商品。如你所見(jiàn),這些數(shù)據(jù)點(diǎn)有幾個(gè)很小的集群。這些是相似商品的組。 開(kāi)始推薦商品恭喜你!我們終于準(zhǔn)備好我們的在線零售數(shù)據(jù)集中每個(gè)商品的word2vec embeddings ?,F(xiàn)在,我們的下一步是為某個(gè)商品或某個(gè)商品的向量推薦類(lèi)似的商品。 讓我們首先創(chuàng)建一個(gè)商品id和商品描述的字典,以便輕松地將商品的描述映射到其id,反之亦然。
# 字典測(cè)試
我定義了下面的函數(shù)。將一個(gè)商品的向量(n)作為輸入,返回前6個(gè)相似的商品: def similar_products(v, n = 6): 讓我們通過(guò)傳遞商品編號(hào)為'90019A' (‘SILVER M.O.P ORBIT BRACELET’)的商品:
Output: 太酷了!結(jié)果還是非常相關(guān),并且與輸入商品匹配得很好。然而,這個(gè)輸出僅基于單個(gè)商品的向量。如果我們想根據(jù)他或她過(guò)去的多次購(gòu)買(mǎi)來(lái)推薦商品呢? 一個(gè)簡(jiǎn)單的解決方案是取用戶迄今為止購(gòu)買(mǎi)的所有商品的向量的平均值,并使用這個(gè)結(jié)果向量找到類(lèi)似的商品。我們將使用下面的函數(shù),它接收一個(gè)商品id列表,并返回一個(gè)100維的向量,它是輸入列表中商品的向量的平均值:
回想一下,為了驗(yàn)證目的,我們已經(jīng)創(chuàng)建了一個(gè)單獨(dú)的購(gòu)買(mǎi)序列列表?,F(xiàn)在剛好可以利用它。 len(purchases_val[0])
用戶購(gòu)買(mǎi)的第一個(gè)商品列表的長(zhǎng)度為314。我們將把這個(gè)驗(yàn)證集的商品序列傳遞給aggregate_vectors函數(shù)。 aggregate_vectors(purchases_val[0]).shape
函數(shù)返回了一個(gè)100維的數(shù)組。這意味著函數(shù)運(yùn)行正?!,F(xiàn)在我們可以用這個(gè)結(jié)果得到最相似的商品: similar_products(aggregate_vectors(purchases_val[0]))
結(jié)果,我們的系統(tǒng)根據(jù)用戶的整個(gè)購(gòu)買(mǎi)歷史推薦了6款商品。此外,你也可以根據(jù)最近幾次購(gòu)買(mǎi)情況來(lái)進(jìn)行商品推薦。 下面我只提供了最近購(gòu)買(mǎi)的10種商品作為輸入: similar_products(aggregate_vectors(purchases_val[0][-10:]))
你可以隨意修改這段代碼,并嘗試從驗(yàn)證集中的更多商品序列進(jìn)行商品推薦。也可以進(jìn)一步優(yōu)化這段代碼或使其更好。 結(jié)語(yǔ)最后,你可以嘗試在類(lèi)似的非文本序列數(shù)據(jù)上實(shí)現(xiàn)此代碼。例如,音樂(lè)推薦就是一個(gè)很好的用例。 |
|
來(lái)自: 西北望msm66g9f > 《政經(jīng)文》