Advertisement

Feature Selection: Mutual Information Criteria, Wrappe

阅读量:

作者:禅与计算机程序设计艺术

1.简介

特征选择(Feature selection)是机器学习中一种核心数据处理技术。它不仅有助于降低高维数据的空间维度和计算复杂度,并能显著提升模型的泛化能力。在机器学习领域内,特征选择已成为一个重要的研究热点。其具体实施途径主要包括过滤法、包裹法和嵌入法等三种主要方式。

  • 过滤法(Filter): 基于过滤法对一些无关紧要或冗余的特征求剔除处理后提升了模型的简洁性。包括但不限于:基于互信息的方法(Mutual Information Approach)、χ²检验(Chi-Square Test)、卡方检验(Chi-Square Test for Independence)、以及信息增益法(Information Gain Criterion)等。
  • 包裹法(Wrapper): 在实现过程中与模型构建同步推进,在实现过程中与建模同步推进的过程中采用递归的方式去除冗余特征求得最优特征集合。包裹式方法包括:贝叶斯方法(Bayesian Methods)、逐步回归分析(Stepwise Regression Analysis)、以及Recursive Feature Elimination(RFE)等。
  • 插入式方法(Embedded): 将特征求解作为一个优化过程的一部分自然嵌入到模型构建过程中无需人工干预即可完成训练过程的一种高效策略. 插入式方法包括Lasso回归分析(Elastic Net)支持向量机(Support Vector Machine)主成分分析(Principal Component Analysis, PCA)以及变异数分析(Analysis of Variance, ANOVA)等.

本文旨在探讨三大类特征选择方法:互信息(Mutual Information, MI)相关技术、包裹器(wrapper)基模型以及嵌入式(embedding)技术。在阐述每种方法的理论基础与核心原理之后,请提供具体的数学表达式和算法实现步骤以助于深入理解这些技术的本质。

2.基本概念术语说明

2.1 互信息 (Mutual information)

互信息用于表征两个随机变量之间的关联程度。它通过量化的方式反映两个变量间共享的信息量。互信息的计算公式如下:I(X;Y) = -\sum p(x)\log_2\left(\frac{p(xy)}{p(x)p(y)}\right) 其中XY为所考察的两个随机变量,在此公式中p(x)p(y)分别代表XY的概率分布函数而p(xy)则为联合概率分布函数。

在本文中仅限于探讨二元随机变量之间的互信息关系。其表示为P(A,B),其中A和B只能取0或1这两个值。
我们能证明的是:如果两个随机变量X和Y相互独立,则互信息I(X;Y)等于H(X)+H(Y)-H(X,Y)。

2.2 包装器方法 (Wrapper methods)

包装器方法通常在建模过程中采用启发式的策略,在一个包含大量初始特征的集合中进行迭代筛选,在每次迭代中去除对模型贡献最小的特征直至达到设定的目标阈值后停止;这表明该方法能够系统地提取一组与目标变量高度相关的候选特征;其中具体实施方式包括递归消除算法(Recursive feature elimination, RFE),贝叶斯线性判别模型(Bayesian linear discriminant analysis, BLDA),以及主成分分析模型(Principal component analysis, PCA)。

2.3 嵌入式方法 (Embedded methods)

嵌入式方法主要基于机器学习模型的内部结构或参数来调节特征选择的过程。这些技术通过动态调整所包含的特征数量来影响模型在训练和测试阶段的表现。常见的嵌入式方法包括最小角回归(LASSO)、弹性网(Elastic Net)、主成分分析(PCA)以及方差分析(ANOVA)等。

3.核心算法原理及具体操作步骤

3.1 基于互信息的特征选择方法

3.1.1 互信息公式推导及样例

互信息公式可用于评估两个随机变量之间的关联性,并能指导我们筛选出那些具有重要性的变量。其形式为:I(X;Y)=−∑p(x)log_2[p(xy)/(p(x)p(y))]其中,X和Y表示两个随机变量,p(x)、p(y)分别代表X和Y的概率分布,p(xy)则表示X与Y联合发生的概率

我们用一个罕见病群体来举例说明:假设有a组和b组的患者各自表现出某种特征,并且其中c组患者同时表现出这两种特征。基于这三种表现形式,我们需要探究它们之间的差异性原因。

我们先假设三个变量的联合概率分布为: p(a,b,c)=p(a|bc)p(b|ac)p(c)

可以看出, 仅当两个生长痕迹同时呈现时, 第三个生长痕迹才会随之发生变化. 因此, p(abc)= p(ab)⋅ p(c), 并由此可得概率分布 p(a)、 p(b)、 p(c) 的期望值即为 p(a)/ p(abc), p(b)/ p(abc).

定义X为第一组(其第一个特征显示为a)的个体中同时具备特征b的个体数量占比;同样地,定义Y为第二组(其第二个特征显示为b)的个体中同时具备特征a的个体数量占比;而Z则代表多组中同时表现出特征a和特征b的个体数量占比。

进而可以得出各概率变量的期望值: E(X) = \frac{P(ab,c)b}{P(abc)}, E(Y) = \frac{P(ac,c)a}{P(abc)}, E(Z) = P(bc)。随后,则可计算出各概率变量之间的协方差: Cov(X,Y) = \sum_{xyz} P(xyz)(X - EX)^T(Y - EY), Cov(X,Z) = \sum_{xyz} P(xyz)(X - EX)^T(Z - EZ), Cov(Y,Z) = \sum_{xyz} P(xyz)(Y - EY)^T(Z - EZ)

按照定义, 其协方差矩阵为对称正定, 由此可知相关系数矩阵可被计算如下:
corr(X,Y)=ΣP(XYZ)[(X−E[X])(Y−E[Y])]除以各自方差的平方根乘积,
即 corr(X,Z)=ΣPXYZ[(X−EX)(Z−EZ)]/(σ_X·σ_Z),
同样地, corr(Y,Z)=ΣPXYZ[(Y−E[Y])(Z−E[Z})]/(σ_Y·σ_Z)

观察到,在统计学分析中,当corr(X,Y)大于零时表明X与Y之间存在显著的正向关联关系;而当corr(X,Z)小于零时,则显示X与Z之间存在显著的负向关联关系。进一步分析发现,在这种情况下,变量之间的相互作用呈现出一定的不对称性:具体而言,在其他条件不变的情况下,变量Y对其他变量的影响程度相对较低

综合分析表明, 为了确定哪些特征对目标变量具有重要影响, 我们可以通过建立一个特征重要性评估模型, 系统地筛选出与目标变量高度相关的特征维度, 并进一步优化模型性能和数据处理效率。

3.1.2 使用互信息进行特征选择

Mutual information serves as a metric for assessing the degree of dependence between two variables. It measures the amount of information obtained across one variable by observing another. A higher value of mutual information indicates a stronger relationship between the variables involved.

由于互信息仅能衡量两个变量之间的相关性,并不能辨别它们之间所有可能存在的联系;鉴于在处理多维数据时需进行有效的特征选择,在此情况下仅靠互信息难以达到理想的效果;因此建议将其与其他方法相结合以提高分析效率和准确性。具体流程如下所述:

将训练数据集划分为两部分:分别作为训练子集和验证子集,并用于构建和优化分类模型的基础。通过训练子集来拟合如决策树模型或逻辑回归模型等分类器。基于该分类器的评估指标(例如AUC值),筛选出具有重要判别能力的特征变量。以筛选出的重要特征为基础构建另一个分类器。评估该新构建分类器的表现,并对其进行参数优化。

3.2 基于包装器方法的特征选择方法

3.2.1 递归消除法 (Recursive feature elimination, RFE)

RFE是一种筛选器方法。它首先选择所有的原始特征,并按照一定的规则逐步剔除部分不重要的特征直至获得最优子集。具体而言,在每一步中算法会移除当前认为对预测结果影响最小的一个或多个变量,并通过交叉验证的方式评估其对预测性能的影响程度。如果发现某个被剔除的变量在交叉验证中表现出良好的预测能力,则会将其重新纳入候选集合中进行进一步优化;反之,则直接舍弃该变量不再参与后续的选择过程。
这一过程反复迭代地进行下去直至所有候选变量均被检验完毕。

最初由《机器学习》教科书西瓜书提出的一种贪心方法旨在选择最优特征进行逐步移除。然而,在面对高维数据时这一贪心方法往往效率低下。为了改进这一不足,在RFE中针对上述问题提出了一个解决方案——基于递归特征消除(Recursive feature elimination, RFECV)。该方法通过系统性地剔除对模型影响较小的特征从而避免了传统特征组合带来的低效问题。

RFE的迭代过程可以表示如下:

确定初始参数设置θ₀= (α₁, α₂,…, αₙ),其中αᵢ代表第i个超参数。
按照预设的学习率衰减策略逐步更新学习率γ_t= γ/(1+t),其中t为迭代次数。
通过交叉验证评估当前超参数组合下的模型性能P_t= evaluate(θ_t)。
重复上述过程直至达到预设的最大迭代次数T或满足性能收敛条件ΔP < ε。

3.2.2 贝叶斯线性判别分析 (Bayesian linear discriminant analysis, BLDA)

BLDA属于一种包络技术,在其运作机制中通过按类别排序训练样本来实现。随后系统会为每个分类别独立地建立相应的模型,并最终筛选出最具有代表性的特征集合。

BLDA基于Naive Bayes方法进行分析,在这个过程中,首先假设每个特征都是条件独立的;接着对各类样本数量进行平滑处理;最后计算分类权重。

BLDA的迭代过程可以表示如下:

通过排序训练集可以获取每个类别对应的先验概率。每个类别各自对应一个独立的模型构建过程。在每个类别中选择能显著提升当前模型性能的关键特征。当无任何特征能进一步提高模型性能时,则结束过程并输出最终选定的特征集合。

3.2.3 主成分分析 (Principal Component Analysis, PCA)

Principal Component Analysis (PCA) is also a feature selector method. It selects features by maximizing the projection variance. It first centers the data, then calculates the covariance matrix of the centered data. This yields the principal component vector corresponding to the largest singular value. It then constructs a new coordinate system using these principal component vectors and projects the original coordinate system onto this new coordinate system. In the end, only the feature with the smallest projection error is retained.

PCA的迭代过程可以表示如下:

  1. 实施数据归一化处理。
  2. 计算得到协方差矩阵Σ等于样本数量分之一乘以X转置与X的点积。
  3. 通过计算得出协方差矩阵Σ的所有特征值λ及其对应的特征向量v。
  4. 其投影误差最小化问题对应于找到使得||X*v_j - Y||²达到最小的那个索引j。
  5. 选择具有最小投影误差的前k个主成分,并构建k维的新特征空间。

3.2.4 分析相关系数法 (ANOVA method)

研究相关性分析法(ANOVA method)是一种筛选方法。该方法可对多元数据的正确性进行检验。它计算出各个样本群体的平均值和方差,并对它们之间的关系进行比较。接着比较了组间差异与组内差异是否存在显著差别。如果确实存在显著差别,则表明该数据具有相关性

ANOVA的迭代过程可以表示如下:

  1. 将训练集进行排序处理后,在获得各类别的数据分布情况的基础上,从而获得各类别对应的先验概率信息。
  2. 对于每一类别而言,在统计学分析过程中会对该类别数据整体水平进行度量计算,并最终求得其总体均值μ。
  3. 在数据预处理阶段中,则会针对每个数据样本分别计算其各项指标的具体数值表现情况,并得出相应的统计参数结果。
  4. 在深入分析阶段中,则会对不同组别之间的变异性与内部一致性之间的联系展开系统性研究。
  5. 最终会对所有候选特征进行综合评估筛选,在此过程中将那些在不同类别中表现出显著差异的关键特征予以保留;而对于那些在各类别中变化幅度较小、不具备明显区分度的关键特征项则予以剔除。

3.3 基于嵌入式方法的特征选择方法

3.3.1 Lasso

Lasso遵循着以L1范数为基础而形成的特性发展而成的一种线性模型,在监督学习算法中被应用。它的主要目标是识别出最少数量的关键变量,并且在这一过程中尽可能地减少不必要的复杂度。为了实现这一目的,该方法会施加一种对参数绝对值进行惩罚的方式以减少其影响力。优化函数的形式为:J(λ)=MSE + λsum(|w_i|)

其中,λ>0表示正则化项的强度,MSE表示模型的均方误差,w_i表示模型的参数。

随着λ值向零趋近的过程中,在这种情况下(即当λ接近零时),模型参数趋向于零。这将导致选择某些特定的特征而不影响其余的一些特性。然而,在这种情况下(即当λ非常大的时候),这些参数会达到极高的数值水平。此时系统会根据输入数据的变化做出反应,并放弃考虑其他可能的特征。

Lasso的迭代过程可以表示如下:

  1. 初始化参数w。
  2. 更新参数w,直到收敛或满足指定精度。

3.3.2 Elastic Net

弹性网方法是一种由L1范数与L2范数组成的线性模型;它既施加了绝对值大小的变化幅度作为惩罚项又施加了相对变化幅度作为惩罚项;其优化目标函数为:J(\lambda)=MSE + r\lambda\sum|w_i| + (1−r)\lambda\sum w_i^2

其中,r表示L1与L2的权重,当r=1时,等价于Lasso;当r=0时,等价于Ridge。

Elastic Net的迭代过程可以表示如下:

  1. 初始化参数w。
  2. 更新参数w,直到收敛或满足指定精度。

3.3.3 Principal Components Analysis (PCA)

该算法属于无监督学习范畴,并旨在通过降维技术将高维数据转换为低维形式。该方法选取一组新的正交基底向量,在线性变换后能最大限度地提高各主成分所携带的信息量。其优化目标函数定义如下:J(φ)=∑((X−\tilde{X})φ^T(X−\tilde{X})) ,其中φ代表用于实现降维的基向量组

PCA的迭代过程可以表示如下:

  1. 实施标准化处理。
  2. 协方差矩阵Σ被计算为样本数量倒数乘以X转置与X的乘积。
  3. 计算得出Σ的所有特征值及其对应的特征向量v。
  4. 随后按照降序排列后的顺序选择前n个最大值,并构建相应的n维子空间。

3.3.4 ANOVA

ANOVA是一种无监督学习方法,在多元数据分析中用于检验或分析多个变量间的相关性问题。其优化目标函数可表示为:
J(ω) = Σ[(y_ij - μ_j)^2]/σ_j² + g*(1 - ω²)/(n - g - 1)
其中,
y_ij表示第i个样本在第j组的观测值,
μ_j表示第j组的均值,
σ_j²表示第j组的方差,
g表示总共有多少组,
n表示总的样本数量。

ANOVA的迭代过程可以表示如下:

  1. 将训练集划分为若干子集用于后续分析。
  2. 计算所有样本数据的平均值ȳ。
  3. 分别计算各分组样本的平均数及其标准差。
  4. 分析不同类别间的变异性与内部一致性之间的联系。
  5. 选择表现出明显区别的关键指标并剔除无明显影响的因素。

4.代码实例及解释说明

下面,我给出使用R语言实现PCA、RFE、Lasso、Elastic Net、BLDA、ANOVA方法的代码示例。

4.1 使用PCA进行特征选择

复制代码
    library(caret) # install.packages("caret") if not installed
    
    data(iris)
    set.seed(1)
    trainIndex <- createDataPartition(iris$Species, p =.7, list = FALSE)
    trainSet <- iris[-trainIndex, ]
    testSet <- iris[trainIndex, ]
    
    preProcessSteps <- preProcess(trainSet[, -5], method = c('center','scale'))
    trainSetProcessed <- predict(preProcessSteps, trainSet[, -5])
    testSetProcessed <- predict(preProcessSteps, testSet[, -5])
    
    pcaFit <- prcomp(trainSetProcessed[, 1:4], retx = TRUE, center = TRUE, scale = TRUE)
    explained_variance <- pcaFit$sdev^2 / sum(pcaFit$sdev^2)
    featuresToKeep <- which(explained_variance >.9)
    trainSetPCA <- data.frame(trainSetProcessed[, featuresToKeep])
    testSetPCA <- data.frame(testSetProcessed[, featuresToKeep])
    
    # Train a Logistic Regression model on the PCA'd dataset
    lrFit <- train(Species ~., data = trainSetPCA, trControl = trainControl(method = "cv", number = 10))
    predictions <- predict(lrFit, newdata = testSetPCA)$class
    confusionMatrix(table(predictions, testSet$Species))
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

4.2 使用RFE进行特征选择

复制代码
    library(glmnet) # install.packages("glmnet") if not installed
    
    set.seed(1)
    trainIndex <- createDataPartition(iris$Species, p =.7, list = FALSE)
    trainSet <- iris[-trainIndex, ]
    testSet <- iris[trainIndex, ]
    
    formula <- as.formula(paste0('Species ~ ', paste(colnames(iris)[-5], collapse = '+')))
    model <- glmnet(as.matrix(trainSet[, -5]), trainSet$Species, alpha = 0)
    plot(model)
    
    rfeFit <- cv.glmnet(as.matrix(trainSet[, -5]), trainSet$Species, alpha = 0, nfolds = 10, type.measure ='mse')
    bestlambdaIndex <- which.min(rfeFit$cvm)
    bestlambdaValue <- rfeFit$lambda[bestlambdaIndex]
    selectedFeatures <- names(coef(model, s = bestlambdaIndex))[coef(model, s = bestlambdaIndex)!= 0]
    newFormula <- formula
    newFormula[[2]] <- paste0(newFormula[[2]],'- ', selectedFeatures[!grepl('+', selectedFeatures)], sep='')
    lmfit <- lm(newFormula, data = trainSet)
    summary(lmfit)
    
    testSetSelect <- testSet[, grepl(paste0("^(", paste(selectedFeatures, collapse = "|"), ")"), colnames(testSet))]
    lrFit <- train(Species ~., data = trainSet[, grepl(paste0("^(", paste(selectedFeatures, collapse = "|"), ")"), colnames(trainSet))], trControl = trainControl(method = "cv", number = 10))
    predictions <- predict(lrFit, newdata = testSetSelect)$class
    confusionMatrix(table(predictions, testSet$Species))
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

4.3 使用Lasso进行特征选择

复制代码
    library(glmnet) # install.packages("glmnet") if not installed
    
    set.seed(1)
    trainIndex <- createDataPartition(iris$Species, p =.7, list = FALSE)
    trainSet <- iris[-trainIndex, ]
    testSet <- iris[trainIndex, ]
    
    formula <- as.formula(paste0('Species ~ ', paste(colnames(iris)[-5], collapse = '+')))
    lassoFit <- cv.glmnet(as.matrix(trainSet[, -5]), trainSet$Species, alpha = 1, nfolds = 10, type.measure ='mse')
    bestlambdaIndex <- which.min(lassoFit$cvm)
    bestlambdaValue <- lassoFit$lambda[bestlambdaIndex]
    selectedFeatures <- names(coef(model, s = bestlambdaIndex))[coef(model, s = bestlambdaIndex)!= 0]
    newFormula <- formula
    newFormula[[2]] <- paste0(newFormula[[2]],'- ', selectedFeatures[!grepl('\+', selectedFeatures)], sep='')
    lmfit <- lm(newFormula, data = trainSet)
    summary(lmfit)
    
    testSetSelect <- testSet[, grepl(paste0("^(", paste(selectedFeatures, collapse = "|"), ")"), colnames(testSet))]
    lrFit <- train(Species ~., data = trainSet[, grepl(paste0("^(", paste(selectedFeatures, collapse = "|"), ")"), colnames(trainSet))], trControl = trainControl(method = "cv", number = 10))
    predictions <- predict(lrFit, newdata = testSetSelect)$class
    confusionMatrix(table(predictions, testSet$Species))
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

4.4 使用Elastic Net进行特征选择

复制代码
    library(glmnet) # install.packages("glmnet") if not installed
    
    set.seed(1)
    trainIndex <- createDataPartition(iris$Species, p =.7, list = FALSE)
    trainSet <- iris[-trainIndex, ]
    testSet <- iris[trainIndex, ]
    
    formula <- as.formula(paste0('Species ~ ', paste(colnames(iris)[-5], collapse = '+')))
    enetFit <- cv.glmnet(as.matrix(trainSet[, -5]), trainSet$Species, alpha = 0.5, nfolds = 10, type.measure ='mse')
    bestlambdaIndex <- which.min(enetFit$cvm)
    bestlambdaValue <- enetFit$lambda[bestlambdaIndex]
    selectedFeatures <- names(coef(model, s = bestlambdaIndex))[coef(model, s = bestlambdaIndex)!= 0]
    newFormula <- formula
    newFormula[[2]] <- paste0(newFormula[[2]],'- ', selectedFeatures[!grepl('\+', selectedFeatures)], sep='')
    lmfit <- lm(newFormula, data = trainSet)
    summary(lmfit)
    
    testSetSelect <- testSet[, grepl(paste0("^(", paste(selectedFeatures, collapse = "|"), ")"), colnames(testSet))]
    lrFit <- train(Species ~., data = trainSet[, grepl(paste0("^(", paste(selectedFeatures, collapse = "|"), ")"), colnames(trainSet))], trControl = trainControl(method = "cv", number = 10))
    predictions <- predict(lrFit, newdata = testSetSelect)$class
    confusionMatrix(table(predictions, testSet$Species))
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

4.5 使用BLDA进行特征选择

复制代码
    library(quanteda) # install.packages("quanteda") if not installed
    
    set.seed(1)
    trainIndex <- createDataPartition(iris$Species, p =.7, list = FALSE)
    trainSet <- iris[-trainIndex, ]
    testSet <- iris[trainIndex, ]
    
    trainSetqd <- corpus(VectorSource(trainSet[, -5]))
    trainLabels <- trainSet$Species
    trainSetqd$label <- factor(trainLabels)
    trainText <- textstat_term_count(trainSetqd)
    trainDocs <- dfm(trainText)
    trainMat <- matrix(trainDocs[, colSums(trainDocs) >= 5 & colSums(trainDocs) <= Inf], nrow = nrow(trainSet))
    docnames <- rownames(trainMat)
    trainLabelVec <- as.factor(trainLabels[docnames])
    trainModel <- lda(trainMat, trainLabelVec, K = length(unique(trainLabelVec)), control = list(alpha = 1, emmaxit = 100))
    
    trainDocTopicDist <- getDocumentTopicProbabilities(trainModel, trainMat)
    trainDocTopWords <- apply(trainDocTopicDist, 1, function(x) names(sort(-x)))
    trainDocWordCounts <- table(trainSetqd[docnames,]$word, by = docnames)
    trainFeatures <- merge(data.frame(words = names(trainDocWordCounts), freq = trainDocWordCounts), data.frame(topic = 1:10, word = unlist(trainDocTopWords))), by = "word"
    trainCounts <- trainFeatures %>% group_by(words) %>% summarise(freq_mean = mean(freq), freq_sd = sd(freq), topic = first(topic[which.max(x)]), top = min(order(x), na.last = NA) == 1)
    trainFiltered <- filter(trainCounts,!is.na(top))
    trainSelectedFeatures <- unique(trainFiltered$words[trainFiltered$top])
    trainSelectedDocTopics <- trainDocTopicDist[, match(trainSelectedFeatures, colnames(trainDocTopicDist))]
    trainSelectedDocTopics <- t(apply(trainSelectedDocTopics, 2, function(x) {
      x <- sort(-x)
      ranks <- rank(-x)
      propvec <- cumsum(ranks / sum(ranks))
      quantile(propvec, prob = seq(.1, 1, len = 10))
    }))
    trainSelectedDocTopics <- data.frame(t(trainSelectedDocTopics), words = rownames(trainSelectedDocTopics), stringsAsFactors = F)
    trainSelectedDocTopics <- merge(trainSelectedDocTopics, data.frame(words = unique(trainSelectedDocTopics$words)), by = "words", all.x = T)
    trainSelectedDocTopics$topic <- rownames(trainSelectedDocTopics)
    trainSelectedDocTopics$total <- rowSums(trainSelectedDocTopics[, 1:10])
    trainSelectedDocTopics$score <- with(trainSelectedDocTopics, total - rank(total))
    trainSelectedFeatures <- intersect(trainSelectedFeatures, rownames(subset(trainSelectedDocTopics, score < median(score))))
    trainSelectedDocTopics <- subset(trainSelectedDocTopics, words %in% trainSelectedFeatures)
    trainSelectedFeatures <- intersect(trainSelectedFeatures, rownames(subset(trainSelectedDocTopics, total > max(total) *.8)))
    trainSelectedFeatures
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

4.6 使用ANOVA进行特征选择

复制代码
    library(caret) # install.packages("caret") if not installed
    
    set.seed(1)
    trainIndex <- createDataPartition(iris$Species, p =.7, list = FALSE)
    trainSet <- iris[-trainIndex, ]
    testSet <- iris[trainIndex, ]
    
    anovafit <- aov(Petal.Width ~ Species + Sepal.Length + Petal.Length, data = trainSet)
    summary(anovafit)
    
    prRes <- prediction(anovafit, newdata = testSet)
    prResDf <- data.frame(confint(prRes))
    prResDf$lower <- round(prResDf$lower, 2)
    prResDf$upper <- round(prResDf$upper, 2)
    head(prResDf)
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

全部评论 (0)

还没有任何评论哟~