达观杯-特征工程 3--(特征衍生)

在很多时候,当原数据中的特征数量很少,或者特征数量够但是想进一步提升模型的性能。这个时候就需要在原数据特征的基础上衍生新的特征以此来增加特征的数量。
只要方法得当的话,通常情况下,效果会比原来的效果要好一点。

多项式法构造特征

import pickle
import time
from sklearn.preprocessing import PolynomialFeatures

t_start = time.time()

"""读取原特征"""
features_path = './data_s_lsvc_l2_143w_lsa.pkl'
f = open(features_path, 'rb')
x_train, y_train, x_test = pickle.load(f)
f.close()

"""使用多项式方法构造出更多的特征"""
poly = PolynomialFeatures(degree=2, interaction_only=True, include_bias=False)#degree控制多项式最高次数
x_train_new = poly.fit_transform(x_train)
x_test_new = poly.transform(x_test)

"""将构造好的特征保存至本地"""
data = (x_train_new, y_train,  x_test_new)
features_constr_path = features_path.split('/')[-1] + '_constr.pkl'
f_data = open(features_constr_path, 'wb')
pickle.dump(data, f_data)
f_data.close()

t_end = time.time()
print("构造特征完成,共耗时:{}min".format((t_end-t_start)/60))

PolynomialFeatures(degree=2, interaction_only=True, include_bias=False)多项式方法构造新的特征。
其中degree是用来控制多项式的阶数的,一般情况下都设置为2,并且不宜太高,太高的话很容易产生过拟合。
interaction_only:如果值为true(默认是false),则会产生相互影响的特征集。
include_bias包不包含偏差。

特征融合

import numpy as np
import pickle
import time

t_start = time.time()

"""=====================================================================================================================
2 读取lda/lsa/doc2vec特征,并对这三种特征进行拼接融合
"""
f1 = open('./data_lda.pkl', 'rb')
x_train_1, y_train, x_test_1 = pickle.load(f1)
f1.close()

f2 = open('./data_s_lsvc_l2_143w_lsa.pkl', 'rb')
x_train_2, y_train, x_test_2 = pickle.load(f2)
f2.close()

f3 = open('./data_doc2vec_25.pkl', 'rb')
x_train_3, _, x_test_3 = pickle.load(f3)
f3.close()

x_train = np.concatenate((x_train_1, x_train_2, x_train_3), axis=1)
x_test = np.concatenate((x_test_1, x_test_2, x_test_3), axis=1)

"""=====================================================================================================================
2 将融合后的特征,保存至本地
"""
data = (x_train, y_train, x_test)
fp = open('./data_ensemble.pkl', 'wb')
pickle.dump(data, fp)
fp.close()

t_end = time.time()
print("已将原始数据数字化为融合的特征,共耗时:{}min".format((t_end-t_start)/60))

这里的特征融合只是将其简单拼接到一起。并且一定要注意下,np.concatenate的拼接方向。

特征稀疏

import pickle
from scipy import sparse
from scipy.sparse import hstack

"""读取ensemble特征"""
f_ensemble = open('./data_ensemble.pkl', 'rb')
x_train_ens, y_train, x_test_ens = pickle.load(f_ensemble)
f_ensemble.close()

"""将numpy 数组 转换为 csr稀疏矩阵"""
x_train_ens_s = sparse.csr_matrix(x_train_ens)
x_test_ens_s = sparse.csc_matrix(x_test_ens)

"""读取tfidf特征"""
f_tfidf = open('./data_tfidf_select_LSVC_l2_17107.pkl', 'rb')
x_train_tfidf, _, x_test_tfidf = pickle.load(f_tfidf)
f_tfidf.close()

"""对两个稀疏矩阵进行合并"""
x_train_spar = hstack([x_train_ens_s, x_train_tfidf])
x_test_spar = hstack([x_test_ens_s, x_test_tfidf])

"""将合并后的稀疏特征保存至本地"""
data = (x_train_spar, y_train, x_test_spar)
f = open('./data_ensemble_spar.pkl', 'wb')
pickle.dump(data, f)
f.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值