選購攝影相關產品,比選擇電腦主機還是家電產品更難!
大家在進入任何一個領域之前,多少都會去網路上爬文
比方說:「入門推薦的攝影器材」、「基本攝影裝備」或者是「必買的攝影裝備」,尤其對於新手來說,這可是非常重要的功課
因為每個人都希望一次到位,避免踩雷,傷了荷包是小事,另一半發火可是大事啊!
其實選擇的方式歸類以下幾點
1.買新款不買舊款 2.不買套機,機身鏡頭分開選擇 3.在自己的預算內買最好的,一步到位 4.一機身+一短焦+一長焦(必備)
其實我在很多的購物網站比較起來,momo買東西是目前最省的一個平台了!
更新商品及相關促銷的活動也是非常多~
攝影用品很多,而且現在刷卡很多優惠,去店面買價格很死,也無法累積點數
所以感覺到實體店面看完後,到MOMO選擇會是很好選擇,有時還可以拿到很便宜的價格
尤其常常有促銷,如果你看中的型號有在上面就真的賺到了
【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)是我這陣子選購的,用起來的評價真的不錯
實用性、外觀、價格也平價
在許多網站都有相關的介紹,可見評價真的很高!
現在省錢才是王道啊!
而且我也很常逛PTT,這款【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)也真的受到不少人的推薦(我看得出什麼是業配文,不要說我笨)
所以我個人對【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)的評比如下
實用性:★★★★★
價格:★★★★☆
推薦度:★★★★☆
完整產品說明
品牌名稱
重量
- 201g~400g
保固期
- 1年
適用於
- Panasonic
功能
- 廣角變焦
來源
- 平行輸入
保固期
- 享有保固一年
非常推薦【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)給大家
↓↓↓【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)限量特惠的優惠按鈕↓↓↓
↓↓↓找不到喜歡的款式嗎?下方有其他最新優惠讓你選喔↓↓↓
PTT鄉民限量,團購,限時,週年慶,【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)禮物,優惠,特價,開箱,比價【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒),活動,好評,推薦
【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)01網友哪裡便宜,採購,優缺點,試用,【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)好用,【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)CP值,經驗,好康,集購,下殺,免比價,去哪買?,
名人推薦介紹,【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)部落客,排行,體驗,精選,限定,折扣,【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)折價卷,ptt,蝦皮拍賣,Dcard推薦評比開箱
家電選購指南!【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)牌子好
如何選購【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)哪個牌子好
新手選購有技巧!部落客大推【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)這牌子好
【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)好用
這個家電品牌子好【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)你不能錯過
具備了哪些功能的【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)好用?如何選購
↓↓↓【Panasonic 國際牌】LUMIX G LEICA DG VARIO-ELMARIT 12-60mm F2.8-4.0 APSH / POWER O.I.S(平輸-白盒)限量特惠的優惠按鈕↓↓↓
熱點新知搶先報
作者·黃崇遠 『數據蟲巢』 全文共8030字 題圖ssyer.com ... 「 萬年長青的CTR預估。」 本文將涉及廣告的排序相關業務,以及CTR預估的模型發展,最後將給出XGB+LR的經典組合解決方案。 本文的示例項目,基於Kaggle上的開源CTR預估數據集,見Github地址(記得給start哈): 01 前言 在之前我們了解了廣告基礎屬性(性別)的預測,並通過他了解了用機器學習思路解決業務問題的基本流程;隨後我們又通過廣告中異常檢測的話題,學習了CostSensitiveClassification以及Smote過採樣等機器學習的知識;緊接著我們對基於標籤組合的智能定向話題進行了了解,並結合場景了解和學習了FM算法;接著對於商業興趣標籤的建模構建進行了了解,順帶把XGboost這個神器給學習了。 今天,我們來了解廣告領域中算法應用歷史最悠久的CTR預估場景,一個廣告系統可以沒有商業興趣標籤,可以沒有智能定向,甚至可以沒有基礎屬性,但只要在效果廣告領域範疇內,就少不了CTR的預估。 並且,CTR預估不止在廣告領域,在推薦系統場景同樣是核心的存在,大致邏輯上是很相似的,只不過場景業務上不一樣,有時候優化的目標也有所差異。 02 CTR預估的作用 我們先來看下整個廣告系統的大致架構圖。 ... 這張圖在《數據與廣告系列七:廣告與推薦系統技術架構》出現過,不知道大家還是否記得,當時我們是按整體邏輯結構進行講解的,這裡我們不關心整體的邏輯架構,只關心CTR核心在哪個環節起作用。 如圖所示,顯然CTR預估階段發生在召回之後,投放之前,很多廣告系統會把預估跟排序看成一個階段,其實無所謂,從底層邏輯的角度看,CTR預估模型是核心影響排序的因素,特別是一些相對初級的廣告系統,其實最終核心影響排序的因素就是ctr+cpc出價,其他的諸如廣告主質量評分,環境上下文評分都不怎麼考慮。 當然,一些硬性策略性的控制還是會做的。比如基礎的曝光頻度控制,主題廣告的適當加權,黑白名單的控制等等。 回到廣告排序的問題,從一個User進來之後,需要根據一些過濾性策略,包括頻控,黑白名單等條件,在剩餘的廣告池中,再根據廣告的定向條件,進行召回匹配,拿到若干個待排序候選廣告,形成一個廣告列表。 然後廣告列表走排序邏輯,最終根據排序的順序,取第一個score最高的廣告給當前user進行曝光。 在這裡,我們假設只做最簡單的排序計算考慮,其實就是CTR*CPC,而如果再乘以1000轉換過來就是eCPM,即千次展示期望收益。 從這裡我們可以看到,其實一個排序邏輯就是最終我們系統所期望的優化目標,即如果是CTR*CPC的計算方式,假設CTR預估又十分準確的情況下,這種機制其實是往平臺收益目標去優化的。 道理邏輯很簡單,假設拋出了其他因素情況下(定向符合,頻控符合),哪個廣告能給我帶來更高的收益,我就把這次曝光機會給誰(廣告)。 CPC每個廣告給出來的都是明確的,價高價低一目了然,剩下來就是CTR預估的事了,預估的準確意味著你的平臺收益更加的穩定,以及達到理論收益最大值。 所以,讓CTR預估的更準就變成了廣告系統最最最重要的事,畢竟都是真金白銀吶。 但是,有個問題不知道大家有沒有考慮過,我們一切以CTR*CPC為核心邏輯作為排序基準,來確定流量曝光給哪個廣告,但對於廣告主來說並不一定都是好事。 以前面幾個我們認真了解過的業務領域比如《數據與廣告系列八:廣告與二類電商》《數據與廣告系列九:本地化廣告》《數據與廣告系列十六:廣告與遊戲》來說,本地化廣告看的表單填寫,所以直接轉化是有效表單,本質轉化是最終到店的流量;對於二類電商來說,直接轉化是有效填單,最終轉化是賣了多少商品多少錢;對於遊戲來說,直接轉化是下載註冊,最終轉化是付費。 所以,不管怎麼看Click都只是第一層的轉化,對於平臺來說,只要Click了,就收錢,收錢平臺收益就高了,沒毛病。但是對於廣告主來說,Click了也屁用沒有,實際上可怕的是部分領域裡後端轉化與前端轉化(CTR)是成反比的,前端轉化越高,後端轉化越差,我的娘啊。 而對於廣告系統來說,平衡多方利益(平臺方收益,廣告主轉化,用戶體驗,詳情參考《數據與廣告系列五:廣告生態的平衡與人群定向初探》)才能「長治久安」,所以當廣告系統發展到了一定階段,光看著ctr這塊肉已經滿足不了社會的和諧發展了。 這也就有oCPX動態優化廣告的出現,這就是另外一個話題了,但核心打破的確實是傳統的排序邏輯,並且可以預見的是,光一個ctr已經夠麻煩了,再加入其他衡量因素,預測起來的難度就更大了。 今天,我們不叉題,繼續回到CTR預估的話題,到後面總是會遇到oCPX相關場景的。 03 CTR預估模型的發展 早期說到廣告系統是最早將數據和機器學習進行規模化價值挖掘的,就是因為CTR預估很早就將機器學習的一些模型應用於實際的問題解決中了。 所以,其實他由於歷史足夠久遠,久遠到廣告系統發展了多少年,CTR預估模型就發展了多少年。 早在2010年以前,機器學習發展有限,由於研究的深度以及硬體的發展原因,深度學習相關的領域尚未展露出應有的價值,所以還是傳統機器學習的天下。而由於CTR的場景,包括廣告和推薦系統,都有一個相對共同的特徵,那就是特徵高度稀疏,然後由於線上服務,系統對於模型的預測性能要求較高,且工業化場景對於性能要求需要穩定。 能滿足這三個條件的傳統機器學習算法並不多,線性的LR,由於模型足夠簡單,可解釋性強,且對於高維稀疏特徵同樣可以應對,性能良好。所以就變成了LR通萬法,廣告CTR用他,推薦系統排序點擊預估用他,人群的Lookalike也用他。 老好用了。 但是LR對於特徵的挖掘要求很高,需要我們很好的理解特徵,能找到好的特徵,且對特徵處理的好,模型的表現就相對較好,這嚴重限制了發展。 2010年,隨著FM算法論文的產生,以及緊隨其後的FM家族(FFM,FNN等),解決了特徵之間特徵組合的問題,並且通過數學解法(因子分解)來尋求特徵與目標之間的隱藏關係,打破了之前LR模型中嚴謹的特徵工程的難題。 然後一些集成學習的路子,解決了單模型帶來的穩定性以及過擬合欠擬合的問題,一些諸如隨機森林,GBDT等集成類的模型解決方案應用於CTR預估的場景中。 2016年,谷歌一篇論文指出,可以通過GBDT(Gradient Boost Desision Tree)來解決LR模型特徵組合的問題,即使用GBDT或者類似的集成樹模型訓練,然後擬合好了之後,取每棵樹的葉子節點作為新的特徵,加入到原始特徵之中,再灌入到LR模型中,效果會比純粹的LR好(谷歌說的,不是我說的)。 這種思路其實跟上上一篇《數據與廣告系列十四:智能定向&基於FM的標籤組合推薦思路》是一樣的,或者說那個思路是借鑑於類似的思想,先用模型擬合好,然後再利用模型的中間結果作為後續階段的輸入。 總之,這種基於模型聯級的方案據說很好使,哪怕是當前深度學習大行其道的今天,依然還有很多廣告系統把他當成一個穩定的baseline在使用。 然後到了2016年左右(剛好也是深度學習強勢的時期),出現了好幾個針對性的算法(又是谷歌,谷歌果然是廣告界的帶頭大哥,帶節奏帶的很溜),包括Wide&Deep Learning,FNN。 他們都有一個特點就是,傳統模型與深度模型的聯姻,強強結合。比如WDL利用傳統的wide模型(比如LR)來學習目標與特徵之間強關係,再利用Deep Learning部分(例如MLP)來加強擬合的泛化能力。 而FNN,則跟FM有直接的關係,利用FM模型將特徵進行Embedding表示,然後用這個特徵來替代原始特徵,二階段使用MLP(多層感知機)來做最終的擬合模型,借用的是GBDT+LR的思路。 總之,整個CTR模型的發展史就是機器學習與深度學習的發展史,畢竟廣告業務是目前世界上網際網路最大的變現手段之一(廣告/遊戲/電商),所以,有錢的地方就有動力,太有道理了。 04 CTR預估:XGBoost+LR實操 PS:微信上看嵌入的代碼不是很好看,建議這裡只看邏輯脈絡,具體的代碼上Github上看。 整體而言,有能力上深度學習模型的,多少都會試一下深度學習的一些模型,深度學習的模型理論上具有更強的泛化能力,但同樣門技術檻以及調優的難度都更大,實操起來並不一定會比傳統模型好。 傳統模型發展了足夠多的年份,大家摸底摸得也比較透徹了,所以作為基準來說更加的穩定,更具有可控性,所以「殘留」的傳統模型也依然在生效中,並沒有絕跡於江湖(廣告/推薦場景)。 今天這篇,我們的實操部分,依然不會把手伸到深度學習領域,我們來學習集成的樹模型與LR的模型聯級解決方案,而集成模型這塊,我們並沒有使用傳統的GDBT,而是使用我們之前也接觸過的XGBoost,不同的配方,同樣的效果(可以用GBDT,也可以用LightBGM,或者XGBoost)。 對於數據集,我們使用Kaggle上知名的CTR預估數據集: https://www.kaggle.com/c/avazu-ctr-prediction。 但是這份數據集太大了,大到了我們自己的小機器無法跑起來,所以我就取了另外一份數據: https://www.kaggle.com/sulabh4/ctr-prediction-dataset。 據觀察,這份數據是從avazu數據集上截取下來的子集,只有二三十兆(999999條記錄),或者直接上avazu上隨機抽樣一部分下來演練也是一樣的。 kaggle上的欄位說明: ... 大部分欄位通過命名就大概知道什麼意思了,然後C系列的欄位是數據公開方隱藏含義的類別欄位,估計涉及到隱私問題,反正我們就當成正常的一個可用特徵即可。 我們直接按click進行樣本區分,分為正負樣本,數據如下: 如果我們要做的嚴謹點,我們接下來做對應一些特徵的轉換,一些非int類型的轉換為類別編碼,或者更深入點做特徵的分析。 整體數據情況如下(注意數據類型): ... 將非數值類型的欄位進行編碼轉換: ##接下來對特徵進行處理,先將類別特徵進行編碼#針對類型類的特徵,先進行編碼,編碼之前構建字典from sklearn import preprocessingdef label_encode(field,df):dic = df_field = df[field]list_field = df_field.tolist#構建field字典for i in list_field:if i not in dic:dic.append(i)label_field = preprocessing.LabelEncoderlabel_field.fit(dic)df_field_enconde_tmp = label_field.transform(df_field)df_field_enconde = pd.DataFrame(df_field_enconde_tmp, index=df.index, columns=[(field+'_enconde')])return df_field_encondedf_site_id_enconde = label_encode('site_id',df)df_site_domain_enconde = label_encode('site_domain',df)df_site_category_enconde = label_encode('site_category',df)df_app_id_enconde = label_encode('app_id',df)df_app_domain_enconde = label_encode('app_domain',df)df_app_category_enconde = label_encode('app_category',df)df_device_id_enconde = label_encode('device_id',df)df_device_ip_enconde = label_encode('device_ip',df)df_device_model_enconde = label_encode('device_model',df) 然後特徵進行拼接,並作為中間結果保存下來: pd_input = pd.concat([df[['click','banner_pos','device_type','device_conn_type','C1','C14','C15','C16','C17','C18','C19','C20','C21']],df_site_id_enconde,df_site_domain_enconde,df_site_category_enconde,df_app_id_enconde,df_app_domain_enconde,df_app_category_enconde,df_device_id_enconde,df_device_ip_enconde,df_device_model_enconde], axis=1)##處理過的數據保存下來pd_input.to_csv('./out_put/encode_data.csv', header=True, index=True) 此時,我們第一階段的特徵簡單處理結束了, 01_encode_data.ipynb文件的最終結果是拿到簡單encode的數據。 ... 接下來第二階段進行數據集的劃分,數據劃分邏輯如下: #對編碼之後的數據進行分片begin_time = time.timeprint(f'Begin Time : {time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(begin_time))}')#將數據分為train/validata/testdata三部分df_1 = df[df['click'] == 1]df_0 = df[df['click'] == 0]df_1_test =df_1.sample(frac=0.3, random_state=100)df_0_test =df_0.sample(frac=0.3, random_state=100)df_1_other = df_1[~df_1.index.isin(df_1_test.index)]df_0_other = df_0[~df_0.index.isin(df_0_test.index)]df_1_vali = df_1_other.sample(frac=0.2, random_state=100)df_0_vali = df_0_other.sample(frac=0.2, random_state=100)df_1_train = df_1_other[~df_1_other.index.isin(df_1_vali.index)]df_0_train = df_0_other[~df_0_other.index.isin(df_0_vali.index)]#合併1/0df_train = pd.concat([df_1_train,df_0_train], ignore_index=True)df_vali = pd.concat([df_1_vali,df_0_vali], ignore_index=True)df_test = pd.concat([df_1_test,df_0_test], ignore_index=True)print(f'--split data : {time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time))}')nums_train = df_train['click'].countnums_vali = df_vali['click'].countnums_test = df_test['click'].countprint(f'--split rate train VS vali VS test: {nums_train}:{nums_vali}:{nums_test}')df_train.to_csv('./out_put/encode_data_train.csv')df_vali.to_csv('./out_put/encode_data_vali.csv')df_test.to_csv('./out_put/encode_data_test.csv')end_time = time.timeprint(f'End Time : {time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(end_time))}')--split rate train VS vali VS test: 559999:140000:300000 第三階段,進行xgboost的訓練,並保存葉子節點的onehot特徵,如下為進行xgboost的擬合: ##進行xgboost擬合begin_time = time.timeprint(f'Begin Time : {time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(begin_time))}')##受限於機器的資源,這裡就不做gridsearch調參了,直接湊合著來(按最小資源消耗來設置參數)model = XGBClassifier(learning_rate=0.1,n_estimators=10,max_depth=3,scale_pos_weight=1,min_child_weight=1,gamma=0,subsample=1,colsample_bylevel=1,objective='binary:logistic',n_jobs=4,seed=100)eval_set = [(x_vali, y_vali)]model.fit(x_train, y_train, eval_metric="auc" , eval_set=eval_set, early_stopping_rounds=10)end_time = time.timeprint(f'End Time : {time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(end_time))}') 這裡受限於我那小小的阿里雲主機,所以只能按樹最少,層級最小的方式去跑了,不然跑不動,窮。 結果列印: Begin Time : 2020-02-01 19:19:05[0] validation_0-auc:0.663951Will train until validation_0-auc hasn't improved in 10 rounds.[1] validation_0-auc:0.669895[2] validation_0-auc:0.670909[3] validation_0-auc:0.671622[4] validation_0-auc:0.673234[5] validation_0-auc:0.675165[6] validation_0-auc:0.675224[7] validation_0-auc:0.682689[8] validation_0-auc:0.684437[9] validation_0-auc:0.687103End Time : 2020-02-01 19:19:11 並不能算一個非常好的效果,這個結果是非常丟臉的,隨便加大樹的數量和調大樹層級,auc輕鬆上0.75,為了能讓後面的onehot葉子組合特徵跑起來可謂是費盡心機啊,這裡不管了,假設這個model就已經是最優xgboost的擬合模型了。 對葉子組合特徵進行編碼,並且分別保留onehot編碼特徵和與原始特徵拼接之後的df: #我們來拿到xgb的葉子節點的特徵##進行xgboost擬合begin_time = time.timeprint(f'Begin Time : {time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(begin_time))}')##apply函數返回的是葉子索引x_train_leaves = model.apply(x_train).astype(np.int32)x_test_leaves = model.apply(x_test).astype(np.int32)#使用nunpy的concatenate來拼接數組,並生成全局的onehot,單一使用train的可能會漏掉編碼,test驗證的時候出問題x_leaves = np.concatenate((x_train_leaves,x_test_leaves), axis=0)print(f'Transform xgb leaves shape: {x_leaves.shape}')xgb_onehotcoder = OneHotEncoderxgb_onehotcoder.fit(x_leaves)x_train_lr = xgb_onehotcoder.transform(x_train_leaves).toarrayx_test_lr = xgb_onehotcoder.transform(x_test_leaves).toarrayprint(f'Transform xgb x_train_lr shape: {x_train_lr.shape}')print(f'Transform xgb x_test_lr shape: {x_test_lr.shape}')##進行one特徵與原始特徵的拼接x_train_lr2 = np.hstack((x_train_lr, x_train.values))x_test_lr2 = np.hstack((x_test_lr, x_test.values))print(f'Transform xgb x_train_lr2 shape: {x_train_lr2.shape}')print(f'Transform xgb x_test_lr2 shape: {x_test_lr2.shape}')end_time = time.timeprint(f'End Time : {time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(end_time))}') 我們可以看到特徵情況如下: Transform xgb leaves shape: (859999, 10)Transform xgb x_train_lr shape: (559999, 80)Transform xgb x_test_lr shape: (300000, 80)Transform xgb x_train_lr2 shape: (559999, 101)Transform xgb x_test_lr2 shape: (300000, 101) 這意味著,我們通過xgb的組合特徵,額外增加了80個特徵,我們繼續分別將這些特徵灌入到LR中進行train: ###灌入到LR中begin_time = time.timeprint(f'Begin Time : {time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(begin_time))}')lr_model = LogisticRegressionlr_model.fit(x_train_lr, y_train)lr_model2 = LogisticRegressionlr_model2.fit(x_train_lr2, y_train)joblib.dump(lr_model, './model/lr_model.pkl')joblib.dump(lr_model2, './model/lr_model2.pkl')end_time = time.timeprint(f'End Time : {time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(end_time))}') 對比三組效果,分別是單獨的XGB模型,XGB的葉子特徵獨立LR模型,特徵拼接的LR模型,先構建效果函數: ##效果輸出函數def func_print_score(x_data,y_data,data_type,model_x):y_pred = model_x.predict(x_data)print(f'==============({data_typeconfusion = metrics.confusion_matrix(y_data, y_pred)print(confusion)print('')auc = metrics.roc_auc_score(y_data,y_pred)print(f'AUC: {auc}')print('')aupr = metrics.average_precision_score(y_data, y_pred)print(f'AUPR: {aupr}')print('')report = metrics.classification_report(y_data, y_pred)print(report)print 分別輸出混淆矩陣,AUC,Accuracy,AUPR(AUC有效面積,衡量不均衡分類時非常好用),以及分類報告,輸出結果如下: ==============(testdata-xgb[[248629 3305][ 44416 3650]]AUC: 0.5314093688885991Accuracy: 0.84093AUPR: 0.18790537837217178precision recall f1-score support0 0.85 0.99 0.91 2519341 0.52 0.08 0.13 48066avg / total 0.80 0.84 0.79 300000==============(testdata-xgb-lr[[247447 4487][ 43073 4993]]AUC: 0.5430338904724129Accuracy: 0.8414666666666667AUPR: 0.19828793875544898precision recall f1-score support0 0.85 0.98 0.91 2519341 0.53 0.10 0.17 48066avg / total 0.80 0.84 0.79 300000==============(testdata-xgb-lr2[[251376 558][ 47867 199]]AUC: 0.5009626374208841Accuracy: 0.8385833333333333AUPR: 0.16064502596303487precision recall f1-score support0 0.84 1.00 0.91 2519341 0.26 0.00 0.01 48066avg / total 0.75 0.84 0.77 300000 結果數據慘不忍睹,我們將PR曲線列印出來,代碼如下: ##測試數據的PR曲線probas_xgb = model.predict_proba(x_test)probas_lr = lr_model.predict_proba(x_test_lr)probas_lr2 = lr_model2.predict_proba(x_test_lr2)##precision_recall_curve函數precision_xgb,recall_xgb, thresholds_xgb = metrics.precision_recall_curve(y_test, probas_xgb[:,1])precision_lr,recall_lr, thresholds_lr = metrics.precision_recall_curve(y_test, probas_lr[:,1])precision_lr2,recall_lr2, thresholds_lr2 = metrics.precision_recall_curve(y_test, probas_lr2[:,1])plt.figure(figsize=(8,6))plt.plot(recall_xgb, precision_xgb, label = 'xgb', alpha = 0.8, color = 'red')plt.plot(recall_lr, precision_lr, label = 'xgg-lr', alpha = 0.8, color = 'blue')plt.plot(recall_lr2, precision_lr2, label = 'xgb-lr2', alpha = 0.8, color = 'green')plt.plot([0,1],[0,1],'k--')#圖例列印plt.legend(bbox_to_anchor=(1.05, 0), loc = 3, borderaxespad = 1)plt.xlim([-0.05, 1.05])plt.ylim([-0.05, 1.05])plt.xlabel('Recall Rate')plt.ylabel('Precision Rate')plt.title('PR Curve') 最後的PR曲線,更慘不忍睹,曲線太秀了,辣眼睛: ... 從PR曲線的角度看,還不如純粹的XGB模型效果好,但這個曲線並不能代表任何東西,因為我們所以的流程都是奔著能跑通,以及流程走通為主要目的,如果大家看github上的源碼,會發現存在大量的臨時gc回收等動作,沒辦法,我的阿里雲試驗機子內存以及核太小,只能先把流程跑通再說。 以上所有示例代碼,以及項目,代碼都放在了Github上(記得給start哈): 總之,大概的流程邏輯如上了。 05 總結 CTR預估不管是過去,還是未來都是重中之中,這裡給出的示例是XGB+LR的組合方案,也算業界一個典型的Baseline方案,熟悉基準方案對於理解CTR預估還是有一定幫助的。 況且對於一些初入廣告領域的朋友來說,也是一個不錯的練手項目。 而且這裡是CTR預估,其實底層核心都是對於目標的擬合,底層方案是可以互通的,比如後面可能涉及到oCPX,以及其他類似的領域。繞來繞去,最後發現了其實業務場景映射下來,很多底層技術都是互通的,而上層的業務更多關注於樣本以及特徵的構建。 先不說這麼多,下個階段,我們可能將脫離常規的機器學習技術方案了,是的,題目都已經想好了,就叫《廣告的召回與LookAlike,萬物皆可Embedding》。 參考文獻 【01】看了很多資料,大過年的,實在沒有精力整理了,改天補上。 ... 文章都看完了,還不點個讚來個賞~
SREDD1515DEFE51YH |
文章來源取自於:
壹讀 https://read01.com/zyndE2B.html
MOMO購物網 https://www.momoshop.com.tw/goods/GoodsDetail.jsp?i_code=5673002&memid=6000007380&cid=apuad&oid=1&osm=league
如有侵權,請來信告知,我們會立刻下架。
DMCA:dmca(at)kubonews.com
聯絡我們:contact(at)kubonews.com
【富邦momo台折扣優惠開箱評價】【富邦媒體科技折扣優惠開箱評價】【momo優惠年終】【momo 1台折扣優惠開箱評價】
【momo旅遊購物台折扣優惠開箱評價】 【Hamilton】漢米爾頓 JAZZMASTER 分秒必爭時尚機械腕錶-銀x咖啡42mm(H42615553)【momo購物台折扣優惠開箱評價】 【PUMA】女性 訓練系列 Feel It中衝擊 運動內衣 -黑色-歐規(51828907)【富邦mo折扣優惠開箱評價】 【小米】米家小相機(攝影機 錄影機)(1)【momo購物台 購物台折扣優惠開箱評價】 【日本SUN FAMILY】360度全方位平腹美腰帶
留言列表