Разработка функций в программировании на R
Разработка функций - это наиболее важный метод, используемый при создании моделей машинного обучения. Разработка функций - это основной термин, используемый для обозначения многих операций, которые выполняются с переменными (функциями), чтобы подогнать их к алгоритму. Это помогает повысить точность модели, тем самым улучшая результаты прогнозов. Модели машинного обучения, созданные с помощью функций, работают с данными лучше, чем базовые модели машинного обучения. Следующие аспекты проектирования функций заключаются в следующем:
- Масштабирование объектов: это делается для того, чтобы объекты имели одинаковый масштаб (например, евклидово расстояние).
- Преобразование функции: выполняется для нормализации данных (функции) функцией.
- Построение функций: это делается для создания новых функций на основе исходных дескрипторов для повышения точности прогнозной модели.
- Уменьшение возможностей. : Это сделано для улучшения статистического распределения и точности прогнозной модели.
Теория
Метод построения объектов помогает создавать новые объекты в данных, тем самым повышая точность модели и общие прогнозы. Он бывает двух видов:
- Биннинг: бункеры создаются для непрерывных переменных.
- Кодирование: числовые переменные или характеристики формируются из категориальных переменных.
Биннинг
Биннинг выполняется для создания бункеров для непрерывных переменных, в которых они преобразуются в категориальные переменные. Существует два типа группирования: без присмотра и под присмотром .
- Неконтролируемое объединение включает автоматическое и ручное объединение. При автоматическом размещении корзины создаются без вмешательства человека и создаются автоматически. В ручном биннинге бункеры создаются с вмешательством человека, и мы указываем, где они должны быть созданы.
- Контролируемое биннинг включает создание бинов для непрерывной переменной с учетом также целевой переменной .
Кодирование
Кодирование - это процесс, в котором числовые переменные или функции создаются из категориальных переменных. Это широко используемый метод в промышленности и во всех процессах построения моделей. Он бывает двух типов: кодирование метки и быстрое кодирование .
- Кодирование метки включает присвоение каждой метке уникального целого числа или значения в алфавитном порядке. Это самая популярная и широко используемая кодировка.
- Быстрое кодирование включает создание дополнительных функций или переменных на основе уникальных значений в категориальных переменных, т.е. каждое уникальное значение в категории будет добавлено как новая функция.
Реализация в 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 packageslibrary(data.table) # used for reading and manipulation of datalibrary(dplyr) # used for data manipulation and joininglibrary(ggplot2) # used for ploting library(caret) # used for modelinglibrary(e1071) # used for removing skewnesslibrary(corrplot) # used for making correlation plotlibrary(xgboost) # used for building XGBoost modellibrary(cowplot) # used for combining multiple plots # Importing datasetstrain = fread("Train_UWu5bXk.csv") test = fread("Test_u94Q5KV.csv") # Structure of datasetstr(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 meanzero_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 Outletscombi[,Outlet_Years := 2013 - Outlet_Establishment_Year]combi$Outlet_Establishment_Year = as.factor(combi$Outlet_Establishment_Year) # Price per unit weightcombi[,price_per_unit_wt := Item_MRP/Item_Weight] # Label Encodingcombi[,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 Encodingohe = 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 Skewnessskewness(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 featuresnum_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 Featurescombi[,setdiff(num_vars_names, "Item_Outlet_Sales") := NULL] combi = cbind(combi, combi_numeric_norm) # Splitting datatrain = combi[1:nrow(train)]test = combi[(nrow(train) + 1):nrow(combi)] # Removing Item_Outlet_Salestest[,Item_Outlet_Sales := NULL] # Model Building - xgboostpara_list = list( objective = "reg:linear", eta=0.01, gamma = 1, max_depth=6, subsample=0.8, colsample_bytree=0.5 ) # D Matrixd_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 seedxgb_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 - самый важный метод построения эффективной, масштабируемой и точной прогнозной модели.