91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用python怎么預測廣告點擊率

發布時間:2021-03-24 17:05:20 來源:億速云 閱讀:231 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關使用python怎么預測廣告點擊率,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

數據

可以在這里下載移動廣告點擊數據,由于總數據量達到了4千多萬條,數據量過于龐大,為了不影響我們的計算速度,因此我們要從中隨機抽樣100萬條數據,同時我們要對數據的相關字段類型進行重置,這有助于我們以后的計算以及可視化。

types_train = {
  'id': np.dtype(int), 
  'click': np.dtype(int),    #是否點擊,1表示被點擊,0表示沒被點擊
  'hour': np.dtype(int),    #廣告被展現的日期+時間
  'C1': np.dtype(int),     #匿名分類變量
  'banner_pos': np.dtype(int), #廣告位置
  'site_id': np.dtype(str),   #站點Id
  'site_domain': np.dtype(str), #站點域名
  'site_category': np.dtype(str), #站點分類
  'app_id': np.dtype(str),    # appId 
  'app_domain': np.dtype(str),  # app域名
  'app_category': np.dtype(str), # app分類
  'device_id': np.dtype(str),   #設備Id
  'device_ip': np.dtype(str),   #設備Ip
  'device_model': np.dtype(str), #設備型號
  'device_type': np.dtype(int),  #設備型號
  'device_conn_type': np.dtype(int),
  'C14': np.dtype(int),  #匿名分類變量
  'C15': np.dtype(int),  #匿名分類變量
  'C16': np.dtype(int),  #匿名分類變量
  'C17': np.dtype(int),  #匿名分類變量
  'C18': np.dtype(int),  #匿名分類變量
  'C19': np.dtype(int),  #匿名分類變量
  'C20': np.dtype(int),  #匿名分類變量
  'C21':np.dtype(int)  #匿名分類變量
}
 
n = 40428967 #數據集中的記錄總數
sample_size = 1000000
skip_values = sorted(random.sample(range(1,n), n-sample_size)) 
parse_date = lambda val : pd.datetime.strptime(val, '%y%m%d%H')
 
with gzip.open('./data/ctr/train.gz') as f:
  train = pd.read_csv(f, parse_dates = ['hour'], date_parser = parse_date, dtype=types_train, skiprows = skip_values)
print(len(train))
train.head()

使用python怎么預測廣告點擊率

特征工程

接下來我們要做的就是數據的探索性分析(EDA)和特征工程(Feature Engineering),首先我們要確定哪些目標變量,哪些是特征變量,根據kaggle中對數據的描述信息中我們可知,目標變量就是"click"字段它表示廣告是否被點擊過(1表示被點擊,0未被點擊),其余所有的字段都是特征變量。在特征變量中C1,C14~C21表示匿名的分類變量(我們不知道它的含義),其余的特征變量都是和站點,app,設備相關的變量。我們搞清了變量的大概含義以后,接下來我們要分析一下目標變量"click",首先看看它的數據分布情況:

print(train['click'].value_counts())
print()
print(train['click'].value_counts()/len(train))
 
sns.countplot(x='click',data=train, palette='hls')
plt.show()

使用python怎么預測廣告點擊率  

 在“click”變量的統計數據中,點擊的數量大約占17%,未點擊的數量大約占83%。也就是說廣告的平均點擊率大概是在17%左右。

接下來我們來分析另外一個關鍵的特征變量:hour,它可能表示廣告被展現的日期+時間,我們要看看不同的日期和時間對廣告點擊量的影響:

print(train.hour.describe())
 
train.groupby('hour').agg({'click':'sum'}).plot(figsize=(12,6))
plt.ylabel('點擊量')
plt.title('時間和點擊量')

使用python怎么預測廣告點擊率

由上面的統計結果可知數據的開始時間是2014-10-21 00:00:00,結束時間是2014-10-30 23:00:00,一共10天,點擊量高峰的時刻是在10月22日和10月28日這兩天,10月24日點擊量最低。

對Hour的特征工程

我們知道hour變量包含了具體的日期和時間,接下來我們想知道點擊量和具體的時間是什么關系,此時我們忽略日期,只關注具體時間和點擊量。接下來我們從hour變量中抽取時間,然后查看時間和點擊量之間的關系:

train['time'] = train.hour.apply(lambda x: x.hour)
train.sample(5)

使用python怎么預測廣告點擊率

train.groupby('time').agg({'click':'sum'}).plot(figsize=(12,6),grid=True)
plt.ylabel('點擊次數')
plt.title('時間和點擊量')

使用python怎么預測廣告點擊率

我們看到點擊量的高峰大約是在每天下午的13點到14點之間 ,點擊量的最低點是在每天的零點左右。這應該是合理的,因為下午1點到2點應該是人們精力最旺盛的時候,而晚上零點大部分人都進入了夢鄉。

接下來我們要查看一下在不同的時間點的情況下,廣告的展現量和點擊量的關系:

train.groupby(['time', 'click']).size().unstack().plot(kind='bar', figsize=(12,6))
plt.ylabel('數量')
plt.title('展現量與點擊量');

使用python怎么預測廣告點擊率

 我們將時間按每個時間點展開,這里沒有特別之處下午1點的展現量最大,所以點擊量也是最大,我們發現展現量和點擊量似乎是成正比的。這似乎也告訴我們,如果您要投放在線廣告,請在下午1點至2點之間投放,因為此時廣告的展現量和點擊量都是最大的。

接下來我們來計算一下各個時間點的廣告點擊率,并查看點擊率的數據分布。

df_click = train[train['click'] == 1]
df_hour = train[['time','click']].groupby(['time']).count().reset_index()
df_hour = df_hour.rename(columns={'click': 'impressions'})
df_hour['clicks'] = df_click[['time','click']].groupby(['time']).count().reset_index()['click']
df_hour['CTR'] = df_hour['clicks']/df_hour['impressions']*100
df_hour.head()

使用python怎么預測廣告點擊率

plt.figure(figsize=(12,6))
sns.barplot(y='CTR', x='time', data=df_hour)
plt.title('點擊率的時間分布')

使用python怎么預測廣告點擊率

在這里我們發現了一件有趣的事,廣告點擊率最高的時間點居然在凌晨1點,上午7點,下午16點,而從之前的分析中我知道廣告展現量最高的時間點是在下午的13點, 但是從上圖中我們可知13點的廣告點擊率并非是最高的。這似乎說明高的展現量和高的點擊量并不意味著就有高的點擊率。凌晨1點上網的“夜游神”們才是點擊率的真正貢獻者。

按星期特征工程

前面我們我們已經分別實現了按日期和按時間兩種方式來分析點擊率,接下來我們再繼續擴展對hour變量的分析,這回我們要按星期來分析點擊率。我們首先要把hour變量轉換成星期。

train['day_of_week'] = train['hour'].apply(lambda val: val.weekday_name)
cats = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
train.groupby('day_of_week').agg({'click':'sum'}).reindex(cats).plot(figsize=(12,6))
ticks = list(range(0, 7, 1)) 
labels = "周一 周二 周三 周四 周五 周六 周日".split()
plt.xticks(ticks, labels)
plt.title('星期的點擊量')

使用python怎么預測廣告點擊率

train.groupby(['day_of_week','click']).size().unstack().reindex(cats).plot(kind='bar', title="Day of the Week", figsize=(12,6))
ticks = list(range(0, 7, 1)) 
labels = "周一 周二 周三 周四 周五 周六 周日".split()
plt.xticks(ticks, labels)
plt.title('星期的展現量和點擊量分布')

 使用python怎么預測廣告點擊率

 從上圖可知星期二的展現量和點擊量是最高的,接下來是星期三和星期四,不過展現量和點擊量較高并不意味著點擊率也較高,因此接下來我們要按星期來計算一下點擊率。

df_click = train[train['click'] == 1]
df_dayofweek = train[['day_of_week','click']].groupby(['day_of_week']).count().reset_index()
df_dayofweek = df_dayofweek.rename(columns={'click': 'impressions'})
df_dayofweek['clicks'] = df_click[['day_of_week','click']].groupby(['day_of_week']).count().reset_index()['click']
df_dayofweek['CTR'] = df_dayofweek['clicks']/df_dayofweek['impressions']*100
 
plt.figure(figsize=(12,6))
sns.barplot(y='CTR', x='day_of_week', data=df_dayofweek, order=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'])
plt.title('星期的點擊率')

使用python怎么預測廣告點擊率

通過之前的我們知道星期二和星期三有著最高的展現量和點擊量,可是他們的點擊率卻是最低的。相反星期六和星期天卻有著最高的點擊率。這是否說明星期六和星期天是人民群眾最空閑的時候,有了空閑時間大家才會想到去購物,所以廣告的點擊率才會是最高的?

通過對數據的嚴謹分析,我們就會從中發現人民群眾的日常行為舉止以及他們的活動規律都會在數據中得到體現,只要你足夠努力,就可以讓數據說話!

匿名特征變量C1

C1是一個匿名的分類型變量,我們不知道它的含義,我們先查看一下c1的數據分布

print(train.C1.value_counts()/len(train))

使用python怎么預測廣告點擊率

 因為C1是分類型變量,它的值包含了1005,1002,1010,1012,1007,1001,1008七種,其中1005的所占比例高達91.87%,接下來我們看看C1的不同的值對點擊率的貢獻

C1_values = train.C1.unique()
C1_values.sort()
ctr_avg_list=[]
for i in C1_values:
  ctr_avg=train.loc[np.where((train.C1 == i))].click.mean()
  ctr_avg_list.append(ctr_avg)
  print(" C1 value: {}, 點擊率: {}".format(i,ctr_avg))

使用python怎么預測廣告點擊率

 從上面的統計結果可知,雖然1005數據量所占比重最高,但是它的點擊率并不是最高,1002的點擊率最高達到了21.3%。接下來我們看一下C1的展現量和點擊量的分布

train.groupby(['C1', 'click']).size().unstack().plot(kind='bar', figsize=(12,6), title='C1 展現量和點擊量分布');

使用python怎么預測廣告點擊率

 從上圖可知,1005的展現量和點擊量是最高的,但這并不意味著點擊率也是最高的,下面我們看一下C1的點擊率的分布

df_c1 = train[['C1','click']].groupby(['C1']).count().reset_index()
df_c1 = df_c1.rename(columns={'click': 'impressions'})
df_c1['clicks'] = df_click[['C1','click']].groupby(['C1']).count().reset_index()['click']
df_c1['CTR'] = df_c1['clicks']/df_c1['impressions']*100
 
plt.figure(figsize=(12,6))
sns.barplot(y='CTR', x='C1', data=df_c1)
plt.title('C1的點擊率分布')

使用python怎么預測廣告點擊率

我們看到點擊率最高的并不是1005,而是1002. 它的點擊率達到了21%,下面我們總結一下C1數據量和點擊率的分布:

使用python怎么預測廣告點擊率

從上表中我們可以看出,1002的數據比例是5.5%,它貢獻的點擊率為21.33%遠大于17%的平均點擊率,1002的數據比例為0.28%卻貢獻了17.66%的點擊率,1008的數據比例是0.01%,它貢獻了14.84%的點擊率,性價比非常高。

banner_pos

banner_pos表示廣告在網頁中的位置,廣告擺放在網頁的不同位置可能會帶來不同的點擊量和點擊量,下面我們就來分析一下banner_pos這個分類型變量。首先我們查看一下banner_pos的數據分布

使用python怎么預測廣告點擊率

從上面的統計結果可知banner_pos包含了7個值,它可能代表網頁中的7個不同位置,其中位置0和位置1占據了機會99%的數據比例,也就是說絕大多數廣告都房子了位置0或者位置1的地方。

下面我們看看不同位置對點擊率的貢獻:

banner_pos = train.banner_pos.unique()
banner_pos.sort()
ctr_avg_list=[]
for i in banner_pos:
  ctr_avg=train.loc[np.where((train.banner_pos == i))].click.mean()
  ctr_avg_list.append(ctr_avg)
  print(" banner 位置: {}, 點擊率: {}".format(i,ctr_avg))

使用python怎么預測廣告點擊率

位置0和位置1的點擊率分別為16.4%和18.3%,它們的點擊率并不是最高。位置7和位置3的點擊率分別達到了31%和21%,它們的點擊率要比位置1和位置0高很多。

train.groupby(['banner_pos', 'click']).size().unstack().plot(kind='bar', figsize=(12,6), title='banner 位置的廣告展現量和點擊量的分布')

使用python怎么預測廣告點擊率

下面我們再看一下banner_pos的點擊率的分布

df_banner = train[['banner_pos','click']].groupby(['banner_pos']).count().reset_index()
df_banner = df_banner.rename(columns={'click': 'impressions'})
df_banner['clicks'] = df_click[['banner_pos','click']].groupby(['banner_pos']).count().reset_index()['click']
df_banner['CTR'] = df_banner['clicks']/df_banner['impressions']*100
sort_banners = df_banner.sort_values(by='CTR',ascending=False)['banner_pos'].tolist()
plt.figure(figsize=(12,6))
sns.barplot(y='CTR', x='banner_pos', data=df_banner, order=sort_banners)
plt.title('banner 位置的點擊率的分布')

使用python怎么預測廣告點擊率

 從上圖可知位置7和位置3的點擊率是最高的,但是他們的數據比例并不是最多的,相反位置0和位置1的數據比例,展現量和點擊量都是最高的,但是他們的點擊率并非最高。

device_type

device_type表示設備類型,廣告可能會在多種設備上展示,下面我們看一下device_type的數據分布

使用python怎么預測廣告點擊率

我們看到一共有4種設備,其中設備1所占比例最大達到了92%, 絕大多數廣告都是在設備1上展示的。下面我們看一下展現量和點擊量的分布

train[['device_type','click']].groupby(['device_type','click']).size().unstack().plot(kind='bar', title='設備類型')

使用python怎么預測廣告點擊率

我們看到設備1上的廣告展現量和點擊量都是最大的。其他設備的展現量和點擊量相對較少。為此我們要詳細分析一下設備1上的點擊量的情況,我們按照不同的時間點對設備1的點擊量進行一下分析。

df_click[df_click['device_type']==1].groupby(['time', 'click'])\
                   .size().unstack()\
                   .plot(kind='bar', title="設備1的點擊量分布", figsize=(12,6))

使用python怎么預測廣告點擊率

從上圖可知,設備1上的點擊量最高點位于下午1點,這和我們之前按時間分析點擊量的結果是一致的。

下面我們分別統計出所有類型的設備的點擊量、展現量和點擊率。

device_type_click = df_click.groupby('device_type').agg({'click':'sum'}).reset_index()
device_type_impression = train.groupby('device_type').agg({'click':'count'}).reset_index().rename(columns={'click': 'impressions'})
merged_device_type = pd.merge(left = device_type_click , right = device_type_impression, how = 'inner', on = 'device_type')
 
merged_device_type['CTR'] = merged_device_type['click'] / merged_device_type['impressions']*100
 
merged_device_type

 使用python怎么預測廣告點擊率

我們看到點擊率最高的設備是設備0,并不是設備1.所以說展現量和點擊量都較高并不意味著點擊率也會較高。

剩余的特征變量的分析過程和上面的類似,這里就不再一一說明,有興趣的朋友可以自己嘗試分析一下。

建模

has簡介

由于我們的的數據樣本量有100萬條,特征變量有20個左右,那么總共的特征值將會有100萬X20=2000萬個左右,為了減少系統內存的消耗,我們要使用python的內置hash函數來映射某些特征變量,我們要將那些類型為object的特征變量映射為一定范圍內的整數(原來的string被映射成了integer),這樣就可以大大降低內存的消耗。

下面我們看看未使用hash之前我們的樣本數據:

使用python怎么預測廣告點擊率

紅框中的特征變量類型均為object, 下面我們要將hash函數將類型為object的變量映射成integer型

def convert_obj_to_int(self):
  
  object_list_columns = self.columns
  object_list_dtypes = self.dtypes
  new_col_suffix = '_int'
  for index in range(0,len(object_list_columns)):
    if object_list_dtypes[index] == object :
      self[object_list_columns[index]+new_col_suffix] = self[object_list_columns[index]].map( lambda x: hash(x))
      self.drop([object_list_columns[index]],inplace=True,axis=1)
  return self
train = convert_obj_to_int(train)
train.head()

使用python怎么預測廣告點擊率

LightGBM 模型 

LightGBM是個快速的,分布式的,高性能的基于決策樹算法的梯度提升框架。可用于排序,分類,回歸以及很多其他的機器學習任務中,接下來我們要使用LightGBM作為我們的分類模型.

X_train = train.loc[:, train.columns != 'click']
y_target = train.click.values
 
msk = np.random.rand(len(X_train)) < 0.8
lgb_train = lgb.Dataset(X_train[msk], y_target[msk])
lgb_eval = lgb.Dataset(X_train[~msk], y_target[~msk], reference=lgb_train)
 
# 配置模型參數
params = {
  'task': 'train',
  'boosting_type': 'gbdt',
  'objective': 'binary',
  'metric': { 'binary_logloss'},
  'num_leaves': 31, # 每棵樹的默認葉子數
  'learning_rate': 0.08,
  'feature_fraction': 0.7, # 將在訓練每棵樹之前選擇70%的特征
  'bagging_fraction': 0.3, #隨機選擇30%的特征。
  'bagging_freq': 5, # 每5次迭代執行bagging
  'verbose': 0
}
 
print('開始訓練...')
 
gbm = lgb.train(params,
        lgb_train,
        num_boost_round=4000,
        valid_sets=lgb_eval,
        early_stopping_rounds=500)

使用python怎么預測廣告點擊率

 XGBoost 模型

XGBoost是boosting算法的其中一種。Boosting算法的思想是將許多弱分類器集成在一起形成一個強分類器。因為XGBoost是一種提升樹模型,所以它是將許多樹模型集成在一起,形成一個很強的分類器。

def run_default_test(train, test, features, target, random_state=0):
  eta = 0.1
  max_depth = 5
  subsample = 0.8
  colsample_bytree = 0.8
  params = {
    "objective": "binary:logistic",
    "booster" : "gbtree",
    "eval_metric": "logloss",
    "eta": eta,
    "max_depth": max_depth,
    "subsample": subsample,
    "colsample_bytree": colsample_bytree,
    "silent": 1,
    "seed": random_state
  }
  num_boost_round = 260
  early_stopping_rounds = 20
  test_size = 0.2
 
  X_train, X_valid = train_test_split(train, test_size=test_size, random_state=random_state)
  y_train = X_train[target]
  y_valid = X_valid[target]
  dtrain = xgb.DMatrix(X_train[features], y_train)
  dvalid = xgb.DMatrix(X_valid[features], y_valid)
  watchlist = [(dtrain, 'train'), (dvalid, 'eval')]
  gbm = xgb.train(params, dtrain, num_boost_round, evals=watchlist, early_stopping_rounds=early_stopping_rounds, verbose_eval=True)
 
 
features = ['C1', 'banner_pos', 'device_type', 'device_conn_type', 'C14',
    'C15', 'C16', 'C17', 'C18', 'C19', 'C20', 'C21', 'time',
    'site_id_int', 'site_domain_int', 'site_category_int', 'app_id_int',
    'app_domain_int', 'app_category_int', 'device_id_int', 'device_ip_int',
    'device_model_int', 'day_of_week_int']
run_default_test(train, y_target, features, 'click')

使用python怎么預測廣告點擊率

關于使用python怎么預測廣告點擊率就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长岭县| 天气| 安西县| 怀远县| 盐源县| 洪江市| 邹城市| 长宁区| 黄浦区| 贞丰县| 灵丘县| 建始县| 堆龙德庆县| 疏勒县| 政和县| 仁化县| 库车县| 河北区| 德清县| 当阳市| 清镇市| 昌江| 博乐市| 铜鼓县| 皋兰县| 乾安县| 兰西县| 磐安县| 五家渠市| 麻栗坡县| 文山县| 泰兴市| 凌源市| 张掖市| 平舆县| 文成县| 双柏县| 新泰市| 班戈县| 上栗县| 丹巴县|