<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          天池項(xiàng)目總結(jié),特征工程了解一下!

          共 10143字,需瀏覽 21分鐘

           ·

          2020-10-31 19:26

          ↑↑↑關(guān)注后"星標(biāo)"Datawhale
          每日干貨?&?每月組隊(duì)學(xué)習(xí),不錯(cuò)過(guò)
          ?Datawhale干貨?
          來(lái)源:阿里云天池,案例:機(jī)器學(xué)習(xí)實(shí)踐

          業(yè)界廣泛流傳著這樣一句話:“數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限,而模型和算法只是逼近這個(gè)上限而已”,由此可見(jiàn)特征工程在機(jī)器學(xué)習(xí)中的重要性,今天我們將通過(guò)《阿里云天池大賽賽題解析——機(jī)器學(xué)習(xí)篇》中的【天貓用戶重復(fù)購(gòu)買預(yù)測(cè)】案例來(lái)深入解析特征工程在實(shí)際商業(yè)場(chǎng)景中的應(yīng)用。

          今日福利:評(píng)論區(qū)留言送書(shū)



          學(xué)習(xí)前須知


          (1)本文特征工程講解部分參考自圖書(shū)《阿里云天池大賽賽題解析——機(jī)器學(xué)習(xí)篇》中的第二個(gè)賽題:天貓用戶重復(fù)購(gòu)買預(yù)測(cè)。


          (2)本文相關(guān)數(shù)據(jù)可以在阿里云天池競(jìng)賽平臺(tái)下載,數(shù)據(jù)地址:

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



          一? 數(shù)據(jù)集介紹


          按照上面方法下載好數(shù)據(jù)集后,我們來(lái)看看具體數(shù)據(jù)含義。



          test_format1.csv和train_format1.csv里分別存放著測(cè)試數(shù)據(jù)和訓(xùn)練數(shù)據(jù),測(cè)試數(shù)據(jù)集最后一個(gè)字段為prob,表示測(cè)試結(jié)果,訓(xùn)練數(shù)據(jù)集最后一個(gè)字段為label,訓(xùn)練數(shù)據(jù)各字段信息如下圖所示:


          訓(xùn)練數(shù)據(jù)集


          user_log_format1.csv里存放著用戶行為日志,字段信息如下圖所示:


          用戶行為日志數(shù)據(jù)


          user_info_format1.csv里存放著用戶行基本信息,字段信息如下圖所示:


          用戶基本信息數(shù)據(jù)


          二? 特征構(gòu)造


          本賽題基于天貓電商數(shù)據(jù),主要關(guān)心用戶、店鋪和商家這三個(gè)實(shí)體,所以特征構(gòu)造上也以用戶、店鋪和商家為核心,可以分為以下幾部分:


          用戶-店鋪特征構(gòu)造


          店鋪特征構(gòu)造


          對(duì)店鋪特征選取可以使用,如 Numpy 的 corrcoef(x,y)函數(shù)計(jì)算相關(guān)系數(shù),保留相關(guān)系數(shù)小于0.9 的特征組合,具體內(nèi)容如圖 2-3。


          商家特征選取


          用戶特征構(gòu)造


          用戶購(gòu)買商品特征構(gòu)造


          利用時(shí)間提取特征


          總結(jié)以上內(nèi)容,特征主要基于基礎(chǔ)特征、用戶特征、店鋪特征、用戶+店鋪四個(gè)方面,如下圖所示:


          特征總結(jié)


          三? 特征提取


          首先我們導(dǎo)入需要的工具包,進(jìn)行數(shù)據(jù)分析和特征提取。


          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


          接下來(lái)我們將按以下步驟進(jìn)行特征提取。


          特征提取步驟

          1? 讀取數(shù)據(jù)


          直接調(diào)用Pandas的read_csv函數(shù)讀取訓(xùn)練集和測(cè)試集及用戶信息、用戶日志數(shù)據(jù)。


          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? 數(shù)據(jù)預(yù)處理


          對(duì)數(shù)據(jù)內(nèi)存進(jìn)行壓縮:


          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))


          首先測(cè)試數(shù)據(jù)添加到訓(xùn)練數(shù)據(jù)后,然后將用戶基本信息合并到訓(xùn)練數(shù)據(jù)左邊,并刪除不需要的變量,釋放內(nèi)存。

          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()

          將用戶日志數(shù)據(jù)各字段合并成一個(gè)新的字段item_id,并將其插入到用戶信息數(shù)據(jù)之后。

          # 用戶日志數(shù)據(jù)按時(shí)間排序user_log = user_log.sort_values(['user_id', 'time_stamp'])# 合并用戶日志數(shù)據(jù)各字段,新字段名為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()

          3? 特征統(tǒng)計(jì)函數(shù)定義

          基于之前的特征構(gòu)造圖,我們提前編寫(xiě)一些統(tǒng)計(jì)相關(guān)函數(shù),依次有:數(shù)據(jù)總數(shù)、數(shù)據(jù)唯一值總數(shù)、數(shù)據(jù)最大值、數(shù)據(jù)最小值、數(shù)據(jù)標(biāo)準(zhǔn)差、數(shù)據(jù)中top N數(shù)據(jù)以及數(shù)據(jù)中top N數(shù)據(jù)的總數(shù)。

          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

          基于上面編寫(xiě)的基本統(tǒng)計(jì)方法,我們可以針對(duì)數(shù)據(jù)進(jìn)行特征統(tǒng)計(jì)。

          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? 提取統(tǒng)計(jì)特征

          基于上一步中編寫(xiě)的用戶數(shù)據(jù)統(tǒng)計(jì)函數(shù),以店鋪特征統(tǒng)計(jì)為例,統(tǒng)計(jì)與店鋪特點(diǎn)有關(guān)的特征,如店鋪、商品、品牌等。

          # 取2000條數(shù)據(jù)舉例all_data_test = all_data.head(2000)# 總次數(shù)all_data_test = user_cnt(all_data_test, 'seller_path', 'user_cnt')# 不同店鋪個(gè)數(shù)all_data_test = user_nunique(all_data_test, 'seller_path', 'seller_nunique ')# 不同品類個(gè)數(shù)all_data_test = user_nunique(all_data_test, 'cat_path', 'cat_nunique')# 不同品牌個(gè)數(shù)all_data_test = user_nunique(all_data_test, 'brand_path', 'brand_nunique') # 不同商品個(gè)數(shù)all_data_test = user_nunique(all_data_test, 'item_path', 'item_nunique')# 活躍天數(shù)all_data_test = user_nunique(all_data_test, 'time_stamp_path', 'time_stamp _nunique')# 不同用戶行為種數(shù)all_data_test = user_nunique(all_data_test, 'action_type_path', 'action_ty pe_nunique')

          此外還可以統(tǒng)計(jì)用戶最喜歡的店鋪、最喜歡的類目、最喜歡的品牌、最長(zhǎng)見(jiàn)的行為動(dòng)作等數(shù)據(jù)。

          # 用戶最喜歡的店鋪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)# 最常見(jiàn)的行為動(dòng)作all_data_test = user_most_n(all_data_test, 'action_type_path', 'action_type _1', n=1)

          5? 利用countvector和tfidf提取特征

          CountVectorizer與TfidfVectorizer是Scikit-learn的兩個(gè)特征數(shù)值計(jì)算的類,接下來(lái)我們將結(jié)合兩者進(jìn)行特征提取。

          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? 嵌入特征

          詞嵌入是一類將詞向量化的模型的統(tǒng)稱,核心思想是將每個(gè)詞都映射到低維空間(K 為50~300)上的一個(gè)稠密向量。

          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]

          7? Stacking 分類特征

          以使用 lgb 和 xgb 分類模型構(gòu)造 Stacking特征為例子,實(shí)現(xiàn)方式如下:

          # 1、使用 5 折交叉驗(yàn)證from sklearn.model_selection import StratifiedKFold, KFold folds = 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_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)

          運(yùn)行結(jié)果:

          [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

          對(duì)特征工程的介紹就到這里啦,更多相關(guān)內(nèi)容大家可以去閱讀圖書(shū)《阿里云天池大賽賽題解析——機(jī)器學(xué)習(xí)篇》,在賽事案例中學(xué)習(xí)到更多算法、機(jī)器學(xué)習(xí)相關(guān)知識(shí)。




          ?
          ?福利來(lái)了??
          評(píng)論區(qū)留言送書(shū)!

          你在學(xué)習(xí)機(jī)器學(xué)習(xí)的過(guò)程中遇到過(guò)哪些問(wèn)題?希望Datawhale后續(xù)分享哪個(gè)系列的干貨?對(duì)于用心留言點(diǎn)贊前5名的同學(xué)將送《阿里云天池大賽賽題解析——機(jī)器學(xué)習(xí)篇》一本,到11月1日20:00截止。
          《阿里云天池大賽賽題解析——機(jī)器學(xué)習(xí)篇》目前已經(jīng)在天貓開(kāi)始預(yù)售啦,本書(shū)提取了阿里云天池7年200多場(chǎng)大賽精華,識(shí)別下方二維碼可優(yōu)惠購(gòu)買:



          干貨學(xué)習(xí)分享在看三連
          瀏覽 74
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天爽夜夜爽毛片 | 国产盗摄成人一区二区 | 日韩国产操逼 | 国产精品久久久久久久久AV竹菊 | 国产精品18欠久久久久久 |