达观杯-特征工程 2--(增加特征及特征选取)

继续进行特征工程。
因为根据原数据,特征信息实际上是偏少的,这个时候需要增加一些特征信息对于训练模型可能会有比较好的效果。

1 增加特征

将Word的长度这一信息作为一个特征提取出来,并保存。

df_train=pd.read_csv('train_set.csv')
df_test=pd.read_csv('test_set.csv')
'''
定义得到单词长度的函数
'''
def get_word_len(df_series):
	word_len=[]
	for row in df_series:
    	word_len.append(len(row.split(' ')))   #注意split函数的应用
    return word_len

'''
这里新建DataFrame,存入ID及其对应的单词长度信息
'''
df_train_word = pd.DataFrame({'id':df_train['id'].values.tolist(),'word_len':get_word_len(df_train['word_seg'])})
df_test_word = pd.DataFrame({'id':df_test['id'].values.tolist(),'word_len':get_word_len(df_test['word_seg'])})

df_train_word.to_csv('./train_word_len.csv',index=False)
df_test_word.to_csv('./test_word_len.csv',index=False)

2 特征降维

LDA降维:

"""
将countvector(word)特征降维为lda特征,并将结果保存至本地
先将文本信息向量化哪一步非常重要

"""
from sklearn.decomposition import LatentDirichletAllocation
import pickle
import time

t_start = time.time()

"""
1 countvector(word)特征加载
"""
with open('countvector_word.pkl', 'rb') as f:
	x_train, y_train, x_test = pickle.load(f_tf)

"""
2 特征降维:lda
"""
lda = LatentDirichletAllocation(n_components=200)
x_train = lda.fit_transform(x_train)
x_test = lda.transform(x_test)

"""
3 将lda特征保存至本地
"""
data = (x_train, y_train, x_test)
with open('lda_countvector(word).pkl', 'wb') as f:
	pickle.dump(data, f)

t_end = time.time()
print("共耗时:{}min".format((t_end-t_start)/60))

LDA是隐狄利克雷主题模型,对于处理文本信息,提取主题非常有用,可以自行百度。
LDA详解
(有兴趣的可以自己看一下)

3 LSA

"""
将tfidf(word)特征降维为lsa特征,并将结果保存至本地

"""
from sklearn.decomposition import TruncatedSVD
import pickle
import time

t_start = time.time()


"""
0 读取tfidf特征
"""
with open('tfidf_word.pkl', 'rb') as f:
	x_train, y_train, x_test = pickle.load(f)

"""
1 特征降维:lsa
"""
lsa = TruncatedSVD(n_components=200)
x_train = lsa.fit_transform(x_train)
x_test = lsa.transform(x_test)

"""
2 将lsa特征保存至本地
"""
data = (x_train, y_train, x_test)
with open('lsa_tfidf(word).pkl', 'wb') as f:
	pickle.dump(data, f_data)

t_end = time.time()
print("共耗时:{}min".format((t_end-t_start)/60))

LSA :浅层语义分析(LSA)是一种自然语言处理中用到的方法,其通过“矢量语义空间”来提取文档与词中的“概念”,进而分析文档与词之间的关系。
(有兴趣的可以看一下LSA详解:LSA)
另外,TSVD类似于PCA可以用来降维,并且可以用来实现LSA,实现LSA的时候,推荐用tf-idf矩阵,而不是tf矩阵。

NMF降维:

# -*- coding: utf-8 -*-
"""
这里需要注意,一定是先将数据经过向量化之后才可以
"""
from sklearn.decomposition import NMF
import pickle
import time

t_start = time.time()

"""读取tfidf特征"""
tfidf_path = './word_seg_tfidf_(1, 3)-2036592-616882-192632-62375.pkl'
f_tfidf = open(tfidf_path, 'rb')
x_train, y_train, x_test = pickle.load(f_tfidf)
f_tfidf.close()
"""特征降维:nmf"""
num_features = 200           #设置最后留下的特征的而数量
nmf = NMF(n_components=num_features)
‘'''
一定要注意下面关于x_train 和x_test的一个训练和转化的过程
'''
x_train = nmf.fit_transform(x_train)
x_test = nmf.transform(x_test)

"""将lsa特征保存至本地"""
data = (x_train, y_train, x_test)
data_path = tfidf_path[:-4] + '-nmf.pkl'
f_data = open(data_path, 'wb')
pickle.dump(data, f_data)
f_data.close()

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

从另一个角度来说,NMF实际上也是对原始特征进行了选择,选择最能体现原始数据的特征。NMF的原理是Python实现可以参看我的另一篇博客。

SVC

实际上是一种通过模型选择来进行特征选取的方法。

"""
对特征进行嵌入式选择
"""
import time
import pickle
from sklearn.feature_selection import SelectFromModel
from sklearn.svm import LinearSVC

t_start = time.time()

"""读取特征"""
features_path = './data_tfidf_select_LSVC_l2_901288_select_LSVC_l2_279950.pkl'#前面处理得到的tfidf特征向量
fp = open(features_path, 'rb')
x_train, y_train, x_test = pickle.load(fp)
fp.close()

"""进行特征选择"""
alo_name = 'LSVC_l2'
lsvc = LinearSVC(penalty='l2', C=1.0, dual=True).fit(x_train, y_train)
slt = SelectFromModel(lsvc, prefit=True)
x_train_s = slt.transform(x_train)
x_test_s = slt.transform(x_test)

"""保存选择后的特征至本地"""
num_features = x_train_s.shape[1]
data_path = './' + features_path.split('.')[-2] + '_select_' + alo_name + '_' + str(num_features) + '.pkl'
data_f = open(data_path, 'wb') 
pickle.dump((x_train_s, y_train, x_test_s), data_f)
data_f.close()

t_end = time.time()
print("特征选择完成,选择{}个特征,共耗时{}min".format(num_features, (t_end-t_start)/60))


猜你喜欢

转载自blog.csdn.net/linichengpps/article/details/82970407