2018科大訊飛AI營銷算法大賽[1]

題目背景


本次大賽提供了訊飛AI營銷云的海量廣告投放數(shù)據(jù)著瓶,參賽選手通過人工智能技術(shù)構(gòu)建預(yù)測模型預(yù)估用戶的廣告點擊概率洒扎,即給定廣告點擊相關(guān)的廣告熏迹、媒體檐薯、用戶、上下文內(nèi)容等信息的條件下預(yù)測廣告點擊概率注暗。希望通過本次大賽挖掘AI營銷算法領(lǐng)域的頂尖人才坛缕,共同推動AI營銷的技術(shù)革新。

基本數(shù)據(jù)
字段 解釋
instance_id 樣本id
click 是否點擊
廣告信息
字段 解釋
adid 廣告id
advert_id 廣告主id
orderid 訂單id
advert_industry_inner 廣告主行業(yè)
advert_name 廣告主名稱
campaign_id 活動id
creative_id 創(chuàng)意id
creative_type 創(chuàng)意類型
creative_tp_dnf 樣式定向id
creative_has_deeplink 響應(yīng)素材是否有deeplink(Boolean)
creative_is_jump 是否是落頁跳轉(zhuǎn)(Boolean)
creative_is_download 是否是落頁下載(Boolean)
creative_is_js 是否是js素材(Boolean)
creative_is_voicead 是否是語音廣告(Boolean)
creative_width 創(chuàng)意寬
creative_height 創(chuàng)意高
媒體信息
字段 解釋
app_cate_id app分類
f_channel 一級頻道
app_id 媒體id
inner_slot_id 媒體廣告位
app_paid app是否付費
用戶信息
字段 解釋
user_tags 用戶標(biāo)簽信息捆昏,以逗號分隔
上下文信息
字段 解釋
city 城市
carrier 運營商
time 時間戳
province 省份
nnt 聯(lián)網(wǎng)類型
devtype 設(shè)備類型
os_name 操作系統(tǒng)名稱
osv 操作系統(tǒng)版本
os 操作系統(tǒng)
make 品牌(例如:apple)
model 機(jī)型(例如:"iphone")

初探數(shù)據(jù)


讓我們先來看看數(shù)據(jù)赚楚,在data下面round1_iflyad_train.txt和round1_iflyad_test_feature.txt分別放著官方給的訓(xùn)練集和測試集

import numpy as np
import pandas as pd

data_train_org = pd.read_csv("data/round1_iflyad_train.txt",sep='\t');
data_test_org = pd.read_csv("data/round1_iflyad_test_feature.txt",sep='\t');

data_all = pd.concat([data_train_org, data_test_org],ignore_index=True)
data_all.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1041674 entries, 0 to 1041673
Data columns (total 35 columns):
adid                     1041674 non-null int64
advert_id                1041674 non-null int64
advert_industry_inner    1041674 non-null object
advert_name              1041674 non-null object
app_cate_id              1039376 non-null float64
app_id                   1039376 non-null float64
app_paid                 1041674 non-null bool
campaign_id              1041674 non-null int64
carrier                  1041674 non-null int64
city                     1041674 non-null int64
click                    1001650 non-null float64
creative_has_deeplink    1041674 non-null bool
creative_height          1041674 non-null int64
creative_id              1041674 non-null int64
creative_is_download     1041674 non-null bool
creative_is_js           1041674 non-null bool
creative_is_jump         1041674 non-null bool
creative_is_voicead      1041674 non-null bool
creative_tp_dnf          1041674 non-null int64
creative_type            1041674 non-null int64
creative_width           1041674 non-null int64
devtype                  1041674 non-null int64
f_channel                79777 non-null object
inner_slot_id            1041674 non-null object
instance_id              1041674 non-null int64
make                     938631 non-null object
model                    1033881 non-null object
nnt                      1041674 non-null int64
orderid                  1041674 non-null int64
os                       1041674 non-null int64
os_name                  1041674 non-null object
osv                      1033463 non-null object
province                 1041674 non-null int64
time                     1041674 non-null int64
user_tags                718672 non-null object
dtypes: bool(6), float64(3), int64(17), object(9)
memory usage: 236.4+ MB

可以看到部分字段有缺失:

  • f_channel一級頻道只有79777
  • user_tags用戶標(biāo)簽信息718672

這兩個字段缺失較多

特征選取


首先根據(jù)經(jīng)驗選取一些基礎(chǔ)特征做一個baseline

  • advert_industry_inner:不同行業(yè)的廣告效果應(yīng)該是會不一樣
  • creative_type:廣告創(chuàng)意不同對用戶的吸引力會有所不同
  • app_cate_id:app分類可以認(rèn)為用戶對這一類有所偏好,比如玩游戲的用戶更加可能點擊游戲類廣告
  • inner_slot_id:不同位置廣告點擊率是不一樣
  • city:地域性
  • province:地域性
  • carrier:運行商
  • nnt:聯(lián)網(wǎng)類型
  • devtype:設(shè)備類型
  • os_name:操作系統(tǒng)

缺失處理
app_cate_id缺失項較少暫時用NULL填充

def set_missing_value(data):
    data['app_cate_id_full']=data.app_cate_id
    data.loc[data.app_cate_id_full.isnull(),'app_cate_id_full']= "NULL"
    data.drop(['app_cate_id'], axis=1, inplace=True)

def attribute_to_number(data):
    columnNames = [
        'advert_industry_inner',#廣告主行業(yè)
        'creative_type',#創(chuàng)意類型
        'app_cate_id_full',#app分類
        'inner_slot_id',
        'city',#城市
        'province',#省份
        'carrier',#運營商
        'nnt',#網(wǎng)絡(luò)
        'devtype',#設(shè)備類型
        'os_name'#系統(tǒng)名字
    ]

    for name in columnNames:       
        data[name+"_factorize"] = pd.factorize(data[name].values , sort=True)[0] + 1
    data.drop(columnNames, axis=1, inplace=True)
    
    return data
    
def make_new_feature(data):
    pass

featureNames = [
    #廣告信息
    'advert_industry_inner',#廣告主行業(yè)骗卜,效果微弱
    'creative_type',#創(chuàng)意類型
    #媒體信息
    'app_cate_id',#app分類
    'inner_slot_id',#廣告位
    #上下文信息
    'city',#城市
    'carrier',#運營商
    'province',#省份
    'nnt',#網(wǎng)絡(luò)
    'devtype',#設(shè)備類型
    'os_name',#系統(tǒng)名字
    'click'
    ]
data_use = data_all[featureNames].copy()
set_missing_value(data_use)
make_new_feature(data_use)
#編碼數(shù)據(jù)
data_now = attribute_to_number(data_use)
data_now.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1041674 entries, 0 to 1041673
Data columns (total 11 columns):
click                              1001650 non-null float64
advert_industry_inner_factorize    1041674 non-null int64
creative_type_factorize            1041674 non-null int64
app_cate_id_full_factorize         1041674 non-null int64
inner_slot_id_factorize            1041674 non-null int64
city_factorize                     1041674 non-null int64
province_factorize                 1041674 non-null int64
carrier_factorize                  1041674 non-null int64
nnt_factorize                      1041674 non-null int64
devtype_factorize                  1041674 non-null int64
os_name_factorize                  1041674 non-null int64
dtypes: float64(1), int64(10)
memory usage: 87.4 MB

隨機(jī)森林建模


data_now.drop(['click'], axis=1, inplace=True)
data_train = data_now[0:data_train_org.shape[0]][:].copy()
data_test = data_now[data_train_org.shape[0]:][:].copy()
y = data_train_org.click

predictors = data_train.columns

from sklearn import model_selection
from sklearn.ensemble import RandomForestClassifier

alg=RandomForestClassifier(random_state=1,n_estimators=100,min_samples_split=1000,min_samples_leaf=50,n_jobs=-1) 
kf=model_selection.KFold(n_splits=10,shuffle=False,random_state=1)
 
scores=model_selection.cross_val_score(alg,data_train[predictors],y,cv=kf)
 
print(scores)
print(scores.mean())
[0.80614985 0.80197674 0.80689862 0.80233615 0.80473219 0.80007987
 0.80536115 0.79934109 0.80501173 0.80516148]
0.8037048869365547

交叉測試分?jǐn)?shù)0.8037感覺還行直晨,那我們就訓(xùn)練模型提交吧!

alg.fit(data_train[predictors],y)
result = alg.predict_proba(data_test[predictors])[:,1]

result = pd.DataFrame({ 'instance_id': data_all[data_train_org.shape[0]:].instance_id,'predicted_score':result.astype(np.float32)})
result.to_csv("result.csv", index=False)
結(jié)果

格式正確膨俐,這就去提交啦啦啦!


成績

總結(jié)

第一次寫文章難免有點圖多字少實在抱歉罩句!其實自己也是機(jī)器學(xué)習(xí)初學(xué)者焚刺,希望能和大家多多交流學(xué)習(xí)。
雖然已經(jīng)提交了成績门烂,但這只是一個開始后續(xù)還有更多可以做的乳愉。

  • 更多特征挖掘
  • 構(gòu)建新特征
  • 模型融合

如果有機(jī)會我會將后續(xù)的更多嘗試都寫出來。
由于個人能力有限難免會出現(xiàn)錯誤之處屯远,還望各位斧正蔓姚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市慨丐,隨后出現(xiàn)的幾起案子坡脐,更是在濱河造成了極大的恐慌,老刑警劉巖房揭,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件备闲,死亡現(xiàn)場離奇詭異,居然都是意外死亡捅暴,警方通過查閱死者的電腦和手機(jī)恬砂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蓬痒,“玉大人泻骤,你說我怎么就攤上這事。” “怎么了狱掂?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵演痒,是天一觀的道長。 經(jīng)常有香客問我符欠,道長嫡霞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任希柿,我火速辦了婚禮诊沪,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曾撤。我一直安慰自己端姚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布挤悉。 她就那樣靜靜地躺著渐裸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪装悲。 梳的紋絲不亂的頭發(fā)上昏鹃,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音诀诊,去河邊找鬼洞渤。 笑死,一個胖子當(dāng)著我的面吹牛属瓣,可吹牛的內(nèi)容都是我干的载迄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼抡蛙,長吁一口氣:“原來是場噩夢啊……” “哼护昧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粗截,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤惋耙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熊昌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怠晴,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年浴捆,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒜田。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡选泻,死狀恐怖冲粤,靈堂內(nèi)的尸體忽然破棺而出美莫,到底是詐尸還是另有隱情,我是刑警寧澤梯捕,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布厢呵,位于F島的核電站,受9級特大地震影響傀顾,放射性物質(zhì)發(fā)生泄漏襟铭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一短曾、第九天 我趴在偏房一處隱蔽的房頂上張望寒砖。 院中可真熱鬧,春花似錦嫉拐、人聲如沸哩都。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漠嵌。三九已至,卻和暖如春盖呼,著一層夾襖步出監(jiān)牢的瞬間儒鹿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工几晤, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留约炎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓锌仅,卻偏偏與公主長得像,于是被迫代替她去往敵國和親墙贱。 傳聞我的和親對象是個殘疾皇子热芹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • # 一度蜜v3.0協(xié)議 --- # 交互協(xié)議 [TOC] ## 協(xié)議說明 ### 請求參數(shù) 下表列出了v3.0版協(xié)...
    c5e350bc5b40閱讀 641評論 0 0
  • 第1章 初涉MySQL 1.1 MySQL文件 (1)MySQL目錄結(jié)構(gòu) (2)MySQL配置向?qū)募ò惭b后配置...
    凜0_0閱讀 780評論 1 0
  • 安裝與配置 安裝xampp(為了使用mysql數(shù)據(jù)庫):點擊MySQL的start以啟動mysql 配置環(huán)境變量(...
    jxvl假裝閱讀 414評論 0 0
  • 美團(tuán)作為中國最大的在線本地生活服務(wù)平臺,覆蓋了餐飲惨撇、酒店伊脓、旅行、休閑娛樂魁衙、外賣配送等方方面面生活場景报腔,連接了數(shù)億用...
    猿學(xué)閱讀 883評論 0 5
  • Info.plist 用于向 iOS 提供關(guān)于 app , bundle 或者 framework 的一些重要信息...
    Alfred_小樂閱讀 2,407評論 1 0