以下回答将从定义、步骤和案例三个部分解读特征工程。废话不多说,快上车!
为了提取知识和做出预测,机器学习使用数学模型来拟合数据。这些模型将特征作为输入。
特征工程是数据科学和机器学习流水线上的重要一环,因为正确的特征可以减轻构建模型的难度,从而使机器学习流程输出更高质量的结果。
特征工程在机器学习流程中的位置
经典特征工程包括探索性数据分析、特征理解、特征增强、特征构建和特征选择5个步骤,为进一步解释数据并进行预测性分析做准备。
经典特征工程流程
在应用机器学习流水线,甚至在使用机器学习算法或特征工程工具之前,我们应该对数据集进行一些基本的描述性统计(大小、形状),并进行可视化操作,以便更好地理解数据的性质。
当拿到一个新的数据集时,基本工作流程如下:
识别数据基本工作流程
a.数据是结构化OR非结构化?
结构化(有组织)数据:可以分成观察值和特征的数据,一般以表格的形式组织(行是观察值,列是特征)。例如科学仪器报告的气象数据是高度结构化的,因为存在表格的行列结构。
非结构化(无组织)数据:作为自由流动的实体,不遵循标准组织结构(例如表格)的数据。通常,非结构化数据在我们看来是一团数据,或只有一个特征(列)。例如以原始文本格式存储的数据,服务器日志和推文等,是非结构化数据。
b.数据是定量的OR定性的
一般情况下,在处理结构化的表格数据时,第一个问题是:数据是定量的,还是定性的?
定量数据本质上是数值,是衡量某样东西的数量。
定性数据本质上是类别,是描述某样东西的性质。
c.每列数据处于哪个等级?
数据可分为定类、定序、定距和定比四个等级,每个等级都有不同的控制和数学操作等级。数据等级决定了可以执行的可视化类型和操作。
定类等级(nominallevel):处理定性数据,只按名称分类,如血型、动物物种和人名。这个等级不能执行任何诸如加法、除法之类的数学操作,但是可以计数,因此可绘制条形图和饼图。
定序等级(nominallevel):处理定性数据,这个等级的数据可以自然排序,可进行计数,也可引入比较。但是数据属性仍然属于类别。因为能够计算中位数和百分位数,所以可在条形图和饼图的基础上增加茎叶图和箱线图。
定距等级(nominallevel):处理定量数据,可以对数值进行排序、比较和加减,引入算数平均数和标准差。可用散点图、直方图和折线图表示。
定比等级(nominallevel):处理定量数据,存在有意义的绝对零点,可以对数值进行加减乘除运算,例如¥100是¥50的2倍。可用直方图和箱线图表示。
d.对不同的数据等级进行不同的可视化表示。
清洗数据是指调整已有的列和行,增强数据是指在数据集中删除和添加新的列。
特征增强的意义是,识别有问题的区域,并确定哪种修复方法最有效。
识别数据中的缺失值
分析数据并了解缺失的数据是什么,这样才可以决定下一步如何处理这些缺失值。
首先进行探索性数据分析来识别缺失的值。可以使用Pandas和NumPy这两个Python包来存储数据并进行一些简单的计算,使用流行的可视化工具观察数据的分布情况。
处理数据集中的缺失值
处理缺失值最主要的两个方法是:
-删除缺少值的行:通过这种操作会留下具有数据的完整数据点。
-填充缺失值:填充指的是利用现有知识/数据来确定缺失的数量值并填充的行为。
对于数值数据,最常见的是用此列其余部分的均值填充缺失值。
对于分类数据,也有类似的处理方法,可计算出最常见的类别用于填充,也可构建自定义填充器处理分类数据的填充。
编码分类变量
任何机器学习算法,无论是线性回归还是利用欧几里得距离的KNN算法,需要的输入特征都必须是数值。将分类数据转换为数值数据有以下几种方法。
方法1:定类等级的编码
定类等级的编码主要方法是将分类数据转换为虚拟变量(dummyvariable),用Pandas自动找到分类变量并进行编码;或者创建自定义虚拟变量编码器,在流水线中工作。
方法2:定序等级的编码
在定序等级,由于数据的顺序有含义,使用虚拟变量是没有意义的,为了保持顺序,我们使用标签编码器。标签编码器是指,顺序数据的每个标签都会有一个相关数值。
特征缩放/归一化
特征缩放旨在改变特征的尺度,提高机器学习模型的准确率,也称为归一化。
常见的特征缩放操作有z分数标准化、min-max标准化和行归一化等。
构建新特征方法
方法1:最简单的方法是用Pandas将现有的特征扩大几倍;
用Pandas创建DataFrame,这也是Pandas的主要数据结构。这样做的优点是可以用很多属性和方法操作数据,从而对数据进行符合逻辑的操作,以深入了解我们使用的数据,以及如何最好地构建机器学习模型。
方法2:依靠数学的方法,使用scikit-learn包,扩展数值特征;
在处理数值数据、创建更多特征时,一个关键方法是使用scikit-learn的PolynomialFeatures类。这个构造函数会创建新的列,它们是原有列的乘积,用于捕获特征交互。更具体地说,这个类会生成一个新的特征矩阵,里面是原始数据各个特征的多项式组合,阶数小于或等于指定的阶数。
方法3:编写自己的类。
针对文本的特征构建方法
在日常生活中,我们很大程度通过书面文本的方式进行沟通,通过建模,我们可以从中获得海量信息,如商户点评等。
这个工作又叫做自然语言处理(NLP,naturallanguageprocessing)。
针对文本的特征构建有词袋法、TF-IDF向量化器等方法。
方法1:词袋法
词袋法基本思想:通过单词的出现来描述文档,完全忽略单词在文档中的位置。在它最简单的形式中,用一个袋子表示文本,不考虑语法和词序,并将这个袋子视作一个集合,其中重复度高的单词更重要。
词袋法分3个步骤:
-分词(tokenizing):分词过程是用空白和标点将单词分开,将其变为词项。每个可能出现的词项都有一个整数ID。
-计数(counting):简单地计算文档中词项的出现次数。
-归一化(normalizing):将词项在大多数文档中的重要性按逆序排列。
方法2:TF-IDF向量化器
TF-IDF向量化器由两部分组成:
-TF(termfrequency,词频):衡量词在文档中出现的频率。由于文档的长度不同,词在长文中的出现次数有可能比在短文中出现的次数多得多。因此,一般会对词频进行归一化,用其除以文档长度或文档的总词数。
-IDF(inversedocumentfrequency,逆文档频率):衡量词的重要性。在计算词频时,我们认为所有的词都同等重要。但是某些词有可能出现很多次,但这些词并不重要。因此,我们需要减少常见词的权重,加大稀有词的权重。
特征选择是从原始数据中选择对于预测流水线而言最好的特征的过程。即,给定n个特征,我们搜索其中包括k(kn)个特征的子集来改善机器学习流水线的性能。
粗略地说,特征选择技术可以分为以下三类:
过滤:
过滤技术对特征进行预处理,以除去那些不太可能对模型有用处的特征。例如,我们可以计算出每个特征与响应变量之间的相关性或互信息,然后过滤掉那些在某个阈值之下的特征。过滤技术的成本比下面描述的打包技术低廉得多,但它们没有考虑我们要使用的模型,因此,它们有可能无法为模型选择出正确的特征。使用预过滤技术时需要谨慎,防止不经意地删除有用特征。
打包方法:
这些技术的成本非常高昂,但是可以试验特征的各个子集,这意味着我们不会意外地删除那些本身不提供什么信息但和其他特征组合起来却非常有用的特征。打包方法将模型视为一个能对推荐的特征子集给出合理评分的黑盒子。它们使用另外一种方法迭代地对特征子集进行优化。
嵌入式方法:
嵌入式方法将特征选择整合为模型训练过程的一部分,它不如打包方法强大,但成本也远不如打包方法那么高。与过滤技术相比,嵌入式方法可以选择出特别适合某种模型的特征。从这个意义上说,嵌入式方法在计算成本和结果质量之间实现了某种平衡。
选用正确的特征选择方法,一般建议:
如果特征是分类的,那么从SelectKBest开始,用卡方或基于树的选择器。
如果特征基本是定量的,一般用线性模型和基于相关性的选择器效果更好。
如果二元分类问题,考虑使用SelectFromModel和SVC,因为SVC会查找优化二元分类任务的系数。
在手动选择前,探索性分析会很有益处,不能低估领域知识的重要性。
特征转换方法可以用每个列中的特征创建超级列(super-column),所以不需要创建很多新特征就可以捕获所有潜在的特征交互。因为特征转换算法涉及矩阵和线性代数,所以不会创造出比原有列更多的列,而且仍能提取出原始列中的结构。
与特征选择不同的是,特征选择仅限于从原始列中选择特征;特征转换算法则将原始列组合起来,从而创建可以更好地描述数据的特征。
主成分分析
主成分分析(PCA,principalcomponentsanalysis)是将有多个相关特征的数据集投影到相关特征较少的坐标系上。这些新的、不相关的特征(超级列)叫主成分。主成分能替代原始特征空间的坐标系,需要的特征少,捕捉的变化多。
换句话说,PCA的目标是识别数据集中的模式和潜在结构,以创建新的特征,而非使用原始特征。和特征选择类似,如果原始数据是n×d大小(n是观察值数,d是原始的特征数),那么我们会将这个数据集投影到n×k(kd)的矩阵上。
一般,PCA分为4个步骤:
创建数据集的协方差矩阵;
计算协方差矩阵的特征值;
降序排列特征值,保留前k个特征值;
用保留的特征向量转换新的数据点。
线性判别分析
线性判别分析(LDA,lieardiscriminantanalysis)是特征变换算法,一般用作分类流水线的预处理步骤。和PCA一样,LDA的目标是提取一个新的坐标系,将原始数据集投影到一个低维空间中。
LDA和PCA的主要区别在于,LDA不会专注于数据的方差,而是优化低维空间,已获得最佳的类别可分性。
LDA分为5个步骤:
计算每个类别的均值向量;
计算类内和类间的散布矩阵;
计算特征值和特征向量;
降序排列特征值,保留前k个特征向量;
使用前几个特征向量将数据投影到新空间。
这个案例研究的是scikit-learn中Wild数据集里的面部数据集。这个数据集叫作JAFFE,包括一些面部照片以及适当的表情标签。我们的任务是面部识别,即进行有监督的机器学习,预测图像中人物的表情。
首先加载数据集,导入用于绘制数据的包。在JupyterNotebook的最上方尽量放置所有导入语句。
特征缩放模块的特征选择模块_selectionimporttrain_test_split,GridSearchCV,cross_val_score机器学习模块_
然后可以开始了!步骤如下所示。
(1)首先加载数据集:
importosdata_path='F:\python\locust\.idea\dictionaries\jaffe'data_dir_list=(data_path)img_rows=256img_cols=256num_channel=1num_epoch=10img_data_list=[]importcv2fordatasetindata_dir_list:img_list=(data_path+'/'+dataset)print('Loadedtheimagesofdataset-'+'{}\n'.format(dataset))forimginimg_list:input_img=(data_path+'/'+dataset+'/'+img)input_img=(input_img,_BGR2GRAY)input_img_resize=(input_img,(128,128))img_data_(input_img_resize)img_data=(img_data_list)img_data=img_('float32')img_data=img_data/255img_
(2)检查图像数组,输出图像大小:
n_samples,h,w=img__samples,h,w
(213,128,128)
一共有213个样本(图像),高度和宽度都是128像素。
(3)接着设置流水线的x和y变量:
绘制其中一张脸(X[6].reshape((h,w)),cmap=)print(Y[0])()给出的标签是:
'angry'
该图像如下所示。
我们在缩放后重新绘制一次图像:
预测表情target_names=labels_textn_samples=[0]n_classes=len(names)print("Totaldatasetsize:")print("n_samples:%d"%n_samples)print("n_features:%d"%n_features)print("n_classes:%d"%n_classes)输出是:
Totaldatasetsize:n_samples:213n_features:16384n_classes:73.应用面部识别现在可以开始构建机器学习流水线来创建面部识别模型了。
(1)首先创建训练集和测试集,对数据进行分割:
PCA实例化pca=PCA(n_components=50,whiten=True)在训练集上拟合流水线(X_train)碎石图((extracted__variance_ratio_))得到的图像如下图所示。
可以看出,30个主成分就可以表示90%以上的方差,和原始的特征数量相比很可观。
(6)可以创建函数,绘制PCA的主成分:
comp=extracted__image_shape=(h,w)defplot_gallery(title,images,n_col,n_row):(figsize=(2.*n_col,2.26*n_row))(title,size=16)fori,compinenumerate(images):(n_row,n_col,i+1)vmax=max((),-())((image_shape),cmap=,vmin=-vmax,vmax=vmax)(())(())_adjust(0.01,0.05,0.99,0.93,0.04,0.)()(7)现在可以调用plot_gallery函数:
plot_gallery('PCAcomponenets',comp[:16],4,4)输出如下图所示。
可以看见每行每列的PCA主成分了!这些特征脸(eigenface)是PCA模块发现的人脸特征。
每个主成分都包括了可以区分不同人脸的重要信息,例如:
第四行第一列的特征脸好像突出了腮部表情;
第二行第三列的特征脸好像显示了嘴部的变化。
当然,不同的面部数据集会输出不同的特征脸。接下来创建的函数可以更清晰地显示混淆矩阵,包括热标签和归一化选项:
importitertoolsdefplot_confusion_matrix(cm,classes,normalize=False,title='Confusionmatrix',cmap=):(cm,interpolation='nearest',cmap=cmap)(title)()tick_marks=(len(classes))(tick_marks,classes,rotation=45)(tick_marks,classes)thresh=()/2.fori,(range([0]),range([1])):(j,i,cm[i,j],horizontalalignment="center",color="white"ifcm[i,j]threshelse"black")('Truelabel')('Predictedlabel')现在不使用PCA也可以看见差异。我们查看一下模型的准确率:
用测试集进行预测y_pred=best_(X_test)print(accuracy_score(y_pred,y_test),"Accuracyscoreforbestestimator")print(plot_confusion_matrix(confusion_matrix(y_test,y_pred,labels=range(n_classes)),target_names))print(round((time()-t0),1),"secondstogridsearchandpredictthetestset")输出如下:
0.7592592592592593在只使用原始像素的情况下,我们的线性模型可以达到75.9%的准确率。下面看看应用PCA
后会不会有所不同,把主成分数量设置成200:
用测试集进行预测y_pred=best_(X_test)print(accuracy_score(y_pred,y_test),"Accuracyscoreforbestestimator")print(classification_report(y_test,y_pred,target_names=target_names))print(plot_confusion_matrix(confusion_matrix(y_test,y_pred,labels=range(n_classes)),target_names))print(round((time()-t0),1),"secondstogridsearchandpredictthetestset")应用PCA后的输出如下:
0.6666666666666666有意思!可以看到,准确率下降到了66.7%。
现在做一个网格搜索,寻找最佳模型和准确率。首先创建一个执行网格搜索的函数,它会输
出准确率、参数、平均拟合时间和平均分类时间。函数的创建方法如下:
defget_best_model_and_accuracy(model,params,X,y):grid=GridSearchCV(model,搜索的参数error_score=0.)拟合模型和参数得到最佳准确率的最佳参数print("BestParameters:{}".format(_params_))预测的平均时间(秒)网格搜索的大型流水线face_params={'logistic__C':[1e-2,1e-1,1e0,1e1,1e2],'preprocessing__pca__n_components':[100,150,200,250,300],'preprocessing__pca__whiten':[True,False],'preprocessing__lda__n_components':range(1,7){text-decoration:none;outline:none;display:block;width:100%;height:100%;}e8e8e8;position:relative;padding:20px94px12px180px;overflow:hidden;}.pgc-card::after{content:"";display:block;border-left:1pxsolid222;line-height:1;font-weight:bold;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.pgc-content-desc{font-size:14px;color:f85959;padding-top:18px;line-height:1em;}.pgc-card-buy{width:75px;position:absolute;right:0;top:50px;color:{text-decoration:none;outline:none;display:block;width:100%;height:100%;}e8e8e8;position:relative;padding:20px94px12px180px;overflow:hidden;}.pgc-card::after{content:"";display:block;border-left:1pxsolid222;line-height:1;font-weight:bold;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.pgc-content-desc{font-size:14px;color:f85959;padding-top:18px;line-height:1em;}.pgc-card-buy{width:75px;position:absolute;right:0;top:50px;color:#406599;font-size:14px;text-align:center;}.pgc-buy-text{padding-top:10px;}.pgc-icon-buy{height:23px;width:20px;display:inline-block;background:url();}精通特征工程
¥29.5
购买
版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。