R语言 特征工程
特征工程 是将原始数据转换为可用于机器学习模型的特征的过程。在R编程中,特征工程可以通过各种内置函数和包来完成。
一个常见的特征工程方法是使用dplyr包来处理和总结数据。这个包提供了诸如 “select() “从数据框中选择特定的列,”filter() “根据某些标准过滤行,以及 “group_by() “按一个或多个变量分组数据并进行汇总计算的功能。
R中另一个流行的特征工程包是tidyr包,它提供了重塑和重组数据的函数,如 “gather() “和 “spread() “分别重塑宽格式和长格式数据。
此外,你可以使用基础R的函数,如 “aggregate()”、”apply()”、”tapply() “来对数据组进行计算,或 “as.factor() “来将变量转换成因子。
此外,你还可以使用像caret这样的库,它提供了各种预处理数据的功能,如归一化、缩放、编码和特征选择。
需要注意的是,特征工程是一个反复的过程,需要对数据和你要解决的问题有充分的了解,它是建立一个好的机器学习模型的关键步骤。
特征工程是创建机器学习模型时使用的最重要的技术。特征工程是一个基本术语,用于涵盖对变量(特征)进行的许多操作,以使其适合算法。它有助于提高模型的准确性,从而提高预测的结果。与基本的机器学习模型相比,特征工程的机器学习模型在数据上的表现更好。
特征工程的下列方面如下。
- 特征缩放: 它是为了在相同的尺度上获得特征(例如,欧氏距离)。
- 特征转换: 通过一个函数对数据(特征)进行标准化处理。
- 特征构建: 在原始描述符的基础上创建新的特征,以提高预测模型的准确性。
- 特征还原: 用于改善统计分布和预测模型的准确性。
理论
特征构建方法有助于在数据中创建新的特征,从而提高模型的准确性和整体预测能力。它有两种类型。
- 分层: 为连续变量创建分层。
- 编码: 数字变量或特征由分类变量形成。
分级
分级是为了给连续变量创建分档,将其转换为分类变量。有两种类型的分档: 无监督的和有监督的。
- 无监督分选 包括自动和手动分选。在自动分选中,分选是在没有人为干预的情况下自动创建的。 在手动分档中,在人为干扰下创建分档,我们指定要创建的分档位置。
- 有监督的分 档包括为连续变量创建分档,同时也考虑到 目标变量 。
编码
编码是一个从分类变量中创建数字变量或特征的过程。它是行业内和每个模型建立过程中广泛使用的方法。它有两种类型: 标签编码和单热编码。
- 标签编码 涉及到根据字母顺序给每个标签分配一个独特的整数或值。这是最流行和广泛使用的编码。
- 一次性编码 涉及到在分类变量的独特值的基础上创建额外的特征或变量,即类别中的每个独特值都将被添加为一个新的特征。
在R中的实现
数据集
BigMart数据集由不同城市的10家商店的1559种产品组成。每个产品和商店的某些属性已经被定义。它包括12个特征,即Item_Identifier(是分配给每个不同产品的唯一产品ID),Item_Weight(包括产品的重量),Item_Fat_Content(描述产品是否为低脂肪),Item_Visibility(提到商店中所有产品的总展示面积中分配给特定产品的百分比),Item_Type(描述产品所属的食品类别),Item_MRP(产品的最高零售价(清单价格)),Outlet_Identifier(分配的唯一商店ID。它由一个长度为6的字母数字字符串组成),Outlet_Establishment_Year(提到了商店成立的年份),Outlet_Size(告诉了商店占地面积的大小),Outlet_Location_Type(告诉了商店所在城市的大小),Outlet_Type(告诉了该商店是否只是一个杂货店或某种超市)和Item_Outlet_Sales(该产品在特定商店的销售额)。
# Loading data
train = fread("Train_UWu5bXk.csv")
test = fread("Test_u94Q5KV.csv")
# Structure
str(train)
输出
在数据集上执行特征工程
在数据集上使用特征构造方法,其中包括12个特征,涉及不同城市的10家商店的1559种产品。
# Loading packages
library(data.table) # used for reading and manipulation of data
library(dplyr) # used for data manipulation and joining
library(ggplot2) # used for ploting
library(caret) # used for modeling
library(e1071) # used for removing skewness
library(corrplot) # used for making correlation plot
library(xgboost) # used for building XGBoost model
library(cowplot) # used for combining multiple plots
# Importing datasets
train = fread("Train_UWu5bXk.csv")
test = fread("Test_u94Q5KV.csv")
# Structure of dataset
str(train)
# Setting test dataset
# Combining datasets
# add Item_Outlet_Sales to test data
test[, Item_Outlet_Sales := NA]
combi = rbind(train, test)
# Missing Value Treatment
missing_index = which(is.na(combiItem_Weight))
for(i in missing_index){
item = combiItem_Identifier[i]
combiItem_Weight[i] = mean(combiItem_Weight
[combiItem_Identifier == item],
na.rm = T)
}
# Feature Engineering
# Feature Transformation
# Replacing 0 in Item_Visibility with mean
zero_index = which(combiItem_Visibility == 0)
for(i in zero_index){
item = combiItem_Identifier[i]
combiItem_Visibility[i] = mean(
combiItem_Visibility[combiItem_Identifier == item],
na.rm = T
)
}
# Feature Construction
# Create a new feature 'Item_Type_new'
perishable = c("Breads", "Breakfast", "Dairy",
"Fruits and Vegetables", "Meat", "Seafood")
non_perishable = c("Baking Goods", "Canned", "Frozen Foods",
"Hard Drinks", "Health and Hygiene",
"Household", "Soft Drinks")
combi[,Item_Type_new := ifelse(Item_Type %in% perishable, "perishable",
ifelse(Item_Type %in% non_perishable,
"non_perishable", "not_sure"))]
combi[,Item_category := substr(combiItem_Identifier, 1, 2)]
combiItem_Fat_Content[combiItem_category == "NC"] = "Non-Edible"
# Years of operation of Outlets
combi[,Outlet_Years := 2013 - Outlet_Establishment_Year]
combiOutlet_Establishment_Year = as.factor(combiOutlet_Establishment_Year)
# Price per unit weight
combi[,price_per_unit_wt := Item_MRP/Item_Weight]
# Label Encoding
combi[,Outlet_Size_num := ifelse(Outlet_Size == "Small", 0,
ifelse(Outlet_Size == "Medium", 1, 2))]
combi[,Outlet_Location_Type_num := ifelse(Outlet_Location_Type == "Tier 3", 0,
ifelse(Outlet_Location_Type == "Tier 2", 1, 2))]
combi[, c("Outlet_Size", "Outlet_Location_Type") := NULL]
# One-hot Encoding
ohe = dummyVars("~.", data = combi[,-c("Item_Identifier",
"Outlet_Establishment_Year",
"Item_Type")], fullRank = T)
ohe_df = data.table(predict(ohe, combi[,-c("Item_Identifier",
"Outlet_Establishment_Year",
"Item_Type")]))
combi = cbind(combi[,"Item_Identifier"], ohe_df)
# Removing Skewness
skewness(combiItem_Visibility)
skewness(combiprice_per_unit_wt)
combi[,Item_Visibility := log(Item_Visibility + 1)]
combi[,price_per_unit_wt := log(price_per_unit_wt + 1)]
# Scaling and Centering data
# index of numeric features
num_vars = which(sapply(combi, is.numeric))
num_vars_names = names(num_vars)
combi_numeric = combi[,setdiff(num_vars_names,
"Item_Outlet_Sales"), with = F]
prep_num = preProcess(combi_numeric, method=c("center", "scale"))
combi_numeric_norm = predict(prep_num, combi_numeric)
# Transforming Features
combi[,setdiff(num_vars_names, "Item_Outlet_Sales") := NULL]
combi = cbind(combi, combi_numeric_norm)
# Splitting data
train = combi[1:nrow(train)]
test = combi[(nrow(train) + 1):nrow(combi)]
# Removing Item_Outlet_Sales
test[,Item_Outlet_Sales := NULL]
# Model Building - xgboost
para_list = list(
objective = "reg:linear",
eta=0.01,
gamma = 1,
max_depth=6,
subsample=0.8,
colsample_bytree=0.5
)
# D Matrix
d_train = xgb.DMatrix(data = as.matrix(train[,-c("Item_Identifier",
"Item_Outlet_Sales")]),
label= trainItem_Outlet_Sales)
d_test = xgb.DMatrix(data = as.matrix(test[,-c("Item_Identifier")]))
# K-fold cross validation
set.seed(123) # Setting seed
xgb_cv = xgb.cv(params = para_list,
data = d_train,
nrounds = 1000,
nfold = 5,
print_every_n = 10,
early_stopping_rounds = 30,
maximize = F)
# Training model
model_xgb = xgb.train(data = d_train,
params = para_list,
nrounds = 428)
model_xgb
# Variable Importance Plot
variable_imp = xgb.importance(feature_names = setdiff(names(train),
c("Item_Identifier", "Item_Outlet_Sales")),
model = model_xgb)
xgb.plot.importance(variable_imp)
输出
- 模型model_xgb
XgBoost模型由21个特征组成,目标是回归线性,eta为0.01,gamma为1,max_depth为6,colsample_bytree = 0.5,silent为1。
- 变量重要性图
Price_per_unit_wt是预测模型的第二大重要变量或特征,其次是Outlet_Years是预测模型的第六大重要变量或特征。项目类别、项目类型、新特征在改善预测模型方面发挥了重要作用,从而提高了模型的准确性。因此,特征工程是建立一个高效、可扩展和准确的预测模型的最重要方法。