阿里天池機器學習競賽項目總結,特徵工程了解一下!

2020-12-26 網易

  來源:阿里雲天池,案例:機器學習實踐

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

  

  學習前須知

  (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**2numerics = ['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**2print('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_loggc.collect()

  3 特徵統計函數定義

  基於之前的特徵構造圖,我們提前編寫一些統計相關函數,依次有:數據總數、數據唯一值總數、數據最大值、數據最小值、數據標準差、數據中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

  4 提取統計特徵

  基於上一步中編寫的用戶數據統計函數,以店鋪特徵統計為例,統計與店鋪特點有關的特徵,如店鋪、商品、品牌等。

  # 取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_))

  6 嵌入特徵

  詞嵌入是一類將詞向量化的模型的統稱,核心思想是將每個詞都映射到低維空間(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 = 0for word in x.split(' '):if word in model.wv.vocab:i += 1if i == 1:vec = np.zeros(size)vec += model.wv[word]return vec / iexcept: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]

  7 Stacking 分類特徵

  以使用 lgb 和 xgb 分類模型構造 Stacking特徵為例子,實現方式如下:

  
# 1、使用 5 折交叉驗證from sklearn.model_selection import StratifiedKFold, KFoldfolds = 5seed = 1kf = KFold(n_splits=5, shuffle=True, random_state=0)# 2、選擇 lgb 和 xgb 分類模型作為基模型clf_list = [lgb_clf, xgb_clf]clf_list_col = ['lgb_clf', 'xgb_clf']# 3、獲取 Stacking 特徵clf_list = clf_listcolumn_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

  「乾貨學習,分享在看三連

相關焦點

  • 算法應用|機器學習python應用,簡單機器學習項目實踐
    可以說這並不是一個正式的項目,只是用來做一個簡單的展示,用於給初次接觸機器學習的讀者快速了解機器學習的過程和結果。4.1 單變量圖表單變量圖表可以顯示每一個單獨的特徵屬性,因為每個特徵屬性都是數字,因此我們可以通過箱線圖來展示屬性與中位值的離散速度,了解數據偏向和異常值情況。
  • 免費的谷歌機器學習速成課,了解一下?
    每逢佳節胖三斤,局長這兩天下班回家,總是被地鐵口的小哥哥攔住,「遊泳健身了解一下!」
  • 阿里小蜜算法團隊在尋找
    阿里妹導讀:阿里小蜜的算法專家們最近在義大利都靈籌備一場國際數據挖掘競賽。
  • 華西公司雁塔區老舊小區改造項目召開勞動競賽總結暨表彰大會
    10月27日,中建安裝華西公司雁塔區2019年老舊小區改造EPC總承包項目部舉行「崗位建功新時代、凝心聚力促發展,大幹100天」主題勞動競賽總結暨表彰大會。會上,與會人員通過觀看短片形式,回顧了項目勞動競賽開展以來的建設情況。
  • 機器學習團隊常用工具總結,人生苦短,我用Python!
    【新智元導讀】現在國外現初創公司最頻繁使用的機器學習工具是什麼?本篇文章詳細總結,帶你全方位了解,想快速坐上人工智慧順風車的小夥伴們,請抓穩了!   有想法有創意,想快速自行發起項目?還在海量的工具包、軟體、平臺、庫和各種插件上毫無頭緒地尋覓?想加入初創公司一展身手,卻找不到補課切入點?
  • 小清河復航工程開展勞動競賽全速推進工程建設
    小清河復航項目勞動競賽活動開展以來,中鐵建投山東小清河開發有限公司組織各參建單位,加強統籌調度,積極克服困難,圍繞「五比五促」競賽主題,全力開展競賽活動,工程建設全速推進。抓組織促開展,確保勞動競賽活動高效啟動。
  • 手把手教您Python機器學習項目
    真正適應新平臺或工具的最好方法是端到端地完成一個機器學習項目,並涵蓋關鍵步驟。即,從加載數據,總結數據,評估算法和做出一些預測。如果您能做到這一點,您就有了一個可以在一個又一個數據集上使用的模板。一旦您有了更多的信心,您就可以在以後填補空白,比如進一步的數據準備和改進結果任務。
  • 中山街小學天池校區、江北圖書館?宜賓這些項目有動靜
    隨著城建的推進,宜賓各種大項目登上舞臺。不過對於很多朋友來說,與自己切身相關的項目才是自己關注的焦點。這不,最近就有網友諮詢了幾個主城高關注項目的消息,一起來看看!中山街小學天池校區說起中山街小學天池校區,選址似乎就是一個糾結的問題。
  • 雲南省總工會、中鐵八局在昆舉行「勞動競賽總結部署會」
    瀏覽器版本過低,暫不支持視頻播放工人日報客戶端11月28日電 11月26日,雲南省總工會、中鐵八局聯合在中鐵八局昆明公司承建的昆(明)倘(甸)高速公路3標項目部舉行2019年度「賽業務技能、強員工素質、當雲嶺先鋒」勞動競賽總結表彰會
  • 五個鮮為人知,但又不可不知的機器學習開源項目
    借著人工智慧的熱潮,各種機器學習項目也迎來了一個爆發期。其中有一些因為背後的巨頭支持或者穩定可靠的性能而廣為人知,例如Tensorflow、Caffe和Theano等。但實際上,有為數更多的項目卻並不為人所知。
  • 教程| Kaggle初學者五步入門指南,七大訣竅助你享受競賽
    在這篇指南中,我們會解讀上手 Kaggle、提升技能和享受 Kaggle 所需要了解的一切。首先,我們要清楚了解:  Kaggle 競賽和「經典的」數據科學有一些重要的不同之處,但只要你以正確的心態接觸它,就也能收穫有價值的經驗。
  • 上海寶冶北京環球影城項目舉行「大幹60天,全力保節點」勞動競賽...
    9月2日上午,上海寶冶北京環球影城項目舉行「大幹60天,全力保節點」勞動競賽總結表彰會。上海寶冶集團副總經理張文慰問一線項目員工並為受表彰人員頒發榮譽證書。國際工程公司黨委副書記、紀委書記何靖昕,上海寶冶安裝工程公司黨委副書記周義東、總工程師侯振峰,上海寶冶建築裝飾公司副總經理王豐出席此次活動。總結表彰會上,國際工程公司總經理助理、項目經理宋世巖簡要介紹了勞動競賽的開展情況和工程目前進展。
  • 想像她一樣登上時代雜誌封面嗎,這些競賽確定不了解一下?
    如果你也像拉奧一樣熱愛科學,希望利用科學的力量改變世界和未來,不妨和小思君一起來看看下面這些充滿挑戰性的科學類競賽! 3M Young Scientist Challenge「3M青年科學家挑戰賽」是由探索教育和3M為美國中學生舉辦的青年科學與工程競賽,類似於「歐盟青年科學家競賽」。
  • 勞動競賽助力項目復工「加速度」
    —中國二十冶上海外高橋造船廠郵輪薄板中心項目勞動競賽紀實3月31日,隨著最後一輛混凝土攪拌車的遠去,中國二十冶上海外高橋造船廠郵輪薄板中心項目勞動競賽畫上了圓滿的句號。項目被列為上海市重大工程。越是困難越向前--厲兵秣馬外高橋郵輪總裝建造總體規劃薄板中心項目的重大意義,給中國二十冶市場開拓提出了更高的要求。當外高橋郵輪總裝建造總體規劃薄板中心指揮部商議能否保證原節點(3月底)完成時,這既是一種信任,也是一場考驗。
  • 蘋果自動駕駛項目併入AI 與機器學習部門
    蘋果 CEO Tim Cook 承認,自動駕駛「可能是他們接觸過最困難的 AI 項目之一。」消息人士指出,新一輪整合之後,Field 及其團隊的數百名工程師將併入 Giannandrea 的 AI 與機器學習團隊。不過,對於該消息蘋果發言人選擇不予置評。在此之前,Field 直接向蘋果前硬體工程高級副總裁 Bob Mansfield 匯報。
  • 這位項目總工的年終工程總結,看完真的受益匪淺
    1項目工程總結1、土方開挖及回填土施工在建工程的3#樓基坑開挖期間遇到大雨,東北角邊坡塌陷。後來總結問題的原因,五四體育館排水管道漏水、邊坡邊緣硬化沒到位、五四體院館屋面排水管道水直接排在邊坡地面上,水滲入邊坡內。
  • 機器學習之父Michael I. Jordan 親臨2018全球機器學習技術大會
    在即將到來的2018全球機器學習技術大會上,Michael I. Jordan將為大家帶來《機器學習前沿發展》的主題演講,深入闡述機器學習領域最新的前沿發展情況及其領導的機器學習團隊的最新研究成果,包括如何在訓練生成式對抗網絡GAN的過程中找到好的鞍點、如何在非凸優化中避免鞍點、可解釋的機器學習、可證明的最優強化學習、多智能體決策、分布式強化學習平臺等熱點前沿話題。相信Michael I.
  • 大學生不得不了解的高性價比競賽
    最近全國大學生創新創業大賽和「網際網路+」創新大賽的報名剛剛結束,今天小編想為小夥伴們總結整理一些大學生可以參加的性價比高的國家級大賽。 大家都知道,參加這些比賽對大學生來說是比較重要的。
  • 陸軍工程大學首次將軍事基礎競賽與野外綜合競賽結合舉辦
    新華社南京11月28日電(雲利孝、柴瑋)陸軍工程大學「精武-2020」軍事比武競賽野外綜合賽27日在南京周邊某地域拉開戰幕。來自該校各單位的16支參賽隊展開激烈角逐,爭奪象徵此次比武競賽最高榮譽的「精武之劍」。