📜  R 编程中的特征工程(1)

📅  最后修改于: 2023-12-03 15:04:46.257000             🧑  作者: Mango

R 编程中的特征工程

特征工程是数据科学中的关键步骤之一,它涉及到数据预处理、特征选择、特征提取、降维等多个方面。特征工程的好坏往往决定了模型的效果和准确度。本文将介绍 R 编程中的特征工程,包括常见的数据清洗和特征处理方法,以及如何使用 R 语言实现。

数据清洗

数据清洗是一个数据科学家所必需的基本技能。它涉及到数据缺失值、异常值、重复值等问题的处理。

缺失值

缺失值是指在数据集中部分或全部变量值缺失的情况。缺失值的存在会影响模型的准确性。因此,在进行特征工程前,需要先处理缺失值。常用的缺失值处理方法有:

  • 删除缺失值:直接将缺失值所在的行或列删除。删除缺失值可能会导致数据量的减少,因此在删除前需要进行分析判断;
  • 插值法:通过已有数据的规律,对缺失值进行推断。常用的插值法有:平均插值法、最近邻插值法等;
  • 模型预测法:使用已有数据建立预测模型,对缺失部分进行预测,得到预测值。常用的模型包括:决策树、随机森林等。

在 R 中,可以使用以下代码实现缺失值的处理:

# 删除缺失值
newdf <- na.omit(df)

# 平均插值法
imputed_data <- mice(df, method = "mean")

# 决策树预测
library(rpart)
fit <- rpart(df$target ~ ., data = df)
predicted <- predict(fit, newdata = newdf)
异常值

异常值是指在数据集中存在的与其他值相比显著偏离的值。异常值的存在可能会影响模型的训练效果。处理异常值的方法如下:

  • 删除异常值:与处理缺失值相同,可以直接删除包含异常值的行或列;
  • 替换异常值:将异常值替换为平均值或中位数等;
  • 使用离群值检测算法:如箱线图、Z-score 等来检测并处理异常值。

在 R 中,可以使用以下代码实现异常值的处理:

# 删除异常值
df <- df[df$target <= 1000, ]

# 替换异常值
df[df > 1000] <- mean(df$target)

# 箱线图检测异常值
boxplot(df$target)
重复值

重复值是指在数据集中出现相同变量取值的情况。在特征工程中,需要将重复值去除,以避免对模型训练的干扰。可以使用以下代码实现重复值的处理:

# 去除重复值
newdf <- unique(df)
特征处理

特征处理是特征工程中最为重要的环节之一。它包括数据预处理、特征选择、特征提取、特征变换等多个方面。

数据预处理

数据预处理是指对原始数据进行转换、归一化等操作,以便在特征提取和特征选择时更加方便和准确。常用的数据预处理方法有:

  • 数据归一化:将数据缩放到固定区间内,如 [0,1] 区间、[-1,1] 区间等;
  • 数据标准化:将数据转换为均值为 0,方差为 1 的分布;
  • 数据转换:如对数转换、幂函数转换、平方根转换等。

在 R 中,可以使用以下代码实现数据预处理:

# 最大最小值归一化
scaled_data <- scale(df, center = FALSE, scale = apply(df, 2, max) - apply(df, 2, min))

# 标准化
scaled_data <- scale(df)

# 数据转换
log_data <- log(df)
特征选择

特征选择是指从原始数据中选出最具代表性和表现力的特征,以便在模型训练中发挥更好的作用。常用的特征选择方法有:

  • 过滤式特征选择:通过相关系数、卡方检验等方法对特征进行评价和筛选;
  • 包裹式特征选择:通过模型训练和交叉验证等方法对特征进行评价和筛选;
  • 嵌入式特征选择:将特征选择和模型训练结合起来,在模型训练中直接学习最佳特征组合。

在 R 中,可以使用以下代码实现特征选择(以过滤式特征选择为例):

# 相关系数筛选特征
correlation <- cor(df)
selected_features <- findCorrelation(correlation, cutoff = 0.5)

# 卡方检验筛选特征
library(caret)
selected_features <- caret::nearZeroVar(df, saveMetrics = TRUE)$index
特征提取

特征提取是指从原始数据中提取最具代表性和表现力的特征,以便在模型训练中发挥更好的作用。常用的特征提取方法有:

  • 主成分分析(PCA):通过线性变换将原始特征转换为新的基变量,使得数据在新的基空间下的方差最大化;
  • 线性判别分析(LDA):也是一种基于线性变换的特征提取方法,主要用于分类问题;
  • 非负矩阵分解(NMF):通过分解矩阵为非负的乘积形式,提取数据中潜在的特征,适用于图像处理和语音处理等领域。

在 R 中,可以使用以下代码实现特征提取(以 PCA 为例):

# PCA 特征提取
library(FactoMineR)
res.pca <- PCA(df, ncp = 5, graph = FALSE)
newdf <- data.frame(res.pca$ind$coord)
特征变换

特征变换是指对原始特征进行变换(如对数变换、幂函数变换、平方根变换等),以便在特征处理和模型训练时得到更好的表现。常用的特征变换方法有:

  • 对数变换:对数变换能够将非正态分布转换为近似正态分布;
  • 幂函数变换:将数据进行幂函数变换,可以用于对非对称分布进行调整;
  • 平方根变换:平方根变换能够将数据的偏态分布转换为近似正态分布。

在 R 中,可以使用以下代码实现特征变换:

# 对数变换
log_data <- log(df)

# 幂函数变换
power_data <- df^0.5

# 平方根变换
sqrt_data <- sqrt(df)
总结

本文介绍了 R 编程中的特征工程,包括常见的数据清洗和特征处理方法,以及如何使用 R 语言实现。特征工程是数据科学中不可或缺的一环,良好的特征处理和选择能够在模型训练中发挥重要的作用。我们希望本文能够帮助到初学者了解 R 编程中的特征工程,并在实际项目中得到应用。