我是机器学习的新手,请多包涵,谢谢!
我有三个问题要问,所以在回答时提到问题编号会很有帮助。
我想在应用机器学习算法之前对我的训练数据进行特征选择。我将使用相同的数据集在许多不同的机器学习算法上运行,以决定哪种算法最佳,因此,如果我能只进行一次特征选择并将新数据集传递给各种算法,将会更加高效。
注意:我使用的是Python3进行编程,并且我将使用BorutaPy进行特征选择。[https://github.com/scikit-learn-contrib/boruta_py]
问题1)
在进行特征选择之前,我需要知道我将使用什么算法吗?或者我可以先进行特征选择,然后再使用任何算法,即特征选择是否依赖于所使用的算法类型?
问题2)
我可以对回归和分类问题使用相同的特征选择方法吗?
问题3)
除了上述提到的方法,对于回归问题使用正则化,对于分类问题进行特征选择是否是最佳选择?
谢谢你!
回答:
我将回答你的问题1和2,问题3留给其他人。我将使用R来做一些示例。我知道你在使用Python,但对你问题的回答并不依赖于具体的实现方式。我希望你能将这些示例翻译成Python,或者只是看一下数学原理,了解发生了什么。
问题1:特征选择依赖于所使用的算法。
首先,这里有一些数据。
set.seed(1234)y = runif(1000)x1 = (1-y)^(1/6)x2 = y + rnorm(1000, 0, 0.1)
这里,y正好等于1 – x1的六次方,而y等于x2加上一些噪声。以下是帮助你看到这一点的图表。
我们想用x1或x2来预测y。哪一个更好?首先让我们使用线性模型。
LM1 = lm(y ~ x1)LM2 = lm(y ~ x2)summary(LM1)$r.squared[1] 0.8454181summary(LM2)$r.squared[1] 0.9022076
使用x2预测y的模型具有更好的R²,因此x2比x1更好。
现在让我们使用kNN回归(k=1)。
library(FNN)NN1 = knn.reg(train=x1, y=y)NN1$R2Pred[1] 0.9999928NN2 = knn.reg(train=x2, y=y)NN2$R2Pred[1] 0.8728359
使用x1的模型有更好的R²,几乎完美。最佳变量取决于算法。
问题2:回归和分类可能需要不同的特征。
这要简单得多。如果你在做回归,你是在预测一个数值量。如果你在做分类,你是在预测一个分类变量 – 所以这里的任何比较都是关于预测不同的y值。当然,可以让x1与y1相关但不与y2相关,而x2与y2相关但不与y1相关。
一个简单的例子是:
x1 = runif(1000)x2 = runif(1000)y1 = x1y2 = ifelse(x2<0.5, 1, 2)
y1等于x1,因此x1是y1的完美预测因子。但x2是随机的,与y1没有关系,因此是y1的较差预测因子。相反,y2在x2小于0.5时为1,否则为2。x2是y2的完美预测因子。但x1是随机的,与y2没有关系,因此是y2的较差预测因子。
更一般地说,最佳预测因子显然取决于你试图预测什么。如果你在预测两个不同的变量,没有理由认为同一组预测因子对两者都是最佳的。
希望这对你有帮助。