您的位置:首页 > 其它

[置顶] 数据挖掘实战之天池精准医疗大赛(6)——特征工程2

2018-03-12 23:01 471 查看
Part 4-2:特征工程

2)特征工程示例

如何构造和选取不再赘述,下面列出我和一些大佬的特征,只看结果,如何实现出这些特征还需多下功夫亲自尝试。
引用一位大佬的一句话,“在看别人代码的时候,最终成果可能只有几百行,但是推理和尝试的代码量比成果多得多,这部分最终并没呈现出来,看似简单的答案只是冰山一角。因此,有时看了人家的答案,觉得每句都能理解,到了自己做的时候,还是照猫画虎,只能微调。data['天门谷氨比'] = data['*天门冬氨酸氨基转换酶'] / data['*r-谷氨酰基转换酶']
data['天门丙氨比'] = data['*天门冬氨酸氨基转换酶'] / data['*丙氨酸氨基转换酶']
data['甘三比'] = data['甘油三酯'] / (data['甘油三酯'] + data['总胆固醇'])
data['中粒比'] = data['中性粒细胞%'] / (data['中性粒细胞%'] + data['嗜酸细胞%']+ data['嗜碱细胞%'])
data['红血红蛋白立方'] = data['红细胞平均血红蛋白量']*data['红细胞平均血红蛋白量']*data['红细胞平均血红蛋白量']
data['new_feature_1'] = data[u'中性粒细胞%']/data[u'淋巴细胞%']
data['new_feature_2'] = data[u'白蛋白']/data[u'*球蛋白']
data['new_feature_3'] = np.square(100*data[u'低密度脂蛋白胆固醇']/data[u'高密度脂蛋白胆固醇'])
data['new_feature_4'] = np.square(data[u'年龄'])
data['new_feature_5'] = data[u'白蛋白']/data[u'白细胞计数']

'''
data['中性粒细胞方'] = data['中性粒细胞%'] *data['中性粒细胞%']
data['嗜酸细胞%方'] =data['嗜酸细胞%']*data['嗜酸细胞%']
data['低胆比'] = data['低密度脂蛋白胆固醇'] / data['年龄']
data['白细胞比'] = data['白细胞计数']/ data['年龄']
'''
data = data.drop([u'中性粒细胞%',u'淋巴细胞%',u'白蛋白',u'*球蛋白',u'白细胞计数',
                u'嗜酸细胞%',u'嗜碱细胞%',u'低密度脂蛋白胆固醇',u'高密度脂蛋白胆固醇'],axis=1)
这是鄙人小组的所用特征,将看起来相关的特征进行了组合,做了一些筛选,起了像样的名字,有的特征效果很好,有的只是尝试了一下,好像没什么改进。下面是鄙人利用多项式特征和函数变换特征构造的模型,可以看一下具体可行办法;然而并没有进行特征选择,原因主要是下一步鄙人用的GBDT+LR的模型,L1正则起到筛选特征的作用,模型见下一节,此处只看特征。print("_____________________________构造特征______________________________________________")
for i in range(n_fea):

all_x['squ%d' % i] = all_x.iloc[:, i] * all_x.iloc[:, i]
all_x['log%d' % i] = np.log1p(all_x.iloc[:, i])
all_x['sqrt%d' % i] = np.sqrt(all_x.iloc[:, i])

all_x['cube%d' % i] = all_x.iloc[:, i] * all_x.iloc[:, i] * all_x.iloc[:, i]
for j in range(i + 1, n_fea):
all_x['poly%d%d' % (i, j)] = all_x.iloc[:, i] * all_x.iloc[:, j]
# all_x['%d div %d' % (i, j)] = all_x.iloc[:, i] / all_x.iloc[:, j]
# for k in range(i):
# all_x['%d & %d'%(i,k)] = np.logaddexp(all_x.iloc[:, i] , all_x.iloc[:,k])
all_x['天门谷氨比'] = all_x['*天门冬氨酸氨基转换酶'] / all_x['*r-谷氨酰基转换酶']
all_x['天门丙氨比'] = all_x['*天门冬氨酸氨基转换酶'] / all_x['*丙氨酸氨基转换酶']
all_x['谷丙氨比'] = all_x['*r-谷氨酰基转换酶'] / all_x['*丙氨酸氨基转换酶']
# all_x['红血红蛋白立方'] = all_x['红细胞平均血红蛋白量'] * all_x['红细胞平均血红蛋白量'] * all_x['红细胞平均血红蛋白量']

# all_x['红计数立方'] = all_x['红细胞计数'] * all_x['红细胞计数'] * all_x['红细胞计数']
# all_x['血小板比积方'] = all_x['血小板比积'] * all_x['血小板比积']

all_x['球蛋白比例'] = all_x['*球蛋白'] /
e1bf
all_x['*总蛋白']
all_x['白蛋白方'] = pow(all_x['白蛋白'] / 10, 10) / 1000
# all_x['总蛋白立方'] = all_x['*总蛋白']*all_x['*总蛋白']*all_x['*总蛋白']

all_x['高胆比例'] = all_x['高密度脂蛋白胆固醇'] / all_x['总胆固醇']
all_x['高低胆比'] = all_x['高密度脂蛋白胆固醇'] / all_x['低密度脂蛋白胆固醇']

all_x['甘三比'] = all_x['甘油三酯'] / (all_x['甘油三酯'] + all_x['总胆固醇'])
all_x['尿特征1'] = all_x['肌酐'] / all_x['尿素']
all_x['尿特征2'] = all_x['尿酸'] / all_x['尿素']
all_x['中粒比'] = all_x['中性粒细胞%'] / (all_x['中性粒细胞%'] + all_x['嗜酸细胞%'] + all_x['嗜碱细胞%'])
all_x['中淋比'] = all_x['中性粒细胞%'] / all_x['淋巴细胞%']
all_x['单淋比'] = all_x['单核细胞%'] / all_x['淋巴细胞%']
# all_x['中性粒细胞方'] = all_x['中性粒细胞%'] * all_x['中性粒细胞%']
# all_x['嗜酸细胞方'] = all_x['嗜酸细胞%'] * all_x['嗜酸细胞%']
all_x = all_x.drop(['白球比例', '白蛋白', '中性粒细胞%', '嗜酸细胞%'], axis=1) # 白球比例重要性较低

# 还想构造一些年龄的特征??
all_x['低胆比'] = all_x['低密度脂蛋白胆固醇'] / all_x['年龄']
all_x['白细胞比'] = all_x['白细胞计数'] / all_x['年龄']
# all_x['红细胞比'] = all_x['红细胞计数'] / all_x['年龄']
# all_x['血红蛋白比'] = all_x['血红蛋白'] / all_x['年龄']

all_x = all_x.drop(['红细胞计数', '血小板比积', '红细胞平均血红蛋白量'], axis=1)几点解释与不成熟的想法:
1,可见平方,立方,多项式特征及log(1+x)特征,除法特征代码注释掉了,原因是除数有接近0的会报错,建议将除法特征作一些转换?于是只能手动组合一些除法特征。大佬们有许多加减法的特征,还需要学习这些理论。
2,根据相关系数构造了一些三次方至8次方的特征,其中“红血红蛋白立方”确实有效果,其他的并不明显,但感觉是一个构造有效特征的思路,还需继续尝试。
3,结合领域知识:一些在生理上有一点含义的特征确有效果比如‘尿特征’等,可见构造这样的特征十分必要,我们这里做的还不够充分。最后有一些年龄相关的特征打算尝试构造一些(思路是年龄的相关性极高,希望从中挖掘更多特征)。
4,有进行批量生产特征的工作但是并没有进行好特征选择,还有待提升能力!
最后看一些大佬们的作品~
天池精准医疗糖尿病之特征瞎找瞎凑全看脸下面是通过循环人工手动看特征重要度提取:

train["尿素尿酸比"] = train["尿素"]/train["尿酸"]

train["肌酐尿酸比"] = train["肌酐"]/train["尿酸"]

train["白红计数比"] = train["白细胞计数"]/train["红细胞计数"]

train["红细胞平均血红蛋白量"] = train["血红蛋白"]/train["红细胞计数"]

train["红细胞平均血红蛋体积"] = train["红细胞平均血红蛋白量"]/train["红细胞平均血红蛋白浓度"]

train["红细胞总体积"] = train["红细胞平均体积"]*train["红细胞计数"]

train["红细胞平均血红蛋体积分布宽度"] = train["红细胞平均血红蛋体积"]*train["红细胞体积分布宽度"]

train['嗜酸红白比'] = train['嗜酸细胞%']*train['白红计数比']

train['中性粒平均碱性磷酸'] = train['*碱性磷酸酶']*train['中性粒细胞%']

train['淋巴白比'] = train['淋巴细胞%']*train['白细胞计数']

train['中性粒平均血红蛋白浓度'] = train['红细胞平均血红蛋白浓度']*train['中性粒细胞%']

train["单个红细胞体积宽度差"] = train["红细胞体积分布宽度"]/train["红细胞计数"]

train["单个血小板体积宽度差"] = train["血小板体积分布宽度"]/train["血小板计数"]

train["红细胞宽度体积比"] = train["红细胞体积分布宽度"]/train["红细胞平均体积"]

train["尿酸天门比"] = train["尿酸"]/train["*天门冬氨酸氨基转换酶"]

train["天门白球比例"] = train["白球比例"]*train["*天门冬氨酸氨基转换酶"]

train["红细胞分布宽度天门白球比例"] = train["天门白球比例"]*train["红细胞体积分布宽度"]

train["尿酸谷氨比"] = train["尿酸"]/train["*r-谷氨酰基转换酶"]

train["尿酸碱性磷酸比"] = train["尿酸"]/train["*碱性磷酸酶"]

train["肌酐丙氨酸比"] = train["肌酐"]/train["*丙氨酸氨基转换酶"]

# #######方##################

train["白蛋白方"] = train["白蛋白"]*train["白蛋白"]

train["年龄方"] = train["年龄"]*train["年龄"]

train["红细胞平均血红蛋体积分布宽度lg"] = np.log1p(train['红细胞平均血红蛋体积分布宽度'])

train["红细胞平均血红蛋体积分布宽度lg"] = np.sqrt(train['红细胞平均血红蛋体积分布宽度'])

# # ###年龄###

train["年龄*甘油三酯"] = train["年龄"]*train["甘油三酯"]

train["年龄*嗜碱细胞"] = train["年龄"]*train["嗜碱细胞%"]

train["年龄*剩余胆固醇"] = train["年龄"]*train["剩余胆固醇"]

train["年龄*白细胞计数"] = train["年龄"]*train["白细胞计数"]

# # ###天门###

train["*天门冬氨酸氨基转换酶*甘油三酯"] = train["*天门冬氨酸氨基转换酶"]*train["甘油三酯"]

train["*天门冬氨酸氨基转换酶*单个红细胞体积宽度差"] = train["*天门冬氨酸氨基转换酶"]
*train["单个红细胞体积宽度差"]

train["*天门冬氨酸氨基转换酶*红细胞平均血红蛋体积分布宽度"] = train["*天门冬氨酸氨基转换酶"]
*train["红细胞平均血红蛋体积分布宽度"]

train["*天门冬氨酸氨基转换酶*白红计数比"] = train["*天门冬氨酸氨基转换酶"]*train["白红计数比"]

# # # ##丙氨酸###

train["*丙氨酸氨基转换酶*肌酐尿酸比"] = train["*丙氨酸氨基转换酶"]*train["肌酐尿酸比"]

train["*丙氨酸氨基转换酶*尿素尿酸比"] = train["*丙氨酸氨基转换酶"]*train["尿素尿酸比"]

# ###碱性磷酸酶###

train["*碱性磷酸酶*尿素尿酸比"] = train["*碱性磷酸酶"]*train["尿素尿酸比"]

train["*碱性磷酸酶*甘油三酯"] = train["*碱性磷酸酶"]*train["甘油三酯"]

# #高密度脂蛋白胆固醇###

train["高密度脂蛋白胆固醇*尿酸谷氨比"] = train["尿酸谷氨比"]*train["高密度脂蛋白胆固醇"]

train["高密度脂蛋白胆固醇*肌酐丙氨酸比"] = train["肌酐丙氨酸比"]*train["高密度脂蛋白胆固醇"]

# # #红细胞平均血红蛋白浓度###

train["红细胞平均血红蛋白浓度*红细胞平均血红蛋体积分布宽度"] =
train["红细胞平均血红蛋体积分布宽度"]*train["红细胞平均血红蛋白浓度"]

train["红细胞平均血红蛋白浓度*尿素尿酸比"] = train["尿素尿酸比"]*train["红细胞平均血红蛋白浓度"]

train["红细胞平均血红蛋白浓度*年龄"] = train["年龄"]*train["红细胞平均血红蛋白浓度"]

train["红细胞平均血红蛋白浓度*年龄lg+sq"]=np.log1p(train['红细胞平均血红蛋白浓度*年龄'])
+np.sqrt(train['红细胞平均血红蛋白浓度*年龄'])

# #差值#

train["红细胞平均血红蛋白浓度*年龄lg+sq-天门"]=train["红细胞平均血红蛋白浓度*年龄lg+sq"]
-train["*天门冬氨酸氨基转换酶"]

train["*丙氨酸氨基转换酶*尿素尿酸比-天门"]=train["*丙氨酸氨基转换酶*尿素尿酸比"]-train["*天门冬氨酸氨基转换酶"]

train["年龄*甘油三酯-天门"]=train["年龄*甘油三酯"]-train["*天门冬氨酸氨基转换酶"]

train["红细胞平均血红蛋白浓度-天门"]=train["红细胞平均血红蛋白浓度"]-train["*天门冬氨酸氨基转换酶"]

train["血小板体积分布宽度-天门"]=train["血小板体积分布宽度"]-train["*天门冬氨酸氨基转换酶"]

train["血小板平均体积-丙氨酸"]=train["血小板平均体积"]-train["*丙氨酸氨基转换酶"]

train["血小板平均体积-碱性"]=train["血小板平均体积"]-train["*碱性磷酸酶"]

train["尿酸*白球比例"]=train["尿酸"]*train["白球比例"]

train["年龄*甘油三酯-甘油三酯"]=train["年龄*甘油三酯"]*train["甘油三酯"]

train['谷氨酰基-高密度脂蛋白胆固醇'] = train['*r-谷氨酰基转换酶'] - train['高密度脂蛋白胆固醇']

train['红细胞计数-高密度脂蛋白胆固醇'] = train['红细胞计数'] - train['高密度脂蛋白胆固醇']

train['血红蛋白-肌酐'] = train['血红蛋白'] - train['肌酐']

train['年龄*白细胞计数-红细胞平均体积'] = train['年龄*白细胞计数'] - train['红细胞平均体积']

train['尿素-红细胞平均体积'] = train['尿素'] - train['红细胞平均体积']

# 缺失值填补为中位数

for name in train.columns:

train[name] = train[name].fillna(train[name].median())

# 改变右偏长尾特征

for column in train.columns:

if len(train[column].unique()) > 10 and train[column].mean() > 1:

skew = train[column].skew()

if abs(skew) > 1.0 and train[column].min() > -1:

train[column] = np.log1p(train[column])

# #特征选择

train = train.drop('id', axis=1)

train = train.drop(["乙肝表面抗原", '乙肝表面抗体'], axis=1)

train['高低总胆固醇'] = train['高密度脂蛋白胆固醇'] + train['低密度脂蛋白胆固醇']

train = train.drop(["尿素", "肌酐"], axis=1)

train = train.drop(["血小板比积", "甘油三酯", "性别_女","性别_男",], axis=1)

还有 一篇不错的,糖尿病预测方案简介data["yearmonth"] = data['体检日期'].dt.year*100 + data['体检日期'].dt.month

data["yearweek"] = data['体检日期'].dt.year*100 + data['体检日期'].dt.weekofyear

data["month_of_year"] = data['体检日期'].dt.month

data["week_of_year"] = data['体检日期'].dt.weekofyear

data["day_of_week"] = data['体检日期'].dt.weekday

data['总酶'] = data['*天门冬氨酸氨基转换酶']+data['*丙氨酸氨基转换酶']+data['*碱性磷酸酶']+data['*r-谷氨酰基转换酶']

data['*天门冬氨酸氨基转换酶ratio'] = data['*天门冬氨酸氨基转换酶']/np.maximum(data["总酶"].astype("float"),1)

data['*天门冬氨酸氨基转换酶ratio'].loc[data['*天门冬氨酸氨基转换酶ratio']<0]=0

data['*天门冬氨酸氨基转换酶ratio'].loc[data['*天门冬氨酸氨基转换酶ratio']>1]=1

data['*丙氨酸氨基转换酶ratio'] = data['*丙氨酸氨基转换酶']/np.maximum(data["总酶"].astype("float"),1)

data['*丙氨酸氨基转换酶ratio'].loc[data['*丙氨酸氨基转换酶ratio']<0]=0

data['*丙氨酸氨基转换酶ratio'].loc[data['*丙氨酸氨基转换酶ratio']>1]=1

data['*碱性磷酸酶ratio'] = data['*碱性磷酸酶']/np.maximum(data["总酶"].astype("float"),1)

data['*碱性磷酸酶ratio'].loc[data['*碱性磷酸酶ratio']<0]=0

data['*碱性磷酸酶ratio'].loc[data['*碱性磷酸酶ratio']>1]=1

data['*r-谷氨酰基转换酶ratio'] = data['*r-谷氨酰基转换酶']/np.maximum(data["总酶"].astype("float"),1)

data['*r-谷氨酰基转换酶ratio'].loc[data['*r-谷氨酰基转换酶ratio']<0]=0

data['*r-谷氨酰基转换酶ratio'].loc[data['*r-谷氨酰基转换酶ratio']>1]=1

data['白蛋白ratio'] = data['白蛋白']/np.maximum(data["*总蛋白"].astype("float"),1)

data['白蛋白ratio'].loc[data['白蛋白ratio']<0]=0

data['白蛋白ratio'].loc[data['白蛋白ratio']>1]=1

data['*球蛋白ratio'] = data['*球蛋白']/np.maximum(data["*总蛋白"].astype("float"),1)

data['*球蛋白ratio'].loc[data['*球蛋白ratio']<0]=0

data['*球蛋白ratio'].loc[data['*球蛋白ratio']>1]=1

data['高密度脂蛋白胆固醇ratio'] = data['高密度脂蛋白胆固醇']/np.maximum(data["总胆固醇"].astype("float"),1)

data['高密度脂蛋白胆固醇ratio'].loc[data['高密度脂蛋白胆固醇ratio']<0]=0

data['高密度脂蛋白胆固醇ratio'].loc[data['高密度脂蛋白胆固醇ratio']>1]=1

data['低密度脂蛋白胆固醇ratio'] = data['低密度脂蛋白胆固醇']/np.maximum(data["总胆固醇"].astype("float"),1)

data['低密度脂蛋白胆固醇ratio'].loc[data['低密度脂蛋白胆固醇ratio']<0]=0

data['低密度脂蛋白胆固醇ratio'].loc[data['低密度脂蛋白胆固醇ratio']>1]=1

data['null_count'] = data.isnull().sum(axis=1)

data['*r-谷氨酰基转换酶-尿酸'] = data['*r-谷氨酰基转换酶'] - data['尿酸']

data['*r-谷氨酰基转换酶*年龄'] = data['*r-谷氨酰基转换酶'] * data['年龄']

data['*r-谷氨酰基转换酶*总胆固醇'] = data['*r-谷氨酰基转换酶'] * data['总胆固醇']

data['*丙氨酸氨基转换酶**天门冬氨酸氨基转换酶'] = data['*丙氨酸氨基转换酶'] * data['*天门冬氨酸氨基转换酶']

data['*丙氨酸氨基转换酶+*天门冬氨酸氨基转换酶'] = data['*丙氨酸氨基转换酶'] + data['*天门冬氨酸氨基转换酶']

data['*丙氨酸氨基转换酶/*天门冬氨酸氨基转换酶'] = data['*丙氨酸氨基转换酶'] / data['*天门冬氨酸氨基转换酶']

data['*天门冬氨酸氨基转换酶/*总蛋白'] = data['*天门冬氨酸氨基转换酶'] / data['*总蛋白']

data['*天门冬氨酸氨基转换酶-*球蛋白'] = data['*天门冬氨酸氨基转换酶'] - data['*球蛋白']

data['*球蛋白/甘油三酯'] = data['*球蛋白'] / data['甘油三酯']

data['年龄*红细胞计数/红细胞体积分布宽度-红细胞计数'] = data['年龄'] * data['红细胞计数'] / (data['红细胞体积分布宽度']
-data['红细胞计数'])
data['尿酸/肌酐'] = data['尿酸'] / data['肌酐']
data['肾'] = data['尿素'] + data['肌酐'] + data['尿酸']
data['红细胞计数*红细胞平均血红蛋白量'] = data['红细胞计数'] * data['红细胞平均血红蛋白量']
data['红细胞计数*红细胞平均血红蛋白浓度'] = data['红细胞计数'] * data['红细胞平均血红蛋白浓度']
data['红细胞计数*红细胞平均体积'] = data['红细胞计数'] * data['红细胞平均体积']
data['嗜酸细胞'] = data['嗜酸细胞%'] * 100
data['年龄*中性粒细胞%/尿酸*血小板比积'] = data['年龄'] * data['中性粒细胞%']/ (data['尿酸']*data['血小板比积'])
predictors1 = ['年龄', '性别', '高密度脂蛋白胆固醇', '甘油三酯', 尿素', '低密度脂蛋白胆固醇',
'*天门冬氨酸氨基转换酶',*丙氨酸氨基转换酶', '*r-谷氨酰基转换酶', '*碱性磷酸酶',
'尿酸', '中性粒细胞%', '红细胞体积分布宽度', '红细胞平均体积',
'红细胞平均血红蛋白浓度', '红细胞平均血红蛋白量', '红细胞计数', '血小板体积分布宽度',
'血小板比积', 'yearweek', 'week_of_year', 'day_of_week', '*天门冬氨酸氨基转换酶ratio',
'*碱性磷酸酶ratio', '*r-谷氨酰基转换酶-尿酸', '*r-谷氨酰基转换酶*年龄',
'*r-谷氨酰基转换酶*总胆固醇', '*丙氨酸氨基转换酶**天门冬氨酸氨基转换酶',
'*丙氨酸氨基转换酶+*天门冬氨酸氨基转换酶', '*丙氨酸氨基转换酶/*天门冬氨酸氨基转换酶' ,
'*天门冬氨酸氨基转换酶/*总蛋白', '*天门冬氨酸氨基转换酶-*球蛋白' ,'*球蛋白/甘油三酯']
#下面是麻婆豆腐开源的部分特征
'尿酸/肌酐' ,'红细胞计数*红细胞平均血红蛋白浓度' ,'红细胞计数*红细胞平均体积','肾','总酶' ,'嗜酸细胞%','淋巴细胞%'
不去解释大佬们的作品,特征确实就是那样的各种运算和组合,真正生成合适的特征是反复筛选的结果,还需多动手做才是。因此这一部分特征示例才格外重要。大佬们的特征如此之多可见特征工程的工作量确实很大!
特征工程介绍完了,数据挖掘的工作其实完成了80%,下一节介绍几个常用的模型~多谢诸位支持,还请大佬们指教~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: