特徵工程:將所有資料拼接到一起做特徵,等到處理完,再按索引拆分資料

1.資料分析

檢視標籤分佈:發現valid與testa、testb的分佈相似,說明valid與testa的查詢時間比較接近,作為驗證集線下比較可信.

2.修正資料型別、缺失值

修正空的query_prediction為'{}';
將label改為int,因為後面要求和
對query_prediction做編碼LabelEncoder() --diction_label
去除重複非統計量特徵label

解析query_prediction字典:
將字典的字串轉換成浮點數 --query_prediction
得到概率最大對應的預測值 --max_query_prediction_keys
取出字典的keys和values --query_prediction_keys、query_prediction_values

解析prefix、title、query:
對prefix分詞 --prefix_jieba
對title分詞 --title_jieba
對query分詞 --query_jieba

文字轉換成拼音:這裡只需要處理使用者的查詢詞就好了
prefix_pinyin --prefix_pinyin

去掉prefix、title中的空格,轉換成大小寫:
去掉prefix中的空格 -- prefix_fix
去掉title中的空格 --title_fix
去掉query中的空格 --query_fix
去掉query_prediction_keys中的空格 --query_prediction_keys_fix

length特徵:
求prefix的長度 --prefix_length
求title的長度 --title_length
求max_query_prediction的長度 --max_query_prediction_keys_length
求query_prediction_values的長度 --query_prediction_values_length

nunique特徵:
prefix相同,title不同的個數:prefix_nunique_title
prefix相同,tag不同的個數:prefix_nunique_tag

title相同,prefix不同的個數:title_nunique_prefix
title相同,tag不同的個數:title_nunique_tag
title相同,query不同的個數:title_nunique_query
title相同,prefix_pinyin不同的個數:title_nunique_prefix_pinyin

tag相同,prefix不同的個數:tag_nunique_prefix
tag相同,title不同的個數:tag_nunique_title
tag相同,max_query不同的個數:tag_nunique_max_query

max_query_prediction_keys相同,prefix不同的個數:query_nunique_prefix
max_query_prediction_keys相同,title不同的個數:query_nunique_title
max_query_prediction_keys相同,tag不同的個數:query_nunique_tag
max_query_prediction_keys相同,prefix_pinyin不同的個數:nunique_prefix_pinyin

prefix_pinyin相同,prefix不同的個數:prefix_pinyin_nunique_prefix
prefix_pinyin相同,title不同的個數:prefix_pinyin_nunique_title
prefix_pinyin相同,tag不同的個數:prefix_pinyin_nunique_tag
prefix_pinyin相同,query不同的個數:prefix_pinyin_nunique_query

判斷prefix,tag,query是否在title中
prefix_isin_title
tag_isin_title
query_isin_title

計算prefix、title與query_prediction_keys的相似度【list】
Levenshtein.distance(str1, str2):計算編輯距離,描述由一個字串轉化成另外一個字串最少的操作次數,包括插入、刪除、替換;
Levenshtein.ratio(str1, str2):計算萊文斯坦比,計算r=(sum-ldist)/sum,sum是兩個字串長度綜合,ldist是類編輯距離,跟上面的編輯距離有一點不同,2中三種操作每個操作+1,而在此處,刪除、插入仍然+1,但是替換+2.

prefix_fix與query_prediction_keys的編輯距離、萊文斯坦比、最長連續子串的長度、最長公共子序列長度:
prefix_fix_query_prediction_keys_ratio_list
prefix_fix_query_prediction_keys_distance_list
prefix_fix_query_prediction_keys_lcsubstr_lens_list
prefix_fix_query_prediction_keys_lcseque_lens_list

title_fix與query_prediction_keys的編輯距離、萊文斯坦比、最長連續子串的長度、最長公共子序列長度:
title_fix_query_prediction_keys_ratio_list
title_fix_query_prediction_keys_ratio_list
title_fix_query_prediction_keys_ratio_list
title_fix_query_prediction_keys_ratio_list

prefix/title與query_prediction_keys相似度的list與query_prediction_values的乘積的list:相似度 * 概率
prefix_fix__query_prediction_values_mutiple_ratio_list
prefix_fix__query_prediction_values_mutiple_distance_list
prefix_fix__query_prediction_values_mutiple_lcsubstr_lens_list
prefix_fix__query_prediction_values_mutiple_lcseque_lens_list

title_fix__query_prediction_values_mutiple_ratio_list
title_fix__query_prediction_values_mutiple_ratio_list
title_fix__query_prediction_values_mutiple_ratio_list
title_fix__query_prediction_values_mutiple_ratio_list

計算上面計算得到的list的統計特徵:max/min/mean/std
prefix_fix_query_prediction_keys_ratio_list_max/min/mean/std
prefix_fix_query_prediction_keys_distance_list_max/min/mean/std
prefix_fix_query_prediction_keys_lcsubstr_lens_list_max/min/mean/std
prefix_fix_query_prediction_keys_lcseque_lens_list_max/min/mean/std

title_fix_query_prediction_keys_ratio_list_max/min/mean/std
title_fix_query_prediction_keys_ratio_list_max/min/mean/std
title_fix_query_prediction_keys_ratio_list_max/min/mean/std
title_fix_query_prediction_keys_ratio_list_max/min/mean/std

prefix_fix__query_prediction_values_mutiple_ratio_list_max/min/mean/std
prefix_fix__query_prediction_values_mutiple_distance_list_max/min/mean/std
prefix_fix__query_prediction_values_mutiple_lcsubstr_lens_list_max/min/mean/std
prefix_fix__query_prediction_values_mutiple_lcseque_lens_list_max/min/mean/std

title_fix__query_prediction_values_mutiple_ratio_list_max/min/mean/std
title_fix__query_prediction_values_mutiple_ratio_list_max/min/mean/std
title_fix__query_prediction_values_mutiple_ratio_list_max/min/mean/std
title_fix__query_prediction_values_mutiple_ratio_list_max/min/mean/std

計算prefix/title/max_query_prediction_keys兩兩之間的相似度:
【此處,有點問題,應該是max才對啊???】
ratio_similarity_prefix_fix_with_title_fix
distance_similarity_prefix_fix_with_title_fix
lcsubstr_lens_similarity_prefix_fix_with_title_fix
lcseque_lens_similarity_prefix_fix_with_title_fix

ratio_similarity_prefix_fix_with_query_fix
distance_similarity_prefix_fix_with_query_fix
lcsubstr_lens_similarity_prefix_fix_with_query_fix
lcseque_lens_similarity_prefix_fix_with_query_fix

ratio_similarity_title_fix_with_query_fix
distance_similarity_title_fix_with_query_fix
lcsubstr_lens_similarity_title_fix_with_query_fix
lcseque_lens_similarity_title_fix_with_query_fix

click特徵
prefix/title/tag/max_query_prediction_keys相同時,click的點選次數:
prefix_click
title_click
tag_click
max_query_prediction_keys_click

二元交叉點選:
prefix、title固定,prefix的個數:prefix_title_click
prefix、tag固定,prefix的個數:prefix_tag_click
title、tag固定,title的個數:title_tag_click
title、max_query_prediction_keys固定,title的個數:title_max_query_prediction_keys_click
tag、max_query_prediction_keys固定,tag的個數:tag_max_query_prediction_keys_click
prefix、title、tag固定,prefix的個數:prefix_title_tag_click

將tag、prefix、title編碼
encoder = preprocessing.LabelEncoder()
not_zip_all_data['tag'] = encoder.fit_transform(not_zip_all_data.tag)
encoder = preprocessing.LabelEncoder()
not_zip_all_data['prefix'] = encoder.fit_transform(not_zip_all_data.prefix)
encoder = preprocessing.LabelEncoder()
not_zip_all_data['title'] = encoder.fit_transform(not_zip_all_data.title)

對query_prediction做編碼處理
encoder = preprocessing.LabelEncoder()
not_zip_all_data['diction_label'] = encoder.fit_transform(not_zip_all_data.query_prediction)

按prefix分組,將prefix相同的,tag不同的合併起來,成為新的特徵:prefix_contains_tag

對prefix_contains_tag計算詞頻:得到稀疏矩陣prefix_contains_tag_matrix
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
prefix_contains_tag_matrix = cv.fit_transform(not_zip_all_data.prefix_contains_tag)
from scipy import sparse
sparse.save_npz('prefix_contains_tag.npz',prefix_contains_tag_matrix)

轉換率
用來5折的思想,其中任意一折的轉換率等於其他四折的轉換率
prefix_convert
title_convert
tag_convert
max_query_prediction_keys_convert
prefix_pinyin_convert
prefix_fix_convert

prefix_title_convert
prefix_tag_convert
title_tag_convert

prefix_title_tag_convert

對query_prediction裡面的每一個關鍵詞做分詞:query_prediction_jieba

3. 模型訓練

clf = lgb.LGBMClassifier(
boosting_type = 'gbdt', num_leaves = 64, reg_alpha = 5, reg_lambda = 5,
n_estimators = 4053, objective = 'binary',
subsample = 0.7, colsample_bytree = 0.7, subsample_freq = 1,
learning_rate = 0.05, random_state = 8012, n_jobs = -1) clf.fit(train_data, labels, eval_set = [(train_data, labels)], verbose = 50)