特征工程
原创
©著作权归作者所有:来自51CTO博客作者wx63899b601ff16的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
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
比赛常用特征工程实现 待续