Разработка функций в программировании на R

Опубликовано: 17 Февраля, 2022

Разработка функций - это наиболее важный метод, используемый при создании моделей машинного обучения. Разработка функций - это основной термин, используемый для обозначения многих операций, которые выполняются с переменными (функциями), чтобы подогнать их к алгоритму. Это помогает повысить точность модели, тем самым улучшая результаты прогнозов. Модели машинного обучения, созданные с помощью функций, работают с данными лучше, чем базовые модели машинного обучения. Следующие аспекты проектирования функций заключаются в следующем:

  1. Масштабирование объектов: это делается для того, чтобы объекты имели одинаковый масштаб (например, евклидово расстояние).
  2. Преобразование функции: выполняется для нормализации данных (функции) функцией.
  3. Построение функций: это делается для создания новых функций на основе исходных дескрипторов для повышения точности прогнозной модели.
  4. Уменьшение возможностей. : Это сделано для улучшения статистического распределения и точности прогнозной модели.

Теория

Метод построения объектов помогает создавать новые объекты в данных, тем самым повышая точность модели и общие прогнозы. Он бывает двух видов:

  1. Биннинг: бункеры создаются для непрерывных переменных.
  2. Кодирование: числовые переменные или характеристики формируются из категориальных переменных.

Биннинг

Биннинг выполняется для создания бункеров для непрерывных переменных, в которых они преобразуются в категориальные переменные. Существует два типа группирования: без присмотра и под присмотром .

  • Неконтролируемое объединение включает автоматическое и ручное объединение. При автоматическом размещении корзины создаются без вмешательства человека и создаются автоматически. В ручном биннинге бункеры создаются с вмешательством человека, и мы указываем, где они должны быть созданы.
  • Контролируемое биннинг включает создание бинов для непрерывной переменной с учетом также целевой переменной .

Кодирование

Кодирование - это процесс, в котором числовые переменные или функции создаются из категориальных переменных. Это широко используемый метод в промышленности и во всех процессах построения моделей. Он бывает двух типов: кодирование метки и быстрое кодирование .

  • Кодирование метки включает присвоение каждой метке уникального целого числа или значения в алфавитном порядке. Это самая популярная и широко используемая кодировка.
  • Быстрое кодирование включает создание дополнительных функций или переменных на основе уникальных значений в категориальных переменных, т.е. каждое уникальное значение в категории будет добавлено как новая функция.

Реализация в R

Набор данных

Набор данных BigMart состоит из 1559 товаров в 10 магазинах в разных городах. Определены определенные атрибуты каждого продукта и магазина. Он состоит из 12 функций, например, Item_Identifier (уникальный идентификатор продукта, присваиваемый каждому отдельному элементу), Item_Weight (включает вес продукта), Item_Fat_Content (описывает, является ли продукт с низким содержанием жира), Item_Visibility (упоминает процент от общая площадь отображения всех продуктов в магазине, выделенная конкретному продукту), Item_Type (описывает категорию продуктов питания, к которой принадлежит товар), Item_MRP (максимальная розничная цена (прейскурантная цена) продукта), Outlet_Identifier (присвоенный уникальный идентификатор магазина. Он состоит из буквенно-цифровой строки длиной 6), Outlet_Establishment_Year (указывает год открытия магазина), Outlet_Size (указывает размер магазина с точки зрения покрытой площади), Outlet_Location_Type (указывает размер города, в котором магазин расположен), Outlet_Type (указывает, является ли торговая точка просто продуктовым магазином или каким-то супермаркетом) и Item_Outlet_Sales (продажи продукта в конкретном магазине).

R

# Loading data  
train = fread("Train_UWu5bXk.csv")  
test = fread("Test_u94Q5KV.csv")  
  
# Structure  
str(train)

Выход:

Выполнение проектирования функций в наборе данных

Using the Feature Construction method on the dataset which includes 12 features with 1559 products across 10 stores in different cities.

R

# 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(combi$Item_Weight)) 
for(i in missing_index){ 
  item = combi$Item_Identifier[i] 
  combi$Item_Weight[i] = mean(combi$Item_Weight 
                         [combi$Item_Identifier == item],  
                         na.rm = T) 
  
# Feature Engineering
# Feature Transformation
# Replacing 0 in Item_Visibility with mean
zero_index = which(combi$Item_Visibility == 0)
for(i in zero_index){
  item = combi$Item_Identifier[i]
  combi$Item_Visibility[i] = mean(
    combi$Item_Visibility[combi$Item_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(combi$Item_Identifier, 1, 2)]
  
combi$Item_Fat_Content[combi$Item_category == "NC"] = "Non-Edible"
  
# Years of operation of Outlets
combi[,Outlet_Years := 2013 - Outlet_Establishment_Year]
combi$Outlet_Establishment_Year = as.factor(combi$Outlet_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(combi$Item_Visibility) 
skewness(combi$price_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)
  
# Tranforming 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= train$Item_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, гамма - 1, max_depth - 6, colsample_bytree = 0,5, и silent - 1.

  • График переменной важности:

price_per_unit_wt - вторая по важности переменная или характеристика для модели прогнозирования, за которой следует Outlet_Years, которая является шестой по важности переменной или характеристикой для модели прогнозирования. Функции Item_category, Item_Type_new сыграли важную роль в улучшении модели прогнозирования и, таким образом, в повышении точности модели. Итак, Feature Engineering - самый важный метод построения эффективной, масштабируемой и точной прогнозной модели.