天池項目總結,特徵工程了解一下!

2021-02-23 機器學習算法與自然語言處理

業界廣泛流傳著這樣一句話:「數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已」,由此可見特徵工程在機器學習中的重要性,今天我們將通過《阿里雲天池大賽賽題解析——機器學習篇》中的【天貓用戶重複購買預測】案例來深入解析特徵工程在實際商業場景中的應用。

文末驚喜 今日福利:評論區留言送書

學習前須知

(1)本文特徵工程講解部分參考自圖書《阿里雲天池大賽賽題解析——機器學習篇》中的第二個賽題:天貓用戶重複購買預測。

(2)本文相關數據可以在阿里雲天池競賽平臺下載,數據地址:

https://tianchi.aliyun.com/competition/entrance/231576/information

一  數據集介紹

按照上面方法下載好數據集後,我們來看看具體數據含義。

test_format1.csv和train_format1.csv裡分別存放著測試數據和訓練數據,測試數據集最後一個欄位為prob,表示測試結果,訓練數據集最後一個欄位為label,訓練數據各欄位信息如下圖所示:

訓練數據集

user_log_format1.csv裡存放著用戶行為日誌,欄位信息如下圖所示:

用戶行為日誌數據

user_info_format1.csv裡存放著用戶行基本信息,欄位信息如下圖所示:

用戶基本信息數據

二  特徵構造

本賽題基於天貓電商數據,主要關心用戶、店鋪和商家這三個實體,所以特徵構造上也以用戶、店鋪和商家為核心,可以分為以下幾部分:

用戶-店鋪特徵構造

店鋪特徵構造

對店鋪特徵選取可以使用,如 Numpy 的 corrcoef(x,y)函數計算相關係數,保留相關係數小於0.9 的特徵組合,具體內容如圖 2-3。

商家特徵選取

用戶特徵構造

用戶購買商品特徵構造

利用時間提取特徵

總結以上內容,特徵主要基於基礎特徵、用戶特徵、店鋪特徵、用戶+店鋪四個方面,如下圖所示:

特徵總結

三  特徵提取

首先我們導入需要的工具包,進行數據分析和特徵提取。

import numpy as npimport pandas as pdimport matplotlib.pyplot as plt import seaborn as snsfrom scipy import statsimport gcfrom collections import Counter import copyimport warnings warnings.filterwarnings("ignore")%matplotlib inline

接下來我們將按以下步驟進行特徵提取。

特徵提取步驟

1  讀取數據

直接調用Pandas的read_csv函數讀取訓練集和測試集及用戶信息、用戶日誌數據。

test_data = pd.read_csv('./data_format1/test_format1.csv') train_data = pd.read_csv('./data_format1/train_format1.csv')user_info = pd.read_csv('./data_format1/user_info_format1.csv')user_log = pd.read_csv('./data_format1/user_log_format1.csv')

2  數據預處理

對數據內存進行壓縮:

def reduce_mem_usage(df, verbose=True): start_mem = df.memory_usage().sum() / 1024**2 numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64'] for col in df.columns: col_type = df[col].dtypes if col_type in numerics: c_min = df[col].min() c_max = df[col].max() if str(col_type)[:3] == 'int': if c_min > np.iinfo(np.int8).min and c_max < np.iinfo( np.int8).max: df[col] = df[col].astype(np.int8) elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo( np.int16).max: df[col] = df[col].astype(np.int16) elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo( np.int32).max: df[col] = df[col].astype(np.int32) elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo( np.int64).max: df[col] = df[col].astype(np.int64) else: if c_min > np.finfo(np.float16).min and c_max < np.finfo( np.float16).max: df[col] = df[col].astype(np.float16) elif c_min > np.finfo(np.float32).min and c_max < np.finfo( np.float32).max: df[col] = df[col].astype(np.float32) else: df[col] = df[col].astype(np.float64) end_mem = df.memory_usage().sum() / 1024**2 print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))

首先測試數據添加到訓練數據後,然後將用戶基本信息合併到訓練數據左邊,並刪除不需要的變量,釋放內存。
all_data = train_data.append(test_data)all_data = all_data.merge(user_info,on=['user_id'],how='left') del train_data, test_data, user_infogc.collect()

將用戶日誌數據各欄位合併成一個新的欄位item_id,並將其插入到用戶信息數據之後。
# 用戶日誌數據按時間排序user_log = user_log.sort_values(['user_id', 'time_stamp'])# 合併用戶日誌數據各欄位,新欄位名為item_idlist_join_func = lambda x: " ".join([str(i) for i in x])agg_dict = {    'item_id': list_join_func,    'cat_id': list_join_func,    'seller_id': list_join_func,    'brand_id': list_join_func,    'time_stamp': list_join_func,    'action_type': list_join_func}rename_dict = {    'item_id': 'item_path',    'cat_id': 'cat_path',    'seller_id': 'seller_path',    'brand_id': 'brand_path',    'time_stamp': 'time_stamp_path',    'action_type': 'action_type_path'}
def merge_list(df_ID, join_columns, df_data, agg_dict, rename_dict): df_data = df_data.groupby(join_columns).agg(agg_dict).reset_index().rename( columns=rename_dict) df_ID = df_ID.merge(df_data, on=join_columns, how="left") return df_IDall_data = merge_list(all_data, 'user_id', user_log, agg_dict, rename_dict)del user_log gc.collect()

基於之前的特徵構造圖,我們提前編寫一些統計相關函數,依次有:數據總數、數據唯一值總數、數據最大值、數據最小值、數據標準差、數據中top N數據以及數據中top N數據的總數。
def cnt_(x):     try:        return len(x.split(' '))     except:        return -1
def nunique_(x): try: return len(set(x.split(' '))) except: return -1
def max_(x): try: return np.max([float(i) for i in x.split(' ')]) except: return -1
def min_(x): try: return np.min([float(i) for i in x.split(' ')]) except: return -1
def std_(x): try: return np.std([float(i) for i in x.split(' ')]) except: return -1
def most_n(x, n): try: return Counter(x.split(' ')).most_common(n)[n-1][0] except: return -1
def most_n_cnt(x, n): try: return Counter(x.split(' ')).most_common(n)[n-1][1] except: return -1

基於上面編寫的基本統計方法,我們可以針對數據進行特徵統計。
def user_cnt(df_data, single_col, name):    df_data[name] = df_data[single_col].apply(cnt_)    return df_data
def user_nunique(df_data, single_col, name): df_data[name] = df_data[single_col].apply(nunique_) return df_data
def user_max(df_data, single_col, name): df_data[name] = df_data[single_col].apply(max_) return df_data
def user_min(df_data, single_col, name): df_data[name] = df_data[single_col].apply(min_) return df_data
def user_std(df_data, single_col, name): df_data[name] = df_data[single_col].apply(std_) return df_data
def user_most_n(df_data, single_col, name, n=1): func = lambda x: most_n(x, n) df_data[name] = df_data[single_col].apply(func) return df_data
def user_most_n_cnt(df_data, single_col, name, n=1): func = lambda x: most_n_cnt(x, n) df_data[name] = df_data[single_col].apply(func) return df_data

基於上一步中編寫的用戶數據統計函數,以店鋪特徵統計為例,統計與店鋪特點有關的特徵,如店鋪、商品、品牌等。
# 取2000條數據舉例all_data_test = all_data.head(2000)# 總次數all_data_test = user_cnt(all_data_test, 'seller_path', 'user_cnt')# 不同店鋪個數all_data_test = user_nunique(all_data_test, 'seller_path', 'seller_nunique ')# 不同品類個數all_data_test = user_nunique(all_data_test, 'cat_path', 'cat_nunique')# 不同品牌個數all_data_test = user_nunique(all_data_test, 'brand_path',                             'brand_nunique')  # 不同商品個數all_data_test = user_nunique(all_data_test, 'item_path', 'item_nunique')# 活躍天數all_data_test = user_nunique(all_data_test, 'time_stamp_path',                             'time_stamp _nunique')# 不同用戶行為種數all_data_test = user_nunique(all_data_test, 'action_type_path',                             'action_ty pe_nunique')

此外還可以統計用戶最喜歡的店鋪、最喜歡的類目、最喜歡的品牌、最長見的行為動作等數據。
# 用戶最喜歡的店鋪all_data_test = user_most_n(all_data_test, 'seller_path', 'seller_most_1', n=1)# 最喜歡的類目all_data_test = user_most_n(all_data_test, 'cat_path', 'cat_most_1', n=1)# 最喜歡的品牌all_data_test = user_most_n(all_data_test, 'brand_path', 'brand_most_1', n= 1)# 最常見的行為動作all_data_test = user_most_n(all_data_test, 'action_type_path', 'action_type _1', n=1)

5  利用countvector和tfidf提取特徵CountVectorizer與TfidfVectorizer是Scikit-learn的兩個特徵數值計算的類,接下來我們將結合兩者進行特徵提取。
from sklearn.feature_extraction.text import CountVectorizerfrom sklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.feature_extraction.text import ENGLISH_STOP_WORDSfrom scipy import sparsetfidfVec = TfidfVectorizer(stop_words=ENGLISH_STOP_WORDS,                           ngram_range=(1, 1),                           max_features=100)columns_list = ['seller_path']for i, col in enumerate(columns_list):    tfidfVec.fit(all_data_test[col])    data_ = tfidfVec.transform(all_data_test[col])    if i == 0:        data_cat = data_    else:        data_cat = sparse.hstack((data_cat, data_))

詞嵌入是一類將詞向量化的模型的統稱,核心思想是將每個詞都映射到低維空間(K 為50~300)上的一個稠密向量。
import gensim
model = gensim.models.Word2Vec( all_data_test['seller_path'].apply(lambda x: x.split(' ')), size=100, window=5, min_count=5, workers=4)
def mean_w2v_(x, model, size=100): try: i = 0 for word in x.split(' '): if word in model.wv.vocab: i += 1 if i == 1: vec = np.zeros(size) vec += model.wv[word] return vec / i except: return np.zeros(size)
def get_mean_w2v(df_data, columns, model, size): data_array = [] for index, row in df_data.iterrows(): w2v = mean_w2v_(row[columns], model, size) data_array.append(w2v) return pd.DataFrame(data_array)
df_embeeding = get_mean_w2v(all_data_test, 'seller_path', model, 100)df_embeeding.columns = ['embeeding_' + str(i) for i in df_embeeding.columns]

以使用 lgb 和 xgb 分類模型構造 Stacking特徵為例子,實現方式如下:
from sklearn.model_selection import StratifiedKFold, KFold folds = 5seed = 1kf = KFold(n_splits=5, shuffle=True, random_state=0)clf_list = [lgb_clf, xgb_clf] clf_list_col = ['lgb_clf', 'xgb_clf']clf_list = clf_list column_list = [] train_data_list=[] test_data_list=[] for clf in clf_list:      train_data,test_data,clf_name=clf(x_train, y_train, x_valid, kf, label_ split=None)      train_data_list.append(train_data)      test_data_list.append(test_data)train_stacking = np.concatenate(train_data_list, axis=1)test_stacking = np.concatenate(test_data_list, axis=1)

[1] valid_0's multi_logloss: 0.240875Training until validation scores don't improve for 100 rounds.[2] valid_0's multi_logloss: 0.240675[226] train-mlogloss:0.123211 eval-mlogloss:0.226966Stopping. Best iteration:[126] train-mlogloss:0.172219 eval-mlogloss:0.218029xgb now score is: [2.4208301225770263, 2.2433633135072886, 2.51909203146584 34, 2.4902898448798805, 2.5797977298125625]xgb_score_list: [2.4208301225770263, 2.2433633135072886, 2.5190920314658434, 2.4902898448798805, 2.5797977298125625] xgb_score_mean: 2.4506746084485203

對特徵工程的介紹就到這裡啦,更多相關內容大家可以去閱讀圖書《阿里雲天池大賽賽題解析——機器學習篇》,在賽事案例中學習到更多算法、機器學習相關知識。
 
 福利來了  你在學習機器學習的過程中遇到過哪些問題?學習科研過程中有哪些乾貨想要與大家分享?歡迎大家至評論區留言。為了感謝大家對本公眾號的支持,我們將會對用心留言點讚前10名的同學各送出《阿里雲天池大賽賽題解析——機器學習篇》一本,統計時間截止1月29日20:00。《阿里雲天池大賽賽題解析——機器學習篇》目前已經在天貓開始預售啦,本書提取了阿里雲天池7年200多場大賽精華,識別下方二維碼可優惠購買:

相關焦點

  • 阿里天池機器學習競賽項目總結,特徵工程了解一下!
    來源:阿里雲天池,案例:機器學習實踐  業界廣泛流傳著這樣一句話:「數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已」,由此可見特徵工程在機器學習中的重要性,今天我們將通過《阿里雲天池大賽賽題解析——機器學習篇》中的【天貓 用戶重複購買預測】案例來深入解析特徵工程在實際商業場景中的應用。
  • 特徵工程了解一下
    《阿里雲天池大賽賽題解析——機器學習篇》中的【天貓用戶重複購買預測】案例來深入解析特徵工程在實際商業場景中的應用。學習前須知(1)本文特徵工程講解部分參考自圖書《阿里雲天池大賽賽題解析——機器學習篇》中的第二個賽題:天貓用戶重複購買預測。(2)本文相關數據可以登錄阿里雲天池平臺,報名參加「 天貓用戶重複購買預測競賽 」後下載(完全免費)。
  • MLK | 特徵工程系統化乾貨筆記+代碼了解一下(中)
    ,上一篇主要是集中講了特徵理解和特徵增強,可以點擊回顧《MLK | 特徵工程系統化乾貨筆記+代碼了解一下(上)》,這一次會著重講特徵構建和特徵選擇。而在這之前,我們需要了解我們的數據集,先前兩節中我們了解到了可以通過 data.info 和 data.describe() 來查看,同時結合數據等級(定類、定序、定距、定比)來理解變量。
  • 漳州旅遊新項目 烏山天池即將揭開神秘面紗
    新疆有天山天池、吉林長白山也有天池,它們都很出名。其實漳州的烏山也有天池,而且即將揭開神秘面紗,目前,省市有關專家已在考察規劃烏山天池,準備開發這個景點。這是導報記者從昨日上午舉行的漳州旅遊活動新聞通氣會上獲悉的,會議上還透露,在新的一年裡,將加快推進旅遊項目的「十項建設」,預計全年接待遊客1840萬人次,增長15%,實現旅遊總收入189億元,增長15%,力爭全年接待遊客1920萬人次,同比增長20%,實現旅遊總收入196億元,同比增長20%。
  • 機器學習中的特徵工程總結!
    結構總覽特徵工程傳統編程的關注點是代碼。在機器學習項目中,關注點變成了特徵表示。也就是說,開發者通過添加和改善特徵來調整模型。「Garbage in, garbage out」。對於一個機器學習問題,數據和特徵往往決定了結果的上限,而模型、算法的選擇及優化則是在逐步接近這個上限。
  • 機器學習特徵工程方法總結
    結構總覽特徵工程傳統編程的關注點是代碼。在機器學習項目中,關注點變成了特徵表示。也就是說,開發者通過添加和改善特徵來調整模型。「Garbage in, garbage out」。特徵工程將原始數據映射到機器學習特徵圖 1 左側表示來自輸入數據源的原始數據,右側表示特徵矢量,也就是組成數據集中樣本的浮點值集。特徵工程指的是將原始數據轉換為特徵矢量。進行特徵工程預計需要大量時間。映射數值整數和浮點數據不需要特殊編碼,因為它們可以與數字權重相乘。
  • 特徵工程總結:R與python的比較實現
    特徵選擇的主要方法和python與R的比較實現目錄1.特徵工程概述2.特徵工程知識框架3.特徵工程的一般步驟4.特徵選擇的python與R實現比較4.1 導入數據4.2 數據預處理4.2.1 標準化4.2.2 區間放縮法  4.2.3 歸一化  4.2.4 對定量特徵二值化
  • 為何推薦sklearn做單機特徵工程?【下】
    文章內容主要來自於博客園劉建平老師的總結分享:說完數據預處理,我們接著來看特徵選擇👇
  • 深度了解特徵工程
    為什麼特徵工程對機器學習很重要?怎麼做特徵工程?怎麼做好特徵工程?集眾多博友智慧,一文全面了解並應用特徵工程。1 定義及意義(1)定義特徵工程(Feature Engineering)特徵工程是將原始數據轉化成更好的表達問題本質的特徵的過程,使得將這些特徵運用到預測模型中能提高對不可見數據的模型預測精度。
  • 天池10月之星:計算機視覺算法新人劉鈺舒和她在天池的成長之路
    此外,對於每個比賽天池官方總是組織很多視頻課程啊學習資料啊,比如我當時參加了零基礎數據挖掘比賽,通過詳細的數據處理、特徵工程、建立模型等等視頻,我好像突然知道數據挖掘是怎麼回事了。論壇也經常有前排大佬分享的各種方案,大家集思廣益,真的是能學習到各種厲害的技術。由於咱哈工大是兩年制研究生,我之前就一直在找工作了。
  • 九江市資訊|九江高鐵樞紐工程水系改造項目年底主體完工
    九江市的朋友們,一起來看下最近身邊發生了什麼新鮮事兒~~1、九江高鐵樞紐工程水系改造項目年底主體完工九江高鐵樞紐工程水系改造工程是高鐵新區的一個重大基礎設施項目,自去年9月份開工以來由於高鐵站建設的需要,高鐵站規劃區域內的部分倪家河河段需改道引流,項目起點為倪河上屋村,終點為鑫山小區,改線開挖河道總長2.75公裡。當前,施工單位正搶抓有利天氣,積極組織設備,加派人員,採取「五加二,白加黑」的工作模式,全力加快工程建設。目前工程已完成了土石方開挖42萬餘方,佔設計總量的35.18%,修築便道3000米,每天都有30多臺班機械設備在施工,確保年底完成主體工程。
  • 特徵工程全過程
    向AI轉型的程式設計師都關注了這個號👇👇👇大數據挖掘DT機器學習  公眾號: datayx1 特徵工程是什麼  有這麼一句話在業界廣泛流傳:數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已。那特徵工程到底是什麼呢?顧名思義,其本質是一項工程活動,目的是最大限度地從原始數據中提取特徵以供算法和模型使用。通過總結和歸納,人們認為特徵工程包括以下方面:
  • 因為這個,博白三灘天池大峽谷風景區竟然關閉了一年
    博白縣民營經濟法律服務配送中心現場勘驗一起涉重點工程項目施工生態環境損壞糾紛案10月28日下午,博白縣委政法委副書記謝東恩,博白縣民營經濟法律服務配送中心主任、「法律服務四人組」組長陳家輝,「法律服務四人組」部分成員到博白縣三灘鎮天池大峽谷風景區現場勘驗一起涉重點工程項目施工生態環境損壞糾紛案。
  • 孟達天池自然保護區——具有自己的特色,與天山的天池不同
    孟達天池具有自己的特色,與天山的天池不同。它被十分稠密的森林團團的包圍起來,從池邊到山頂,全被森林覆蓋。天池的水是綠色的,幾乎和四周森林的顏色相同。孟達天池群峰倒影,隨波微動。湖中水鳥飛翔,魚兒舒然遊動。孟達天池自然保護區是青海省避暑、療養和旅遊勝地。
  • 系統理解特徵工程
    《特徵工程入門與實踐》這本書,感覺收穫非常大,其次,其實在工作中能夠明顯感覺到,特徵工程的作用有很多時候效用會高於模型,而且改進成本相對低很多,last but not least,在前一條理由下,現在很多人其實都沒有關注於特徵工程或者在學習特徵工程(個人感覺很可能和科研導向有關,科研確實應該注重模型更多),所以今天寫一篇文章來討論一下特徵工程的整體思路。
  • Auto-ML之自動化特徵工程
    因此花費一些時間學習了解了Auto-ML領域的一些知識,並對Auto-ML中的技術方案進行歸納整理。眾所周知,一個完整的機器學習項目可概括為如下四個步驟。AI項目體驗地址 https://loveai.tech自動化機器學習(AutoML)框架旨在減少算法工程師們的負擔,以便於他們可以在特徵工程和超參數調優上花更少的時間,而在模型設計上花更多的時間進行嘗試。
  • 如何搞定工程項目的關鍵人物?看完你就明白了!
    作為一個工程銷售來說,項目的關鍵人物對於一個項目的成功與否起著至關重要的作用。找對人是項目銷售成功的第一步,作為工程銷售來說比較痛苦的就是找錯人。每個工程銷售都想直接能找到-項目的決策人!要想找對人,首先要知道項目的關鍵人物有哪幾種?
  • 這位項目總工的年終工程總結,看完真的受益匪淺
    1項目工程總結1、土方開挖及回填土施工在建工程的3#樓基坑開挖期間遇到大雨,東北角邊坡塌陷。後來總結問題的原因,五四體育館排水管道漏水、邊坡邊緣硬化沒到位、五四體院館屋面排水管道水直接排在邊坡地面上,水滲入邊坡內。
  • 餵飯 | 特徵工程實踐(文字詳解+圖片說明+代碼展示)
    文字詳解+圖片說明+代碼展示,學不會來打我業界廣泛流傳著這樣一句話:「數據和特徵決定了機器學習的上限,而模型和算法只是逼近這個上限而已」,由此可見特徵工程在機器學習中的重要性,今天我們將通過《阿里雲天池大賽賽題解析——機器學習篇》中的【天貓用戶重複購買預測】案例來深入解析特徵工程在實際商業場景中的應用。
  • 渝北又添一張鄉村旅遊名片「桃韻天池」幻如仙境
    華龍網-新重慶客戶端12月24日6時訊(通訊員 張澤美)近日,筆者在洛磧鎮大天池村朝家壩看到,遠處一座座青山倒影在水中,一排排農家小院與藍天組成壯美的畫卷;近看村容,房舍牆壁粉刷一新,房前的花臺上栽滿鮮花,鄉村公路整潔乾淨、寬敞通暢……隨著「桃韻天池」項目的建設,渝北又增添了一張鄉村旅遊名片。