開發與維運

Python機器學習小知識:特徵統計及整合函數

在機器學習構建特徵的過程中經常需要統計不同的數值,並且Merge到一起。通常步驟如下
在pandas中進行統計的步驟如下:
(1) 首先通過 groupby 函數得到 DataFrameGroupBy 對象, 比如data.groupby('race')。
(2) 然後選擇需要研究的列,這樣我們就得到了一個 SeriesGroupby , 它代表每一個組都有一個 Series 。
(3) 對 SeriesGroupby 進行操作, 比如 .mean(), 相當於對每個組的Series求均值。
(4) 在生成統計特徵後,還要使用pandas.merge()函數將統計後的特徵整合起來。

從0.20.1開始,pandas引入了agg函數。groupby 函數可以看做是基於行(或者說index)的聚合操作,而 agg 函數提供基於列的聚合操作。從實現上看,groupby 函數返回的是一個 DataFrameGroupBy 結構,這個結構必須調用聚合函數(如sum 函數),才會得到結構為Series的數據。而agg 函數是 DataFrame 的直接方法,返回的也是一個 DataFrame 。當然,很多功能用 sum、mean 等函數也可以實現。但是 agg 函數更加簡潔。具體說明如下:
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.agg.html

我們可以進一步的,在AGG函數的基礎上,編寫統計特徵生成函數,就是將以上工作整合到可複用的函數中。這樣,不僅增加統計特徵,而且使用便捷,直接調用即可,提高了開發效率。具體代碼如下所示:

# 統計特徵處理函數
# df: 添加特徵的dataframe
# df_group: 特徵生成的數據集
# group_cols: group by 的列
# value_col: 被統計的列
# agg_ops:處理方式 包括:count,mean,sum,std,max,min,nunique
# colname: 新特徵的名稱
def add_agg_feature_names(df, df_group, group_cols, value_col, agg_ops, col_names):
    df_group[value_col]=df_group[value_col].astype('float')
    df_agg = pd.DataFrame(df_group.groupby(group_cols)[value_col].agg(agg_ops)).reset_index()
    df_agg.columns = group_cols + col_names
    df = df.merge(df_agg, on=group_cols, how="left")

Leave a Reply

Your email address will not be published. Required fields are marked *