Python程序設(shè)計(jì)與實(shí)踐大作業(yè)試驗(yàn)報(bào)告材料陸陽(yáng)孫勇裘升明_第1頁(yè)
Python程序設(shè)計(jì)與實(shí)踐大作業(yè)試驗(yàn)報(bào)告材料陸陽(yáng)孫勇裘升明_第2頁(yè)
Python程序設(shè)計(jì)與實(shí)踐大作業(yè)試驗(yàn)報(bào)告材料陸陽(yáng)孫勇裘升明_第3頁(yè)
Python程序設(shè)計(jì)與實(shí)踐大作業(yè)試驗(yàn)報(bào)告材料陸陽(yáng)孫勇裘升明_第4頁(yè)
Python程序設(shè)計(jì)與實(shí)踐大作業(yè)試驗(yàn)報(bào)告材料陸陽(yáng)孫勇裘升明_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、實(shí)用文檔浙江工商大學(xué)計(jì)算機(jī)與信息工程學(xué)院Python 程序設(shè)計(jì)與實(shí)踐大作業(yè)報(bào)告專 業(yè): 計(jì)科班 級(jí): 1404學(xué) 號(hào):1412190416、1412190415、1412190413姓 名: 陸陽(yáng),孫勇,裘昇明指導(dǎo)教師: 蒲飛2015 年 6 月 28 日實(shí)用文檔題目介紹:在真實(shí)的業(yè)務(wù)場(chǎng)景下,我們往往需要對(duì)所有商品的一個(gè)子集構(gòu)建個(gè)性化推薦 模型。在完成這件任務(wù)的過(guò)程中, 我們不僅需要利用用戶在這個(gè)商品子集上的行 為數(shù)據(jù),往往還需要利用更豐富的用戶行為數(shù)據(jù)。定義如下的符號(hào): U用戶集合I 商品全集P商品子集, P ? ID用戶對(duì)商品全集的行為數(shù)據(jù)集合那么我們的目標(biāo)是利用 D來(lái)構(gòu)造 U中用戶對(duì) P

2、 中商品的推薦模型。數(shù)據(jù)說(shuō)明:競(jìng)賽數(shù)據(jù)包含兩個(gè)部分。 第一部分是用戶在商品全集上的移動(dòng)端行為數(shù)據(jù) (D) 表名為 tianchi_mobile_recommend_train_user ,包含如下字段:字段字段說(shuō)明提取說(shuō)明user_id用戶標(biāo)識(shí)抽樣 &字段脫敏item_id商品標(biāo)識(shí)字段脫敏behavior_type用戶對(duì)商品的行為類型包括瀏覽、 收藏、 加購(gòu)物車、 購(gòu)買, 對(duì)應(yīng)取值分別是 1、 2、3、4。user_geohash用戶位置的空間標(biāo)識(shí),可以為空由經(jīng)緯度通過(guò)保密的算法生成item_category商品分類標(biāo)識(shí)字段脫敏time行為時(shí)間精確到小時(shí)級(jí)別第二個(gè)部分是商品子集( P), 表名

3、為 tianchi_mobile_recommend_train_item 包含如下字段:字段字段說(shuō)明提取說(shuō)明item id商品標(biāo)識(shí)抽樣&字段脫敏實(shí)用文檔item_ geohash商品位置的空間標(biāo)識(shí),可以為空 由經(jīng)緯度通過(guò)保密的算法生成item_category 商品分類標(biāo)識(shí) 字段脫敏訓(xùn)練數(shù)據(jù)包含了抽樣出來(lái)的一定量用戶在一個(gè)月時(shí)間 (11.1812.18 )之內(nèi)的 移動(dòng)端行為數(shù)據(jù)( D),評(píng)分?jǐn)?shù)據(jù)是這些用戶在這個(gè)一個(gè)月之后的一天 (12.19 ) 對(duì)商品子集( P)的購(gòu)買數(shù)據(jù)。參賽者要使用訓(xùn)練數(shù)據(jù)建立推薦模型,并輸出用 戶在接下來(lái)一天對(duì)商品子集購(gòu)買行為的預(yù)測(cè)結(jié)果。大作業(yè)報(bào)告內(nèi)容包括以下幾個(gè)部分

4、1、數(shù)據(jù)分組統(tǒng)計(jì) :可統(tǒng)計(jì)有多少用戶、商品、商品類別等信息,甚至每天各種行為的統(tǒng)計(jì)數(shù)。如圖:實(shí)用文檔還有,在給出的用戶行為數(shù)據(jù)中, 有些用戶在整個(gè) 11-18 日至 12-18 日對(duì)商 品有瀏覽行為記錄, 但是從未產(chǎn)生過(guò)購(gòu)買行為, 這些用戶會(huì)否在 12月 19 號(hào)購(gòu)買 商品實(shí)難預(yù)測(cè),因此,我們?nèi)コ@些無(wú)購(gòu)買行為的用戶信息,認(rèn)為這些用戶在 12 月 19 號(hào)還是不會(huì)購(gòu)買任何商品。貼關(guān)鍵代碼import time import pandas as pd實(shí)用文檔start=time.time() df_items=pd.read_csv(tianchi_mobile_recommend_train_

5、item.csv) df_items2=pd.read_csv(tianchi_mobile_recommend_train_user.csv) df_items3=pd.DataFrame() df_items4=pd.DataFrame() df_items5=pd.DataFrame()df_items3=df_itemsitem_id.drop_duplicates() df_items4=df_itemsitem_category.drop_duplicates() df_items5=df_itemsdf_items.item_geohash.notnull() df_items5

6、=df_items5item_id.drop_duplicates() df_items6=df_items2user_id.drop_duplicates() df_items7=df_items2item_id.drop_duplicates() df_items8=df_items2item_category.drop_duplicates() total_behavior_num=len(df_items2) df_items9=df_items2df_items2.behavior_type=4 df_items10=df_items2df_items2.behavior_type!

7、=4 positive_num=len(df_items9)negative_num=len(df_items10)item_num=len(df_items3)item_categories_num=len(df_items4) item_geohash_num=len(df_items5) user_num=len(df_items6) item_full_num=len(df_items7) item_categories_full_num=len(df_items8) end=time.time() print 商品子集中商品個(gè)數(shù)為: ,item_num實(shí)用文檔print 商品子集中商

8、品類型數(shù)為: ,item_categories_numprint 商品子集中帶 geohash 信息的商品個(gè)數(shù)為: ,item_geohash_numprint 用戶數(shù)一共有: ,user_numprint 商品全集中商品個(gè)數(shù)為: ,item_full_numprint 商品全集中商品種類數(shù)數(shù)為: ,item_categories_full_numprint 商品全集中共有 %d條行為記錄 %(total_behavior_num)print 消費(fèi)行為記錄中負(fù)正樣本比為 %d:1 %(negative_num/positive_num)print 一共耗時(shí) %f秒 %(end-start)2、

9、數(shù)據(jù)預(yù)處理 重新整理時(shí)間重新整理數(shù)據(jù)的時(shí)間,也就是 Time 字段,在數(shù)據(jù)統(tǒng)計(jì)分組中也提到過(guò),因?yàn)?原始數(shù)據(jù)的用戶行為時(shí)間記錄是從 11 月 18日 0 時(shí)到 12 月 18 日 23 時(shí),精確到 小時(shí)級(jí),為了方便數(shù)據(jù)集的劃分,需要將用戶行為時(shí)間數(shù)據(jù)整理為 0-30 天,以 天為單位,即 11 月 18 日的 time 為 0、 11 月 19 日的 time 為 1,以此類推。貼關(guān)鍵代碼import pandas as pd from datetime import * import timet0=time.time() begin_time=datetime(2014,11,18,0,0)

10、 def trans_time(str_time):實(shí)用文檔entry_time=datetime.strptime(str_time,%Y-%m-%d %H)datatime_delta=(entry_time-begin_time).daysreturn int(datatime_delta)df_train_user=pd.read_csv(tianchi_mobile_recommend_train_user.csv) print =nprint 時(shí)間轉(zhuǎn)換進(jìn)行中 .n df_train_user.time=df_train_user.time.map(lambda x:trans_ti

11、me(x)df_train_user.to_csv(train_trans_time.csv,index=False)t1=time.time()print 時(shí)間轉(zhuǎn)換結(jié)束 !nprint 轉(zhuǎn)換時(shí)間共耗時(shí) %f秒 %(t1-t0) 劃分訓(xùn)練集和測(cè)試集在分類問(wèn)題中, 模型需要經(jīng)過(guò)訓(xùn)練集的學(xué)習(xí), 才能用于測(cè)試集, 而訓(xùn)練集和 測(cè)試集在形式上的區(qū)別在于前者有類別標(biāo)簽, 后者則需要模型輸出相應(yīng)的類別標(biāo) 簽。這里的問(wèn)題是依據(jù) 31 天的用戶操作記錄預(yù)測(cè)第 32天的購(gòu)買情況, 所以通常 來(lái)說(shuō),訓(xùn)練集的構(gòu)建需要利用 31 天的數(shù)據(jù),而其相應(yīng)的類別標(biāo)簽如何標(biāo)注在訓(xùn) 練集中?這個(gè)與你如何劃分訓(xùn)練集和測(cè)試集有關(guān);而

12、測(cè)試集的構(gòu)建則可用到 31 天的完整數(shù)據(jù)。下面舉個(gè)例子,用于解釋訓(xùn)練集和測(cè)試集的具體表現(xiàn)形式。訓(xùn)練集樣本示例實(shí)用文檔測(cè)試集樣本示例訓(xùn)練集樣本示例中的 user_id, brand_id (item_id )用于表示唯一的樣本 id ,而特征 feature_1, feature_2 則用 31 天的數(shù)據(jù)構(gòu)建而來(lái)。本次比賽中,我 們劃分訓(xùn)練集和測(cè)試集所用的分割日期是每 10 天。第 0-9 天為一個(gè)訓(xùn)練集,用 第 10 天的數(shù)據(jù)給第 0-9 天數(shù)據(jù)添加類別標(biāo)簽。第 1-10 天為一個(gè)訓(xùn)練集,用第 11天的數(shù)據(jù)給第 1-10 天數(shù)據(jù)添加類別標(biāo)簽,依次類推, ,最后是第 20-29 天 為一個(gè)訓(xùn)練集

13、,用第 30天的數(shù)據(jù)給第 20-29 天數(shù)據(jù)添加類別標(biāo)簽。測(cè)試集為第 21-30 天的數(shù)據(jù)。貼關(guān)鍵代碼 import pandas as pd from datetime import * import timenum=22start=time.time() df_train_user=pd.read_csv(train_trans_time_process.csv) df_items=pd.read_csv(tianchi_mobile_recommend_train_item.csv) df_items=df_items.item_id.drop_duplicates()a=pd.Data

14、Frame() aitem_id=df_items.values df_items=a實(shí)用文檔for i in range(num):print 劃分訓(xùn)練集 :+str(i)j=i+10if j!=31:df_set=df_train_user(df_train_user.time=i)(df_train_user.time=i)&(df_train_user.time 14:a = range(0,ln)slice = random.sample(a,lp*14) # lp*15實(shí)用文檔df_feature_n = df_feature_n.ilocslice df_featurepd.co

15、ncat(df_feature_p,df_feature_n,ignore_index=True) df_feature2=pd.concat(df_feature,df_feature2)df_feature2.to_csv(features/train_feature.csv,index=False)end=time.time()print 對(duì)訓(xùn)練集抽樣耗時(shí) %f秒 %(end-start)3、特征提取特征提取在數(shù)據(jù)挖掘中很重要,那么為什么它們那么重要呢?之前提到過(guò), 要想輸出測(cè)試集的類別標(biāo)簽, 需要模型在訓(xùn)練集經(jīng)過(guò)學(xué)習(xí), 那么模型在訓(xùn)練集上 學(xué)習(xí)的是什么?我們知道,在給模型輸入數(shù)據(jù)的時(shí)候

16、,實(shí)際上模型用到的都是特征(及其 對(duì)應(yīng)的類別標(biāo)簽),而特征就是用于描述為什么該樣本的類別標(biāo)簽就是如此,在 本賽題中即用于描述某用戶為什么購(gòu)買 / 不購(gòu)買某商品。比如,用戶購(gòu)買某商品 的原因,是因?yàn)橐郧敖?jīng)常買,信得過(guò),那么這里可以用 “用戶購(gòu)買該商品的天數(shù) / 用戶訪問(wèn)該商品的天數(shù)” 來(lái)刻畫(huà)用戶對(duì)該品牌的忠誠(chéng)度。當(dāng)然,并不是單一的 特征就能描述所有情況, 通常來(lái)說(shuō), 需要針對(duì)所有可能的情形進(jìn)行考慮, 從而深 刻而全面地刻畫(huà)用戶購(gòu)買 / 不購(gòu)買商品的原因。這樣,模型才能真正學(xué)到其中的 規(guī)律,從而在測(cè)試集表現(xiàn)優(yōu)異。而這一過(guò)程,就稱之為 特征工程 。顯然,要做好 特征工程,需要我們自身對(duì) “用戶會(huì)否購(gòu)

17、買商品” 這一業(yè)務(wù)具有較深刻的理解, 即領(lǐng)域知識(shí),并將其用模型可理解的方式表現(xiàn)出來(lái),如何抽取特征?1、統(tǒng)計(jì)用戶在 31 天中的購(gòu)買量、點(diǎn)擊量、收藏量、加購(gòu)物車次數(shù)、有操作記錄 的天數(shù)、發(fā)生購(gòu)買的天數(shù)、點(diǎn)擊轉(zhuǎn)購(gòu)買率等等,并以點(diǎn)擊轉(zhuǎn)購(gòu)買率做升序 / 降序?qū)嵱梦臋n排序進(jìn)行觀察, 可以發(fā)現(xiàn)點(diǎn)擊量越高的, 點(diǎn)擊轉(zhuǎn)購(gòu)買率也往往越低, 尤其點(diǎn)擊量 極高的用戶,往往購(gòu)買量為 0。由此可以考慮將用戶購(gòu)買量、點(diǎn)擊轉(zhuǎn)購(gòu)買率等一 系列特征用于描述用戶是否會(huì)在未來(lái)一天發(fā)生購(gòu)買。2、統(tǒng)計(jì)用戶從初次訪問(wèn)商品到最終購(gòu)買商品的時(shí)間,可以發(fā)現(xiàn)絕大多數(shù)購(gòu)買都 是當(dāng)天接觸當(dāng)天完成, 越往后用戶購(gòu)買的可能性越低。 由此可以推測(cè)用戶對(duì)商

18、品 的購(gòu)買意愿是隨著距離上次訪問(wèn)的時(shí)間拉長(zhǎng)而衰減的, 進(jìn)而可以使用衰減函數(shù)來(lái) 模擬該購(gòu)買意愿。一方面,利用領(lǐng)域知識(shí)對(duì)數(shù)據(jù)進(jìn)行分析、實(shí)驗(yàn)驗(yàn)證。另一方面,從分析的結(jié) 果、實(shí)驗(yàn)的反饋來(lái)更新領(lǐng)域知識(shí)。這是一個(gè)不斷迭代的過(guò)程,需要成體系、且不 斷地完善。以下僅供參考:(1)、基本統(tǒng)計(jì)類特征A. 銷量(分割日期前 1、2、3、4、5、10 天)B. 成交訂單數(shù)(以同一天同一個(gè)用戶為一個(gè)訂單)C. 購(gòu)買人數(shù)D. 以上 3 類特征分別再針對(duì)點(diǎn)擊、收藏、加購(gòu)物車等進(jìn)行統(tǒng)計(jì)(2)、轉(zhuǎn)化率類特征A. 銷量/ 點(diǎn)擊數(shù)B. 成交訂單數(shù) /點(diǎn)擊訂單數(shù)C. 購(gòu)買人數(shù) / 點(diǎn)擊人數(shù)D. 上述 3 個(gè)特征分別在針對(duì)收藏、購(gòu)物車

19、等操作進(jìn)行統(tǒng)計(jì)(3)、比值類特征A.返客率(某周期內(nèi)多次購(gòu)買的用戶數(shù) / 總購(gòu)買用戶數(shù))B.老客戶率( 3天【或其他周期 7、15、30】前曾購(gòu)買過(guò)且在前 3天內(nèi)再次購(gòu)買 的用戶數(shù) /3 天內(nèi)總購(gòu)買用戶數(shù))C人均點(diǎn)擊數(shù)、人均購(gòu)買量、人均收藏量、人均加購(gòu)物車量等實(shí)用文檔我們的做法:1. 用戶所有行為總量提取用戶所有行為總量作為第一個(gè)特征, 它是指每個(gè)用戶對(duì)每個(gè)商品所有行 為的總量,其中的所有行為包括點(diǎn)擊行為、收藏行為、購(gòu)物車行為、購(gòu)買行為。用戶所有行為總量定義為前 10 天的用戶行為數(shù)據(jù)中用戶對(duì)商品全集的所有 行為總量,包括點(diǎn)擊量、收藏量、購(gòu)物車量、購(gòu)買量。從用戶所有行為總量中, 可以得到用戶對(duì)

20、某商品產(chǎn)生的行為次數(shù), 從而推測(cè)出該用戶對(duì)阿里巴巴移動(dòng)電商 平臺(tái)的操作頻率和忠誠(chéng)度,以此做出合理的個(gè)性化推薦。之所以選擇前 10 天作 為時(shí)間節(jié)點(diǎn),是由于劃分之后的每個(gè)訓(xùn)練集和測(cè)試集都以 10 天為單位。2. 點(diǎn)擊量定義數(shù)據(jù)集的每個(gè)用戶對(duì)商品全集中的商品的點(diǎn)擊行為的總和為點(diǎn)擊量。從 點(diǎn)擊量中, 可以知道用戶瀏覽了幾次某商品, 從而推測(cè)該用戶對(duì)該商品的興趣程 度,為之后的模型訓(xùn)練以及最后的個(gè)性化推薦奠定一個(gè)良好基礎(chǔ)。 其中,對(duì)點(diǎn)擊 量按 10 天、5天、 3天、 1天的時(shí)間來(lái)劃分。也就是關(guān)于點(diǎn)擊量,按時(shí)間的不同 提取的特征( U_click_sum10- U_click_sum1 )有 4 個(gè),

21、分別是前 10 天的用戶點(diǎn) 擊量、前 5 天的用戶點(diǎn)擊量、前 3 天的用戶點(diǎn)擊量、前 1 天的用戶點(diǎn)擊量。之所 以這樣提取特征是由于之前劃分的訓(xùn)練集是以 10 天為單位劃分的,這樣可以更 清楚地分析用戶在 10 天中點(diǎn)擊量的分布情況,對(duì)后面的模型訓(xùn)練有很重要的作 用。3. 收藏量定義數(shù)據(jù)集的每個(gè)用戶對(duì)商品全集中的商品的收藏行為的總和為收藏量。 這 里可以從收藏行為推測(cè)用戶對(duì)某商品的感興趣程度,雖然收藏量不會(huì)大于點(diǎn)擊量,但是收藏行為必定大于點(diǎn)擊行為反映的用戶感興趣程度。4. 購(gòu)物車量 定義數(shù)據(jù)集的每個(gè)用戶對(duì)商品全集中的商品加入購(gòu)物車行為的總數(shù)為購(gòu)物 車量。這里可以從加入購(gòu)物車行為直接推斷用戶對(duì)某

22、商品感興趣, 雖然購(gòu)物車量實(shí)用文檔必定大幅度小于點(diǎn)擊量和收藏量, 但是加入購(gòu)物車行為反映用戶對(duì)某個(gè)商品感興 趣程度必定大于點(diǎn)擊和收藏行為反映的感興趣程度。5. 購(gòu)買量 定義數(shù)據(jù)集的每個(gè)用戶對(duì)商品全集中商品的購(gòu)買行為的總數(shù)為購(gòu)買量, 或者 說(shuō)用戶購(gòu)買商品子集的商品數(shù)量為購(gòu)買量。 這里可以從用戶的購(gòu)買行為直接推斷 為用戶對(duì)某商品感興趣,對(duì)個(gè)性化推薦有重要的意義。為了更清楚地看到購(gòu)買量與點(diǎn)擊量、收藏量、加購(gòu)物車量的關(guān)系,對(duì)用戶前 10天的行為數(shù)據(jù)用散點(diǎn)圖表示,以用戶前 10 天的購(gòu)買量為橫坐標(biāo),其他三類行 為是縱坐標(biāo),如圖,可以看出用戶點(diǎn)擊量與其他的行為量相比明顯大很多,而 點(diǎn)擊點(diǎn)擊量越多的用戶購(gòu)買

23、量就越少。用戶前 10 天的行為數(shù)據(jù)對(duì)比6. 點(diǎn)擊/ 購(gòu)買 率點(diǎn)擊 / 購(gòu)買率的計(jì)算公式就是點(diǎn)擊量除以購(gòu)買量,即發(fā)生多少次點(diǎn)擊行為會(huì) 有一次購(gòu)買行為, 也就是電子商務(wù)平臺(tái)常說(shuō)的轉(zhuǎn)化率的倒數(shù)。 這個(gè)特征可以挖掘 點(diǎn)擊量和購(gòu)買量之間的關(guān)系,可以預(yù)測(cè)出用戶在點(diǎn)擊后,何時(shí)會(huì)發(fā)生購(gòu)買行為, 更準(zhǔn)確地為用戶提供一個(gè)合理的個(gè)性化推薦。這里還是按時(shí)間的不同提取 4 個(gè)特征( U_click/buy10-U_click/buy1 ),分 別是前 10 天的點(diǎn)擊 / 購(gòu)買率、前 5 天的點(diǎn)擊 / 購(gòu)買率、前 3 天的點(diǎn)擊 / 購(gòu)買率、前 1 天的點(diǎn)擊 / 購(gòu)買率。實(shí)用文檔7. 收藏/ 購(gòu)買 率收藏 / 購(gòu)買率的計(jì)

24、算公式就是收藏量除以購(gòu)買量,即發(fā)生多少次收藏行為會(huì) 有一次購(gòu)買行為。 這個(gè)特征可以挖掘收藏量和購(gòu)買量之間的關(guān)系, 可以預(yù)測(cè)出用 戶在收藏后,何時(shí)會(huì)發(fā)生購(gòu)買行為, 更準(zhǔn)確地為用戶提供一個(gè)合理的個(gè)性化推薦。這 里 還 是 按 時(shí) 間 的 不 同 提 取 4 個(gè) 特 征 ( U_collection/buy10-U_collection/buy1),分別是前 10 天的收藏 / 購(gòu)買率、前 5天的收藏/購(gòu)買率、前 3天的收藏 /購(gòu)買率、前 1天的收藏/購(gòu)買率。與點(diǎn)擊/ 購(gòu)買率不同,該特征的取值范圍可能在 0,1 之間,因?yàn)橘?gòu)買行為不一定要先收 藏該商品,所以取值范圍應(yīng)該是大于等于 0。8. 購(gòu)物車/

25、 購(gòu)買 率購(gòu)物車 /購(gòu)買率的計(jì)算公式就是購(gòu)物車量除以購(gòu)買量,即發(fā)生多少次加入購(gòu) 物車行為會(huì)有一次購(gòu)買行為。這個(gè)特征可以挖掘購(gòu)物車量和購(gòu)買量之間的關(guān)系, 可以預(yù)測(cè)出用戶在加入購(gòu)物車后, 何時(shí)會(huì)發(fā)生購(gòu)買行為, 更準(zhǔn)確地為用戶提供一 個(gè)合理的個(gè)性化推薦。還是按時(shí)間的不同提取 4 個(gè)特征( U_car/buy10- U_car/buy1 ),分別是前 10 天的購(gòu)物車 / 購(gòu)買率、前 5 天的購(gòu)物車 / 購(gòu)買率、前 3 天的購(gòu)物車 / 購(gòu)買率、前 1 天的購(gòu)物車 / 購(gòu)買率。該特征的取值范圍與收藏 / 購(gòu)買率相同, 購(gòu)買行為不一定要 先加入購(gòu)物車,所以它也應(yīng)該是大于等于 0。9. 商品銷量商品銷量是指

26、每個(gè)商品的銷售量, 與用戶的購(gòu)買行為有關(guān), 由購(gòu)買了該商品 的所有用戶總量決定。 該特征直觀地反映了某個(gè)商品基于銷量上受喜愛(ài)程度, 為 訓(xùn)練模型以及個(gè)性化推薦提供了很好的參考。還是按時(shí)間的不同提取 4 個(gè)特征 (Item_sale10-Item_sale1 ),分別是前 10天的商品銷量、前 5 天的商品銷量、 前 3 天的商品銷量、前 1 天的商品銷量。該特征的取值范圍一定大于等于零。10. 成交訂單量成交訂單量是指包含該商品的總成交訂單的數(shù)量, 與商品銷量類似, 不同的 是同一筆訂單中可能購(gòu)買了多件該商品,那么此時(shí)商品銷量大于1,而成交訂單量卻等于 1。該特征反映了用戶對(duì)某個(gè)商品的購(gòu)買次數(shù)

27、,排除同一筆訂單購(gòu)買多 件而使商品銷量看起來(lái)較高的情況。 比如,用戶購(gòu)買牙刷時(shí), 一筆訂單并不會(huì)只 購(gòu)買一個(gè), 通常會(huì)一起購(gòu)買多個(gè), 那么牙刷的銷量相比一般只購(gòu)買一件的商品銷提高了訓(xùn)練模實(shí)用文檔量高很多。通過(guò)成交訂單量可以反映商品基于訂單量受喜愛(ài)程度, 型以及個(gè)性化推薦的準(zhǔn)確性。還是按時(shí)間的不同提取 4 個(gè)特征(I_order10-I_order1 ),分別是前 10 天的 成交訂單量、前5天的成交訂單量、前3天的成交訂單量、前 1天的成交訂單量。該特征的取值范圍一定大于等于零11. 購(gòu)買人數(shù)購(gòu)買人數(shù)是指購(gòu)買該商品的用戶總?cè)藬?shù), 與商品銷量與成交訂單相類似, 不 同的是同一個(gè)用戶可能對(duì)該商品多

28、次下單, 也可能購(gòu)買了多件該商品, 那么此時(shí) 成交訂單量大于 1,商品銷量大于 1,而購(gòu)買人數(shù)卻等于 1。該特征反映了某個(gè) 商品的購(gòu)買人數(shù), 排除同一個(gè)用戶購(gòu)買多次該商品的情況。 比如,用戶購(gòu)買生活 用品就會(huì)出現(xiàn)多次下單和購(gòu)買多件的情況。 通過(guò)購(gòu)買人數(shù)可以真正反映商品基于 用戶受喜愛(ài)程度,很大程度地提高了訓(xùn)練模型以及個(gè)性化推薦的準(zhǔn)確性。還是按時(shí)間的不同提取 4 個(gè)特征(I_buyer10-I_buyer1 ),分別是前 10 天的 購(gòu)買人數(shù)、前 5 天的購(gòu)買人數(shù)、前 3 天的購(gòu)買人數(shù)、前 1天的購(gòu)買人數(shù)。該特征 的取值范圍一定大于等于零。12. 是否加購(gòu)物車加入購(gòu)物車的行為已經(jīng)在前面做了一個(gè)詳

29、細(xì)地介紹和分析, 其實(shí)在用戶行為 數(shù)據(jù)中,是否加入購(gòu)物車也可以作為一個(gè)特征提取出來(lái)。將是否加購(gòu)物車的特征, 定義為數(shù)據(jù)集的每個(gè)用戶對(duì)商品全集中的商品是否 發(fā)生加入購(gòu)物車的行為。 這里還是按時(shí)間的不同提取 5 個(gè)特征(car5-car1 ),分 別是倒數(shù)第 5天是否加購(gòu)物車、倒數(shù)第 4天是否加購(gòu)物車、倒數(shù)第 3天是否加購(gòu) 物車、倒數(shù)第 2天是否加購(gòu)物車、 倒數(shù)第1天是否加購(gòu)物車。 之所以這樣提取特 征,是因?yàn)閺挠脩粼?10 天的倒數(shù) 5天內(nèi)是否會(huì)將某商品加入購(gòu)物車,可以預(yù)測(cè) 該用戶在測(cè)試集中倒數(shù) 5 天內(nèi)是否會(huì)發(fā)生加入購(gòu)物車的行為。 該特征的取值范圍 一定為 1 或者 0, 其中 1 代表加購(gòu)物

30、車, 0 代表不加購(gòu)物車。13. 是否購(gòu)買用戶購(gòu)買行為已經(jīng)和加購(gòu)物車行為一樣在前面做了詳細(xì)地介紹和分析, 其實(shí) 在用戶行為數(shù)據(jù)中,是否購(gòu)買也可以作為特征提取出來(lái)。在本文中,將是否購(gòu)買的特征,定義為數(shù)據(jù)集的每個(gè)用戶對(duì)商品全集中的商 品是否會(huì)發(fā)生購(gòu)買行為。 這里還是按時(shí)間的不同提取 5 個(gè)特征( buy5-buy1 ),分 別是倒數(shù)第 5天是否購(gòu)買、倒數(shù)第 4天是否購(gòu)買、倒數(shù)第 3天是否購(gòu)買、倒數(shù)第實(shí)用文檔2天是否購(gòu)買、倒數(shù)第 1天是否購(gòu)買。之所以這樣提取特征, 是因?yàn)閺挠脩粼?10 天的倒數(shù) 5天內(nèi)是否會(huì)購(gòu)買某商品, 可以預(yù)測(cè)該用戶在測(cè)試集中倒數(shù) 5天內(nèi)是否 會(huì)發(fā)生購(gòu)買行為。 該特征的取值范圍一

31、定為 1或者 0,其中 1代表購(gòu)買, 0代表不 購(gòu)買。14. 累計(jì)的用戶行為 累計(jì)的用戶行為,也屬于用戶行為數(shù)據(jù)的一種表現(xiàn)形式,用戶行為數(shù)據(jù)在前 面已經(jīng)做了詳細(xì)地介紹和分析,它可以直觀地反映出用戶的各種關(guān)鍵信息。累計(jì)的用戶行為定義為前 10 天的用戶行為數(shù)據(jù)中用戶累計(jì)對(duì)商品子集的各 行為總量,包括點(diǎn)擊量、收藏量、購(gòu)物車量、購(gòu)買量。與用戶所有行為總量特征 不同之處在于, 累計(jì)的用戶行為是基于商品子集的, 而且是按照用戶行為提取特 征。提取 4 個(gè)特征( behav1- behav4 ),分別是前 10 天的用戶點(diǎn)擊量、前 10 天的用戶收藏量、 前 10天的用戶加購(gòu)物車量、 前 10 天的用戶購(gòu)

32、買量。 該特征的 取值范圍一定為大于等于 0。15. 訪問(wèn)時(shí)間差 訪問(wèn)時(shí)間差是指用戶在兩次訪問(wèn)時(shí)間的間隔,它可以反映用戶對(duì)網(wǎng)站的訪問(wèn) 頻率等信息。 本文中,提取特征訪問(wèn)時(shí)間差, 將其定義為用戶最后一次訪問(wèn)商品 子集中的某個(gè)商品到第 10天的天數(shù)間隔。這與倒數(shù) 5 天的加購(gòu)物車量、購(gòu)買量 相關(guān)聯(lián),可以得到用戶訪問(wèn)時(shí)間與購(gòu)買之間的關(guān)系。 該特征的取值范圍為 0,10 之間的整數(shù)。貼關(guān)鍵代碼 import pandas as pd import random from get_features import import time實(shí)用文檔t1=time.time()j=10 df_items=pd.

33、read_csv(tianchi_mobile_recommend_train_item.csv)df_items=df_items.item_id.drop_duplicates()a = pd.DataFrame()aitem_id = df_items.valuesdf_items = afor k in range(21):i=j+kprint add features to trains +str(i)df_tag=pd.read_csv(data/+result+str(i)+.csv)df_tagtag=1df_feature=pd.read_csv(data/+str(i)+.

34、csv)df_feature_item=pd.merge(left=df_feature,right=df_items,how=inner)df_ui = df_featureuser_id,item_id.drop_duplicates()df_ui = pd.merge(left=df_ui,right=df_items,how=inner)df_ui_tag = pd.merge(left=df_ui,right=df_tag,how=left)df_ui_tag.fillna(0,inplace=True)U1 = buy_sum10(df_feature,i)df_train = p

35、d.merge(left=df_ui_tag,right=U1,how=left)U2 = click_sum10(df_feature,i)實(shí)用文檔df_train = pd.merge(left=df_train,right=U2,how=left)U3 = collection_sum10(df_feature,i)df_train = pd.merge(left=df_train,right=U3,how=left)U4 = car_sum10(df_feature,i)df_train = pd.merge(left=df_train,right=U4,how=left)df_tra

36、inU_click/buy10df_train.U_click_sum10/df_train.U_buy_sum10df_trainU_click/buy5df_train.U_click_sum5/df_train.U_buy_sum5df_trainU_click/buy3df_train.U_click_sum3/df_train.U_buy_sum3df_trainU_click/buy1df_train.U_click_sum1/df_train.U_buy_sum1df_trainU_click/buy10=df_trainU_click/buy10.map(lambdax: fi

37、llinfinity(x)df_trainU_click/buy5=df_trainU_click/buy5.map(lambda x: fillinfinity(x)df_trainU_click/buy3=df_trainU_click/buy3.map(lambdax:fillinfinity(x)df_trainU_click/buy1=df_trainU_click/buy1.map(lambdax:fillinfinity(x)df_trainU_collection/buy10df_train.U_collection_sum10/df_train.U_buy_sum10df_t

38、rainU_collection/buy5實(shí)用文檔df_train.U_collection_sum5/df_train.U_buy_sum5df_trainU_collection/buy3df_train.U_collection_sum3/df_train.U_buy_sum3df_trainU_collection/buy1df_train.U_collection_sum1/df_train.U_buy_sum1 df_trainU_collection/buy10=df_trainU_collection/buy10.map(lam bda x: fillinfinity(x)df

39、_trainU_collection/buy5=df_trainU_collection/buy5.map(lambd a x: fillinfinity(x)df_trainU_collection/buy3=df_trainU_collection/buy3.map(lambd a x: fillinfinity(x)df_trainU_collection/buy1=df_trainU_collection/buy1.map(lambd a x: fillinfinity(x)df_trainU_car/buy10 df_train.U_car_sum10/df_train.U_buy_

40、sum10df_trainU_car/buy5 = df_train.U_car_sum5/df_train.U_buy_sum5df_trainU_car/buy3 = df_train.U_car_sum3/df_train.U_buy_sum3df_trainU_car/buy1 = df_train.U_car_sum1/df_train.U_buy_sum1df_trainU_car/buy10=df_trainU_car/buy10.map(lambdax:fillinfinity(x)df_trainU_car/buy5=df_trainU_car/buy5.map(lambda

41、x:fillinfinity(x)實(shí)用文檔df_trainU_car/buy3=df_trainU_car/buy3.map(lambdax:fillinfinity(x)df_trainU_car/buy1=df_trainU_car/buy1.map(lambdax:fillinfinity(x)df_behavior_sum10 = behavior_sum10(df_feature)df_trainpd.merge(left=df_train,right=df_behavior_sum10,how=left)df_I_buyers = I_buyers(df_feature_item,

42、i)df_train = pd.merge(left=df_train,right=df_I_buyers,how=left)df_item1 = Item_sale(df_feature,i)df_train = pd.merge(left=df_train,right=df_item1,how=left)df_car = car(df_feature,i)df_train = pd.merge(left=df_train,right=df_car,how=left)df_buy = buy(df_feature,i)df_train = pd.merge(left=df_train,rig

43、ht=df_buy,how=left)df_orders = I_Orders(df_feature_item,i)df_train = pd.merge(left=df_train,right=df_orders,how=left)df_ui_sum = UI_Sum(df_feature_item,i)df_train = pd.merge(left=df_train,right=df_ui_sum,how=left)df_ui_last_time = last_time(df_feature_item,i)df_train實(shí)用文檔pd.merge(left=df_train,right=

44、df_ui_last_time,how=left)df_train.fillna(0,inplace=True)df_train.to_csv(data_features/train+str(i)+.csv,index=False)t2=time.time()print 給訓(xùn)練集打上標(biāo)簽耗時(shí) %f秒 %(t2-t1)4、選擇分類模型可以用決策樹(shù)模型、隨機(jī)森林模型、 Logistic 回歸、GBRT模型等,具體可以 上網(wǎng)站: /stable/ 查看各個(gè)模型的使用方法。決策樹(shù)模型:首先從包含了特征的訓(xùn)練集中選擇所需特征,調(diào)用 DecisionTreeCl

45、assifier 函數(shù)對(duì)該訓(xùn)練集訓(xùn)練模型,再使用 predict 函數(shù)預(yù)測(cè) 測(cè)試集的分類,再將分類結(jié)果是購(gòu)買( tag=1 )的商品作為推薦結(jié)果,將其與測(cè) 試集的真實(shí)分類結(jié)果比對(duì),最后評(píng)估該模型對(duì)本實(shí)證研究數(shù)據(jù)的準(zhǔn)確率,以 F1 值為準(zhǔn)。決策樹(shù)分類模型的 DecisionTreeClassifier 函數(shù),包含了很多參數(shù)設(shè)置, 著重研究 criterion 參數(shù), criterion 表示衡量一個(gè)分類的質(zhì)量,支持的標(biāo)準(zhǔn)可 選擇 gini 和 entropy 這兩個(gè)值,其中 gini 是基尼指標(biāo), entropy 是信息增益。由于用十折交叉驗(yàn)證的方法, 所以每次改變一個(gè)變量都需要對(duì)該模型重新抽

46、樣,對(duì)其運(yùn)行 10 次,得出第 1次到第 10 次的驗(yàn)證結(jié)果,對(duì)十次準(zhǔn)確率 F1值求 平均作為該模型最終的 F1 值。實(shí)用文檔貼關(guān)鍵代碼df_predict = pd.read_csv(model/predict_DecisionTree.csv) inner = pd.merge(left=df_result,right=df_predict,how=inner) predict_num = len(df_predict)print DecisionTree predict_num is: ,predict_num hit_num = len(inner)print DecisionTree

47、 hit_num is: ,hit_num result_num = len(df_result)print DecisionTree total result num is: ,result_num if predict_num!=0:precision = float(hit_num)/predict_numif result_num!=0:callrate = float(hit_num)/result_numprint DecisionTree Precision is: ,precisionprint DecisionTree Call rate is: ,callrateif pr

48、ecision+callrate != 0:值為print 決 策 樹(shù) F1 ,2*precision*callrate/(precision+callrate),n else:print 決策樹(shù) F1值為: 0基于隨機(jī)森林的分類模型實(shí)用文檔隨機(jī)森林是在決策樹(shù)的基礎(chǔ)上提出的分類模型, 它屬于集成學(xué)習(xí)模型。 他的 核心思想就是通過(guò)訓(xùn)練和組合多個(gè)不同的決策樹(shù), 使其形成森林, 然后由多棵樹(shù) 進(jìn)行投票來(lái)決定其分類結(jié)果。首先從包含了特征的訓(xùn)練集中選擇所需特征, 調(diào)用 RandomForestClassifier 函數(shù)對(duì)該訓(xùn)練集訓(xùn)練模型, 再使用 predict 函數(shù)預(yù)測(cè)測(cè)試集的分類, 再將分類結(jié) 果是

49、購(gòu)買( tag=1 )的商品作為推薦結(jié)果,將其與測(cè)試集的真實(shí)分類結(jié)果比對(duì), 最后評(píng)估該模型對(duì)本實(shí)證研究數(shù)據(jù)的準(zhǔn)確率,以 F1 值為準(zhǔn)。隨機(jī)森林分類模型的 RandomForestClassifier 函數(shù),包含了很多參數(shù)設(shè)置, 其中著重研究 n_estimators 和 criterion 參數(shù)。n_estimators 表示森林里樹(shù)的 個(gè)數(shù),整數(shù)形式; criterion 表示衡量一個(gè)分類的質(zhì)量, 支持的標(biāo)準(zhǔn)可選擇 gini 和 entropy 這兩個(gè)值,其中 gini 是基尼指標(biāo), entropy 是信息增益。貼關(guān)鍵代碼df_predict = pd.read_csv(model/pred

50、ict_RandomForest.csv)inner = pd.merge(left=df_result,right=df_predict,how=inner) predict_num = len(df_predict)print RandomForest predict_num is: ,predict_num hit_num = len(inner)print RandomForest hit_num is: ,hit_num result_num = len(df_result)print RandomForest total result num is: ,result_num if

51、predict_num!=0:precision = float(hit_num)/predict_numif result_num!=0:callrate = float(hit_num)/result_num實(shí)用文檔print RandomForest Precision is: ,precision print RandomForest Call rate is: ,callrate if precision+callrate != 0:F1 值 為print 隨 機(jī) 森 林 ,2*precision*callrate/(precision+callrate),n else:print

52、隨機(jī)森林 F1 值為: 0基于回歸樹(shù)的分類模型回歸樹(shù) GBDT是一種迭代決策樹(shù)算法,由多個(gè)決策樹(shù)組成,在本節(jié)中要具體 使用的分類模型是 GBRT,即梯度迭代回歸樹(shù),或者梯度提升回歸樹(shù),它側(cè)重于 梯度迭代 GB和回歸樹(shù) RT。首先從包含了特征的訓(xùn)練集中選擇所需特征,再調(diào)用 GradientBoostingClassifier 函數(shù)對(duì)該訓(xùn)練集訓(xùn)練模型,再使用 predict 函數(shù) 預(yù)測(cè)測(cè)試集的分類,再將分類結(jié)果是購(gòu)買( tag=1 )的商品作為推薦結(jié)果,將其 與測(cè)試集的真實(shí)分類結(jié)果比對(duì), 最后評(píng)估該模型對(duì)本實(shí)證研究數(shù)據(jù)的準(zhǔn)確率, 以 F1值為準(zhǔn)。回歸樹(shù)分類模型的 GradientBoostingClassifier 函數(shù),包含了很多參數(shù)設(shè) 置,其中著重研究參數(shù) learning_rate 。 learning_rate 就是學(xué)習(xí)率,是指每棵 樹(shù)都對(duì)學(xué)習(xí)率的縮小有貢獻(xiàn)。它

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論