特征工程

it2025-02-19  29

文章目录

1.特征编码2.统计特征连续特征类别特征

1.特征编码

label_encoder编码:将特征值对应到0~最大特征数-1 one_hot编码:将特征值转为one_hot编码 常用的xgboost需要使用one_hot编码输入,lightgbm支持直接输入label_encoder编码

import pandas as pd from scipy import sparse from sklearn.preprocessing import OneHotEncoder,LabelEncoder # fit_transform可以分拆为fit和transform data[feature] = LabelEncoder().fit_transform(data[feature]) df_one_hot = pd.DataFrame() enc = OneHotEncoder() enc.fit(data[feature].values.reshape(-1, 1)) # 生成coo_matrix格式的独热数据 arr = enc.transform(data[feature].values.reshape(-1, 1)) # hstack 按照列进行拼接 vstack 按行进行拼接 data = sparse.hstack((df_one_hot, arr))

label_encoder还可以下面代码转换

for i in cat_fea: data[i] =data[i].map(dict(zip(data[i].unique(),(range(data[i].nunique()))))

注意:map的功能很强大,多尝试尝试,通常接受一个字典为参数,也可以接受series

2.统计特征

连续特征

连续特征(一般为两个特征)常用的统计特征有mean、max、min、std、sum,pandas可用方法apply、agg、transform

group_col=[] stat_col = [] for i in group_col: for j in stat_col: if i!=j: data[i+'_max_'+j] = data.groupby([i])[j].transform('max') data[i+'_min_'+j] = data.groupby([i])[j].transform('min') data[i+'_std_'+j] = data.groupby([i])[j].transform('std') data[i+'_mean_'+j] = data.groupby([i])[j].transform(man')

类别特征

unique特征:指特征x对应的特征y的类别

for i in range(n): for j in range(n): if i!=n: se = data.groupby([col_type[i]])[col_type[j]].value_counts() # 值置为1 后面加和即为i对应的j的类别个数 se = pd.Series(1, index=se.index).sum(level=col_type[i]) df[col_name] = (data[col_type[i]].map(se)).fillna(value=0).astype(int).values

unique的计算也可以使用transform

from scipy.stats import entropy for i in group_col: for j in sta_col: if i!=j: data[i+'_nunique'+j] = data.groupby([i])[j].transform('nunique') data[i+'_mode'+j] = data.groupby([i])[j].transform(lambda x :x.mode()[0]) data[i+'_entropy'+j] = data.groupby([i])[j].transform(lambda x: entropy(x.value_counts() / x.shape[0]) for i in group_col: data[i+'_count'] = data.groupby([i])[''].transform('count')

上面代码还计算了entropy、mode、count

比赛常用特征工程实现 待续

最新回复(0)