特征工程
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
特征工程是使用专业背景知识和技巧来处理数据,使得特征能在机器学习算法上发挥更好作用的过程。会直接影响机器学习的效果
特征工程包含的内容:
特征抽取
特征预处理
特征降维
特征抽取/特征提取就是将任意数据(如文本或图像)转换为可用于机器学习的数字特征
ps: 字典特征的提取(特征值离散化),文本特征提取,图像特征提取。
字典的特征提取:
将字典的类别(k值)————> 变成one - hot编码
代码如下:
#导入字典特征抽取的模块 from sklearn.feature_extraction import DictVectorizer
#字典的特征抽取 def dict_demo(): data = [{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':30}] #1 实例化一个转换器,默认返回的是稀疏矩阵(sparse),如果不想返回稀疏矩阵,要用sparse=False,稀疏矩阵指标是非零值 #稀疏矩阵可以节省内存 transfer = DictVectorizer(sparse=False) #2 调用fit_transform(),返回的data_new的类型是一个sparse矩阵的对象 data_new = transfer.fit_transform(data) print('转换结果\n',data_new) print('特征名字:\n',transfer.get_feature_names()) return None
输出结果:
文本的特征提取:
对于英文文本,是将单词作为特征,转换为数字。
代码如下:
#导入文本特征抽取的模块 from sklearn.feature_extraction.text import CountVectorizer
#文本特征抽取,统计每个样本出现特征词的个数,如果是处理中文的话,“特征词”与“特征词”之间要加上空格 def count_demo(): data = ["life is short,i like like python","life is too long,i dislike python"] #1 实例化一个转换器类,默认返回稀疏矩阵,有参数stop_words 停用词(比如 if ,too这些实际意义不大的词,可以不统计),如:停用词表 transfer = CountVectorizer(stop_words=['is','too']) #2 调用fit_transform方法 data_new = transfer.fit_transform(data) #toarray()方法变成二维数组 print("datanew:\n",data_new.toarray()) #查看特征名字 print("特征名字:\n",transfer.get_feature_names()) return None
输出结果:
中文文本的特征提取:
中文文本的特征提取如要jieba分词器
代码如下:
#导入中文文本分词处理的模块,结巴 import jieba
#定义分词的函数 def cut_word(text): ''' 进行中文分词 :param text: :return: ''' #" ".join把列表变成列表内的元素 text = " ".join(list(jieba.cut(text))) return text #中文文本特征提取 def cout_chinese_demo(): # 带自动分词的中文文本特征抽取 data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。", "我们看到的从很远星系来的光是在几百万年之前发出的.这样当我们看到宇宙时,我们是在看它的过去。", "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系."] data_new = [] for sent in data: data_new.append(cut_word(sent)) print(data_new) transfer = CountVectorizer() #2 调用fit_transform方法 data_final = transfer.fit_transform(data_new) #toarray()方法变成二维数组 print("datanew:\n",data_final.toarray()) #查看特征名字 print("特征名字:\n",transfer.get_feature_names()) return None
输出结果:
关键词:在其中一个类别的文章中,出现的次数很多,但是在其他类别的文章中出现的次数很少
Tf-Idf文本特征的提取(处理某个词或短语在多篇文章中出现次数高的情况)
这种文本特征提取的主要思想是,如果某个词或短语在一片文章中出现的概率很高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
词频(tf):指的是一个词在该文件中出现的频率
逆向文档频率(idf):一个词语普遍重要性的度量。idf = lg(文件总数/包含该词语的文件数)
一个小例子:
现在有两个词:“经济”,“非常”
1000篇文章——————语料库
100篇文章——————“非常”
10篇文章——————“经济”
文章A(100词):10次“经济”
tf: 10 / 100 = 0.1
idf: lg(1000/10) = 2
文章B(100词):10次“非常”
tf: 10 / 100 = 0.1
idf: lg(1000 / 100) = 1
Tf - Idf是分类机器学习算法进行文章分类中前期数据处理的方式
代码:
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
#导入中文文本分词处理的模块,结巴 import jieba
#定义分词的函数 def cut_word(text): ''' 进行中文分词 :param text: :return: ''' #" ".join把列表变成列表内的元素 text = " ".join(list(jieba.cut(text))) return text
def tfidf_demo(): ''' 用tf_idf的方法进行文本特征抽取 :return: ''' # 带自动分词的中文文本特征抽取 data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。", "我们看到的从很远星系来的光是在几百万年之前发出的.这样当我们看到宇宙时,我们是在看它的过去。", "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系."] data_new = [] for sent in data: data_new.append(cut_word(sent)) # print(data_new) transfer = TfidfVectorizer(stop_words=['一种','所以']) # 2 调用fit_transform方法' data_final = transfer.fit_transform(data_new) # toarray()方法变成二维数组 print("datanew:\n", data_final.toarray()) # 查看特征名字 print("特征名字:\n", transfer.get_feature_names()) return None
运行结果: