看了很多高深的算法之后,感觉还是看不懂哦,今天又来代大家复习基本功,一个是特征工程,另一个是特征选择。都是两个非常非常重要的东西,先定两个基调,所谓的特征工程就是数据预处理,所谓的特征选择就是变量筛选,这样大家就不觉得这么难了。
Feature engineering improves the performance of the machine learning model by selecting the right features for the model and preparing the features in a way that is suitable for the machine learning model.
并且也可以将特征选择看作是特征工程的一部分,概念上不纠结,知道是这么回事就好,同时特征工程的整个过程也要结合具体问题具体分析,需要经验,需要背景知识,整个过程也是没有金标准的。可以说这是一项科学与艺术相结合的工作。
特征工程又称特征提取或特征发现是使用领域知识从原始数据中提取特征的过程。这就涉及到一系列的操作,主要的目的就是将原始数据处理成可以直接喂给算法的数据特征。比如有些算法要求数据不能有缺失,你就得处理缺失值吧,比如有些算法需要正态数据,你就得进行数据转换吧,这些都是特征工程。
特征工程具体的操作包括
基础的操作:像One-hot encoding(哑变量转换),log转换,Outlier handling离群值处理,简单插补,Binning连续变量分箱都暂时略过(之后给大家写)。今天我们看下面的内容
1.插补
随机森林插补缺失应该是大家的首选方法,这个方法既可以处理连续特征又可以处理分类特征,而且对离群值和非线性数据的适合性都较好,其大概流程如下:
首先是将缺失的连续值用变量均值,分类值用众数插补好,然后将数据切位2部分,一部分是完整数据集(training set),一部分是插补后的数据集 (prediction set),然后用完整数据集训练随机森林模型,在插补后的数据集中更新缺失值,这样迭代,直到插补值稳定或者达到最大迭代次数。代码示例如下:
imp_train_X <- missForest(train_X)$ximp
KNN插补的思路是用缺失值附近(Euclidean distance)的K个值的均值将缺失插补上,只需要用kNN函数就可以实现,其示例如下,大家应该一读就知道这个方法只适合连续变量:
air_imp_knn <- kNN(airquality, k = 5, variable = "Ozone")
n_miss(air_imp_knn$Ozone)
3.特征放缩
Min Max Scaler:MinMaxScaler method is one of the methods of standardizing the data where values are made to lie between 0 and 1
Normalization : All values are scaled in a specified range between 0 and 1 via normalisation (or min-max normalisation)
Standardization: Standardization (also known as z-score normalisation) is the process of scaling values while accounting for standard deviation
https://www.machinelearningplus.com/machine-learning/feature-selection/#6recursivefeatureeliminationrfe
https://towardsdatascience.com/effective-feature-selection-recursive-feature-elimination-using-r-148ff998e4f7
正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消转存失败重新上传取消
特征选择的方法可以分为三个大类Filter Methods, Wrapper Methods and Embedded Methods.
Filter Methods就是我们平常论文中常用的单变量筛选方法ANOVA, Pearson Correlation, Chi-Square.--单因素分析有意义的时候纳入模型就是说的这个,这一部分有一个方法叫做“低信息特征过滤”,就是说有些变量基本上没有变异,全部观测都是取的同一个值,这样的特征其实是没有用的,需要过滤出去,此时用到的方法叫做nearZeroVar(),或者可以用preProcess()函数将method参数设置成“nzv”也是可以的。这个方法应该是第一步使用。
Wrapper Methods指的是依靠模型表现来筛选变量,将筛选过程包装在建模过程里面,从而看看到底用哪些变量可以使模型表现更加好。
Stepwise selection
逐步法的概念统计书上将回归的章节都会有提到,要么就是在spss实操的书中会有的,包括前进和后退以及逐步3中方法。
这儿要提醒大家的是前进发和逐步法都是可以用在高维数据中的(比如你的变量比观测多都可以用),但是后退法不行
lasso回归的基本思路是给回归方程加一个惩罚项,惩罚作用和系数大小成比例,这么一来将起到的作用就是部分的原来回归系数比较小的特征就给惩罚没了。从而达到了减少特征的作用。在lasso回归中有一个超参λ,越大惩罚越强,越小越弱:
实操:
总共有62个特征,然后我的结局是同样长度的一个2分类的向量,此时我要进行一个lasso回归筛选一下到底取哪些特征可以更好地预测我的结局,我可以写出如下代码:
cv.lasso <- cv.glmnet(x, y, family='binomial', alpha=1, parallel=TRUE, standardize=TRUE, type.measure='auc')
运行代码后可以出图如下:
图的横轴是lasso的参数,纵轴是模型的AUC,图中最上面的一排数值是对于的特征个数,可以看到当我们的特征是21个的时候模型的AUC其实是相对较高的,所以其实我们并不需要将所有的特征都纳入到模型中。
图中还有2条虚线,左边的这一条
递归特征消除Recursive feature elimination (RFE)递归特征消除的主要思想是反复的构建模型(如SVM或者回归模型)然后选出最好的(或者最差的)的特征,其基本原理如下:
正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消转存失败重新上传取消
就是首先用所有的特征来拟合模型,然后对特征进行排序,去掉最垃圾的特征后再次拟合模型,并对模型进行排序,再去掉最垃圾的特征,这样循环下来,模型表现最好的时候对应的特征就是最后留下的特征。和倒推法筛选变量的思想有点类似的。
之前有给大家写过模型外部验证的重要性,思考这么一个问题,在使用rfe的时候决定特征的标准依然是模型的表现,我们知道模型表现是受样本影响的,所以整个的rfe过程依然需要在交叉验证中考虑:
正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消转存失败重新上传取消
就是我们得在交叉验证中去考虑模型表现,什么意思呢,就是将整个rfe过程封装在resampling中,这样最大限度避免模型表现的随机性。
这个思想就很好很容易满足
在用这个方法的时候有
我现在有数据如下:
正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消转存失败重新上传取消
这个数据集有303个观测,14个变量,其中一个是我们要预测的标签。所以其实我们是有13个可用的特征的,我现在就用递归特征消除看看,多少个特征适合模型。
首先是数据的预处理,运行下面代码可以查看整个数据的情况
plot_intro(data)
plot_correlation(data)
正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消转存失败重新上传取消
正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消转存失败重新上传取消
可以看到数据是完整没有缺失的,也不存在完全的共线性,所以我们就直接往下走了,做rfe需要用到的函数为rfe,其需要的参数如下:
正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消转存失败重新上传取消
其中有两个参数比较重要,一个是需要参数的个数,另一个是选择参数的算法。
算法是在rfeControl参数中设置的,我们可以设置的参数算法包括functions #functions选择用什么样的模型进行自变量排序,可以选择的有rfFuncs(随机森林),lmFuncs(线性回归),nbFuncs(朴素贝叶斯,只能用于分类),treebagFuncs(装袋决策树),ldaFuncs(只能用于分类),lrFuncs,caretFuncs。
使用rfe会出现特征的重要性,这个重要性是什么意思呢?怎么来的?
The importance calculations can be model based (e.g., the random forest importance criterion) or using a more general approach that is independent of the full model.
接下来给大家写逐步法筛选变量的操作,我现在有数据如下:
正在上传…重新上传取消正在上传…重新上传取消正在上传…重新上传取消转存失败重新上传取消
我要预测的变量是Fertility,其余全是我的备选特征,此时使用逐步法的代码如下:
train.control <- trainControl(method = "cv", number = 10) # Train the model step.model <- train(Fertility ~., data = swiss, method = "leapBackward", tuneGrid = data.frame(nvmax = 1:5), trControl = train.control ) step.model$results