我想使用SVM
进行分类。在使用SVM
模型之前,如何对数据集中每列的特征进行归一化(或缩放)处理?
train <- read.csv("train.csv")test <- read.csv("test.csv")svm.fit=svm(as.factor(type)~ ., data=train, core="libsvm",kernel="linear",cross=10, probability=TRUE)
回答:
你可以使用sapply
中的scale
函数来实现:
scaleddf <- as.data.frame(sapply(train, function(i) if(is.numeric(i)) scale(i) else i))
如果你的数据中包含NaN
值或方差为0的变量,你可以在使用上述函数之前先处理并筛选原始数据集。
# 获取需要删除的变量向量dropVars <- sapply(train, function(i) { if((is.numeric(i) & !any(is.nan(i)) & sd(i) > 0) | is.factor(i) | is.character(i)) TRUE else FALSE })# 筛选测试集,删除不符合条件的列smallerdf <- test[, dropVars]
然后对smallerdf应用上述原始的sapply
函数