WQD7004 Group Project - OCC1 - Group G03

Richie Teoh (24088171)
Elmer Lee Jia Zhao (24082366)
Micole Chung Syn Tung (24073625)
Lee Re Xuan (24071969)
Angeline Tan Jie Lin (24084444)

01 June 2025


Introduction

As Kuala Lumpur and Selangor continue to develop, they attract many young professionals and individuals from other states seeking better career opportunities. With the rising cost of living—particularly in Kuala Lumpur—renting has become a more practical choice, especially for newcomers to the urban workforce.

Proximity to public transport such as LRT, MRT, and KTM is a key factor in rental decisions, helping tenants save on transport costs. Rental prices vary widely depending on location, unit size, furnishing, and amenities. For instance, apartments in Bangsar South typically start from RM2,000 (PropertyGuru, 2024; EdgeProp, 2024).

This project analyzes apartment rental listings from mudah.my in Kuala Lumpur and Selangor to uncover key pricing patterns. A regression model will be used to predict rental prices, while a classification model will explore furnishing status based on property features. The findings aim to support better decision-making for both tenants and property owners.

Title

  • Prediction of Rental Price via Regression and Classification of Property Furnishing Level in Klang Valley, Malaysia.

Questions

  • The purpose of processing this dataset is to identify and understand the factors that influence apartment rental prices in Kuala Lumpur and Selangor. By analyzing various features of rental listings, such as property size, location, number of rooms, furnishing status, and proximity to transportation, the project aims to uncover patterns within the rental market and derive predictive insights.

    This project focuses on addressing two key analytical questions:

    1. What are the key factors that influence rental prices, and how can rental prices be predicted using property features?
    -   This question is approached using regression analysis. The objective is to construct a predictive model that estimates rental prices based on selected variables such as square footage, number of bedrooms, floor level, and furnishing status. The model is intended to provide a quantitative understanding of how each feature contributes to pricing, and to enable estimation of rental prices for new listings.
    1. Can the furnishing status of an apartment (i.e., fully furnished, partially furnished, or unfurnished) be predicted based on other property characteristics?
    -   This question is addressed using classification techniques. The objective is to develop a model that classifies rental listings into one of the three furnishing categories based on features such as rental price, location, property size, and number of bedrooms and bathrooms. This classification provides insights into the relationship between apartment features and furnishing status, and may support both tenant preferences and market supply analysis.

Project Goal

  • This project aims to analyze apartment rental listings from Kuala Lumpur and Selangor using data sourced from mudah.my. The main objectives are:
  1. To clean and preprocess the dataset to ensure consistency, accuracy, and readiness for analysis by handling missing values, formatting issues, and irrelevant variables.
  2. To develop a regression model that predicts apartment rental prices based on key property features such as size, location, number of rooms, and furnishing status.
  3. To develop a classification model that predicts the furnishing status of an apartment unit (i.e. fully furnished, partially furnished, or unfurnished) based on property features such as size, location, number of bedrooms, and rental price.
# Load required libraries for data manipulation, visualization, and machine learning
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(dplyr)
library(stringr)
library(ggplot2)
library(reshape2)
## 
## Attaching package: 'reshape2'
## 
## The following object is masked from 'package:tidyr':
## 
##     smiths
library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## 
## The following object is masked from 'package:purrr':
## 
##     lift
library(xgboost)
## 
## Attaching package: 'xgboost'
## 
## The following object is masked from 'package:dplyr':
## 
##     slice
library(lightgbm)
library(nnet)
# Load the dataset
df <- read.csv('mudah-apartment-kl-selangor.csv')
head(df)
##      ads_id                     prop_name completion_year       monthly_rent
## 1 100323185      The Hipster @ Taman Desa            2022 RM 4 200 per month
## 2 100203973                  Segar Courts              NA RM 2 300 per month
## 3 100323128 Pangsapuri Teratak Muhibbah 2              NA RM 1 000 per month
## 4 100191767  Sentul Point Suite Apartment            2020 RM 1 700 per month
## 5  97022692               Arte Mont Kiara              NA RM 1 299 per month
## 6 100322897      Residensi Vista Wirajaya              NA RM 1 500 per month
##                    location     property_type rooms parking bathroom
## 1 Kuala Lumpur - Taman Desa       Condominium     5       2        6
## 2     Kuala Lumpur - Cheras       Condominium     3       1        2
## 3 Kuala Lumpur - Taman Desa         Apartment     3      NA        2
## 4     Kuala Lumpur - Sentul         Apartment     2       1        2
## 5 Kuala Lumpur - Mont Kiara Service Residence     1       1        1
## 6    Kuala Lumpur - Setapak         Apartment     3       1        2
##          size           furnished
## 1 1842 sq.ft.     Fully Furnished
## 2 1170 sq.ft. Partially Furnished
## 3  650 sq.ft.     Fully Furnished
## 4  743 sq.ft. Partially Furnished
## 5  494 sq.ft.       Not Furnished
## 6  884 sq.ft. Partially Furnished
##                                                                                                                             facilities
## 1             Minimart, Gymnasium, Security, Playground, Swimming Pool, Parking, Lift, Barbeque area, Multipurpose hall, Jogging Track
## 2                                   Playground, Parking, Barbeque area, Security, Jogging Track, Swimming Pool, Gymnasium, Lift, Sauna
## 3                                                                                         Minimart, Jogging Track, Lift, Swimming Pool
## 4                                                Parking, Playground, Swimming Pool, Squash Court, Security, Minimart, Gymnasium, Lift
## 5 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 6                                                                Parking, Security, Lift, Swimming Pool, Playground, Multipurpose hall
##                            additional_facilities       region
## 1     Air-Cond, Cooking Allowed, Washing Machine Kuala Lumpur
## 2        Air-Cond, Cooking Allowed, Near KTM/LRT Kuala Lumpur
## 3                                                Kuala Lumpur
## 4 Cooking Allowed, Near KTM/LRT, Washing Machine Kuala Lumpur
## 5                                       Air-Cond Kuala Lumpur
## 6                  Cooking Allowed, Near KTM/LRT Kuala Lumpur
# Create a metadata table describing each key column
metadata <- tibble(
  Column_Name = c(
    "ads_id",
    "prop_name",
    "completion_year",
    "monthly_rent",
    "location",
    "property_type",
    "rooms",
    "parking",
    "bathroom",
    "size",
    "furnished",
    "facilities",
    "additional_facilities"
  ),
  Description = c(
    "Unique identifier for the listing",
    "Name of the building/property",
    "Completion/established year of the property",
    "Monthly rent in Ringgit Malaysia (RM)",
    "Property location within Kuala Lumpur region",
    "Type of property (apartment, condo, flat, etc.)",
    "Number of rooms in the unit",
    "Number of parking spaces for the unit",
    "Number of bathrooms in the unit",
    "Total area of the unit in square feet",
    "Furnishing status of the unit (fully, partial, non-furnished)",
    "Main facilities available",
    "Additional facilities (e.g., proximity to mall, school, railway, etc.)"
  )
)

# Print the metadata table
metadata
## # A tibble: 13 × 2
##    Column_Name           Description                                            
##    <chr>                 <chr>                                                  
##  1 ads_id                Unique identifier for the listing                      
##  2 prop_name             Name of the building/property                          
##  3 completion_year       Completion/established year of the property            
##  4 monthly_rent          Monthly rent in Ringgit Malaysia (RM)                  
##  5 location              Property location within Kuala Lumpur region           
##  6 property_type         Type of property (apartment, condo, flat, etc.)        
##  7 rooms                 Number of rooms in the unit                            
##  8 parking               Number of parking spaces for the unit                  
##  9 bathroom              Number of bathrooms in the unit                        
## 10 size                  Total area of the unit in square feet                  
## 11 furnished             Furnishing status of the unit (fully, partial, non-fur…
## 12 facilities            Main facilities available                              
## 13 additional_facilities Additional facilities (e.g., proximity to mall, school…

From the metadata extracted from Kaggle above: - ads_id should be dropped as it is a unique identifier for the Mudah rental listing. - prop_name can influence the rental price, for example properties under well-known developers such as Arte tend to be higher-priced; however, it does not generalize well and unseen property names might cause issues in the model. Henceforth, we decide to drop this variable as well. - completion_year includes some NA values, will investigate further, completion_year contributes to the price and the info are usually available online, hence we will impute it manually from data found online. - monthly_rent is saved as chr type due to the “RM” prefixes, will perform appropriate data transformation. - size is saved as chr type due to the “sq. ft.” suffixes, will perform appropriate data transformation.

Data Pre-processing

The dataset was filtered to include only listings labeled as “Serviced Residences” or “Condominium” to reduce noise and focus the analysis on high-rise residential properties. Duplicate entries based on ads_id were removed by retaining only the row with the least number of missing values, ensuring cleaner and more reliable input for modeling.

# Data Pre-processing

# Filter only serviced residences and condo
df <- df %>%
  filter(.data[['property_type']] %in% c('Service Residence','Condominium'))

# Check and Remove duplicated values.
duplicates_only <- df %>%
  filter(duplicated(df) | duplicated(df, fromLast = TRUE)) %>%
  arrange(ads_id)

duplicates_ads_id <- df %>%
  filter(duplicated(df['ads_id']) | duplicated(df['ads_id'], fromLast = TRUE)) %>%
  arrange(ads_id)

head(duplicates_only)
##      ads_id                            prop_name completion_year
## 1 100108343                The Glenz @ Glenmarie              NA
## 2 100108343                The Glenz @ Glenmarie              NA
## 3 100304102 Impiria Residensi Bukit Tinggi Klang            2018
## 4 100304102 Impiria Residensi Bukit Tinggi Klang            2018
## 5 100640316            Hill10 Residence @ i-City              NA
## 6 100640316            Hill10 Residence @ i-City              NA
##         monthly_rent              location     property_type rooms parking
## 1 RM 1 800 per month Selangor - Setia Alam Service Residence   2.0      NA
## 2 RM 1 800 per month Selangor - Setia Alam Service Residence   2.0      NA
## 3 RM 3 300 per month      Selangor - Klang Service Residence   4.0      NA
## 4 RM 3 300 per month      Selangor - Klang Service Residence   4.0      NA
## 5 RM 2 500 per month  Selangor - Shah Alam Service Residence   2.0      NA
## 6 RM 2 500 per month  Selangor - Shah Alam Service Residence   2.0      NA
##   bathroom        size           furnished
## 1        2  800 sq.ft. Partially Furnished
## 2        2  800 sq.ft. Partially Furnished
## 3        3 1312 sq.ft.     Fully Furnished
## 4        3 1312 sq.ft.     Fully Furnished
## 5        1  602 sq.ft.     Fully Furnished
## 6        1  602 sq.ft.     Fully Furnished
##                                                                                                               facilities
## 1                                                                                                                       
## 2                                                                                                                       
## 3 Minimart, Gymnasium, Security, Playground, Lift, Swimming Pool, Squash Court, Parking, Multipurpose hall, Tennis Court
## 4 Minimart, Gymnasium, Security, Playground, Lift, Swimming Pool, Squash Court, Parking, Multipurpose hall, Tennis Court
## 5                           Gymnasium, Barbeque area, Security, Playground, Swimming Pool, Jogging Track, Sauna, Parking
## 6                           Gymnasium, Barbeque area, Security, Playground, Swimming Pool, Jogging Track, Sauna, Parking
##   additional_facilities   region
## 1                       Selangor
## 2                       Selangor
## 3                       Selangor
## 4                       Selangor
## 5                       Selangor
## 6                       Selangor
head(duplicates_ads_id)
##     ads_id      prop_name completion_year       monthly_rent
## 1 92495113                             NA   RM 950 per month
## 2 92495113    Venice Hill            2000   RM 950 per month
## 3 97500117                             NA   RM 500 per month
## 4 97500117 Evergreen Park            1997   RM 500 per month
## 5 99483293      3 Residen            2010 RM 2 200 per month
## 6 99483293      3 Residen            2010 RM 2 200 per month
##                        location property_type rooms parking bathroom
## 1         Kuala Lumpur - Cheras   Condominium     3       1        2
## 2             Selangor - Cheras   Condominium   3.0       1        2
## 3         Kuala Lumpur - Cheras   Condominium     1      NA        1
## 4             Selangor - Cheras   Condominium   1.0      NA        1
## 5 Kuala Lumpur - Taman Melawati   Condominium     2       2        2
## 6          Selangor - Ulu Klang   Condominium   2.0       2        2
##          size           furnished
## 1 1500 sq.ft. Partially Furnished
## 2 1500 sq.ft.       Not Furnished
## 3  130 sq.ft.     Fully Furnished
## 4  130 sq.ft.     Fully Furnished
## 5  950 sq.ft.     Fully Furnished
## 6  950 sq.ft.     Fully Furnished
##                                                                                                                                                                facilities
## 1                                                                                                                                                                        
## 2 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Sauna, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track, Tennis Court, Squash Court
## 3                                                                                                 Security, Lift, Swimming Pool, Playground, Barbeque area, Jogging Track
## 4                                                                                        Minimart, Security, Gymnasium, Swimming Pool, Jogging Track, Parking, Playground
## 5                                                                                          Playground, Swimming Pool, Barbeque area, Security, Minimart, Gymnasium, Sauna
## 6                                                                                          Playground, Swimming Pool, Barbeque area, Security, Minimart, Gymnasium, Sauna
##                                      additional_facilities       region
## 1 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine Kuala Lumpur
## 2 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine     Selangor
## 3                         Cooking Allowed, Washing Machine Kuala Lumpur
## 4                         Cooking Allowed, Washing Machine     Selangor
## 5                                                          Kuala Lumpur
## 6                                                              Selangor
# Remove duplicates based on 'ads_id'
cleaned_df <- df %>%
  mutate(na_count = rowSums(is.na(.))) %>%
  group_by(ads_id) %>%
  arrange(na_count) %>%
  dplyr::slice(1) %>%
  ungroup() %>%
  select(-na_count)

sum(duplicated(cleaned_df['ads_id']))
## [1] 0
df <- cleaned_df

# 

Check for Missing Data and Imputation

To ensure data quality, the dataset was examined for missing values. The total number of missing entries and the distribution of missing data across each column were identified using sum(is.na(df)) and colSums(is.na(df)). This step provides insight into the completeness of the dataset and informs whether imputation or removal is necessary for affected variables.

# Check for missing values in the entire dataset and by individual columns
sum(is.na(df))
## [1] 7728
colSums(is.na(df))
##                ads_id             prop_name       completion_year 
##                     0                     0                  4657 
##          monthly_rent              location         property_type 
##                     0                     0                     0 
##                 rooms               parking              bathroom 
##                     0                  3071                     0 
##                  size             furnished            facilities 
##                     0                     0                     0 
## additional_facilities                region 
##                     0                     0

Data Cleaning

This step involves cleaning text-based numeric fields (monthly_rent and size) by removing prefixes, suffixes, and formatting characters, then converting them into numeric types. Rows with missing rental prices were removed, as this value is essential for price prediction. Additionally, listings with missing completion_year were inspected for possible further handling.

# Data Cleaning

# 1) Removing prefix 'RM' and suffix 'per month' from monthly rent, removing white spaces from 1 700, and convert to numeric type.
df <- df %>%
  mutate(
    monthly_rent = str_remove_all(monthly_rent, "RM|per month|,"),
    monthly_rent = str_remove_all(monthly_rent, " "),
    monthly_rent = as.numeric(monthly_rent)
  )

# 2) Removing suffix 'sq. ft.' from size, removing any white spaces, and convert to numeric type.
df <- df%>%
  mutate(
    size = str_remove_all(size, "sq\\.ft\\."),
    size = str_remove_all(size, " "),
    size = as.numeric(size)
  )

# Check which listings have missing 'completion_year'
unique(df[is.na(df$completion_year), "prop_name"])
## # A tibble: 732 × 1
##    prop_name                             
##    <chr>                                 
##  1 ""                                    
##  2 "Mahkota Garden Residence Condominium"
##  3 "vista alam"                          
##  4 "Corinthian Condominium"              
##  5 "Plaza Damas"                         
##  6 "Residensi Harmoni 1"                 
##  7 "Endah Ria"                           
##  8 "OUG Parklane"                        
##  9 "Koi Kinrara"                         
## 10 "Putra Residence, Putra Heights"      
## # ℹ 722 more rows
# Check rows with missing 'monthly_rent'
df[is.na(df$monthly_rent),]
## # A tibble: 1 × 14
##      ads_id prop_name  completion_year monthly_rent location property_type rooms
##       <int> <chr>                <dbl>        <dbl> <chr>    <chr>         <chr>
## 1 100849472 Affina Ba…              NA           NA Selango… Condominium   4.0  
## # ℹ 7 more variables: parking <dbl>, bathroom <dbl>, size <dbl>,
## #   furnished <chr>, facilities <chr>, additional_facilities <chr>,
## #   region <chr>
# Remove rows with missing 'monthly_rent'
df <- df %>%
  filter(!is.na(monthly_rent))

Interesting case, Affina Bay is located in Butterworth but included in this webscrapped Klang Valley Mudah listing. Henceforth, we will take more time to clean the data properly based on the listing’s location.

# Check all unique values in the 'location' column
unique(df['location'])
## # A tibble: 115 × 1
##    location                        
##    <chr>                           
##  1 Kuala Lumpur - Wangsa Maju      
##  2 Kuala Lumpur - Ampang           
##  3 Kuala Lumpur - Cheras           
##  4 Kuala Lumpur - Old Klang Road   
##  5 Selangor - Shah Alam            
##  6 Selangor - Bandar Mahkota Cheras
##  7 Selangor - Cheras               
##  8 Selangor - Bandar Sungai Long   
##  9 Selangor - Petaling Jaya        
## 10 Selangor - Seri Kembangan       
## # ℹ 105 more rows

While reviewing the unique values in the location column, several entries appear inconsistent or non-standard, such as “Selangor - 389”, “Selangor - 517”, and “Kuala Lumpur - Others”.

# Identify suspicious or unclear location values
suspicious_location <- c('Selangor - 389', 'Selangor - 360', 'Kuala Lumpur - Others', 'Selangor - 517', 'Selangor - 639')

# View all rows with those suspicious location values
df[df$location %in% suspicious_location,]
## # A tibble: 103 × 14
##       ads_id prop_name completion_year monthly_rent location property_type rooms
##        <int> <chr>               <dbl>        <dbl> <chr>    <chr>         <chr>
##  1  94320618 Aurora R…            2017         1200 Selango… Service Resi… 3.0  
##  2  95535774 Aurora R…            2017         1300 Selango… Service Resi… 3.0  
##  3  98408795 9INE                 2017          550 Selango… Condominium   1.0  
##  4  98512867 9INE                 2017         1300 Selango… Condominium   3.0  
##  5  99738695 J DUPION…              NA         2000 Kuala L… Condominium   2    
##  6 100010982 Vista Se…              NA         1600 Kuala L… Condominium   3    
##  7 100211684 Antara R…              NA         1100 Kuala L… Service Resi… 3    
##  8 100512266 Ayuman S…            2018         1500 Selango… Service Resi… 3.0  
##  9 100523361 Aurora R…            2017         1899 Selango… Condominium   3.0  
## 10 100525893 Ayuman S…            2018         1100 Selango… Service Resi… 3.0  
## # ℹ 93 more rows
## # ℹ 7 more variables: parking <dbl>, bathroom <dbl>, size <dbl>,
## #   furnished <chr>, facilities <chr>, additional_facilities <chr>,
## #   region <chr>
# Check if any property names contain the word "Ayuman"
df %>%
  filter(grepl("Ayuman", prop_name))
## # A tibble: 5 × 14
##      ads_id prop_name  completion_year monthly_rent location property_type rooms
##       <int> <chr>                <dbl>        <dbl> <chr>    <chr>         <chr>
## 1  97447922 Ayuman Su…              NA         1350 Kuala L… Service Resi… 3    
## 2 100223849 Ayuman Su…            2018         1399 Selango… Service Resi… 3.0  
## 3 100512266 Ayuman Su…            2018         1500 Selango… Service Resi… 3.0  
## 4 100525893 Ayuman Su…            2018         1100 Selango… Service Resi… 3.0  
## 5 100640521 Ayuman Su…            2018         1550 Selango… Service Resi… 3.0  
## # ℹ 7 more variables: parking <dbl>, bathroom <dbl>, size <dbl>,
## #   furnished <chr>, facilities <chr>, additional_facilities <chr>,
## #   region <chr>
# Investigating number of rooms
unique(df$rooms)
##  [1] "3"            "1"            "2.0"          "4.0"          "3.0"         
##  [6] "1.0"          "2"            "7.0"          "4"            "5.0"         
## [11] "5"            "6"            "9"            "9.0"          "More than 10"
## [16] "6.0"          "7"
df <- df %>%
  mutate(
    rooms = case_when(
      rooms == "More than 10" ~ 10L,                 # Convert "more than 10" to integer 10
      TRUE ~ as.integer(rooms)                      # Otherwise, convert to integer
    )
  )
## Warning: There was 1 warning in `mutate()`.
## ℹ In argument: `rooms = case_when(rooms == "More than 10" ~ 10L, TRUE ~
##   as.integer(rooms))`.
## Caused by warning:
## ! NAs introduced by coercion
df[df$rooms >= 6,]
## # A tibble: 29 × 14
##      ads_id prop_name  completion_year monthly_rent location property_type rooms
##       <int> <chr>                <dbl>        <dbl> <chr>    <chr>         <int>
##  1 75084258 ""                      NA         1000 Selango… Condominium       7
##  2 94153029 "Binjai R…            2007         5800 Kuala L… Condominium       6
##  3 95078151 "Sentul p…              NA         1550 Kuala L… Condominium       9
##  4 98657827 "Venice H…            2000         1300 Selango… Condominium       9
##  5 98910302 ""                      NA         1800 Kuala L… Condominium      10
##  6 98976763 ""                      NA         8000 Kuala L… Condominium       6
##  7 98976840 ""                      NA        12000 Kuala L… Condominium       6
##  8 99435386 "Wangsa H…            2001         3500 Kuala L… Condominium       6
##  9 99536159 "Perdana …              NA         2800 Selango… Condominium       6
## 10 99729522 "Seri Pur…              NA         1250 Kuala L… Condominium      10
## # ℹ 19 more rows
## # ℹ 7 more variables: parking <dbl>, bathroom <dbl>, size <dbl>,
## #   furnished <chr>, facilities <chr>, additional_facilities <chr>,
## #   region <chr>
df[!df$ads_id %in% c(95078151,98657827,98910302,99729522,99760048,100065541,100013966,100303122),]
## # A tibble: 13,739 × 14
##      ads_id prop_name  completion_year monthly_rent location property_type rooms
##       <int> <chr>                <dbl>        <dbl> <chr>    <chr>         <int>
##  1 16525511 Villa Wan…            2010         2000 Kuala L… Condominium       3
##  2 16572317 Villa Wan…            2010         1700 Kuala L… Condominium       3
##  3 16717632 Villa Wan…            2010         2000 Kuala L… Condominium       3
##  4 16801236 Villa Wan…            2010         2000 Kuala L… Condominium       3
##  5 17122588 Villa Wan…            2010         2000 Kuala L… Condominium       3
##  6 17465265 Villa Wan…            2010         2000 Kuala L… Condominium       3
##  7 17659177 Villa Wan…            2010         1700 Kuala L… Condominium       3
##  8 18186927 Villa Wan…            2010         2000 Kuala L… Condominium       3
##  9 18631094 Villa Wan…            2010         2000 Kuala L… Condominium       3
## 10 18677373 Villa Wan…            2010         2000 Kuala L… Condominium       3
## # ℹ 13,729 more rows
## # ℹ 7 more variables: parking <dbl>, bathroom <dbl>, size <dbl>,
## #   furnished <chr>, facilities <chr>, additional_facilities <chr>,
## #   region <chr>

Interestingly, we see quite a varying number of rooms ranging from 1 to 10, usually a unit is available in 2 - 5 rooms, hence let us investigate the other values. From the rows, we could see that some units have 6 or more rooms despite only having size less than 2000 sq. ft., hence we will exclude ads_id %in$ c(95078151,98657827,98910302,99729522,99760048,100065541,100013966,100303122)

For the column parking, we decide to fill the NA values with 0.

df$parking[is.na(df$parking)] <- 0

For the column completion_year, we decide to fill NA values via median value of the locations.

# Impute missing 'completion_year' values using the median year within the same location group
df <- df %>%
  group_by(location) %>%
  mutate(completion_year = ifelse(is.na(completion_year), median(completion_year, na.rm = TRUE), completion_year))


# Load manually collected property names and their completion years
df_manual_prop <- read.csv('manual_prop_year.csv', header=FALSE)
colnames(df_manual_prop) <- c('prop_name','completion_year')


# Merge manual data with main dataset and update 'completion_year' where manual values are available
df <- df %>%
  left_join(df_manual_prop, by = "prop_name", suffix = c("_raw", "_manual")) %>%
  mutate(completion_year = coalesce(completion_year_raw, completion_year_manual)) %>%
  select(-completion_year_raw, -completion_year_manual)


# Use global median to fill any remaining missing 'completion_year'
global_median_year <- median(df$completion_year, na.rm = TRUE)

df <- df %>%
  mutate(completion_year = coalesce(completion_year, global_median_year))

Final results after Cleaning

After applying all cleaning steps, the dataset is free from duplicates and missing values in key fields such as monthly_rent, size, and completion_year. Inconsistent entries were filtered or corrected, and numeric fields were standardized for analysis. The cleaned dataset is now ready for exploratory analysis and modeling.

# Check the number of missing values in each column after data cleaning
colSums(is.na(df))
##                ads_id             prop_name          monthly_rent 
##                     0                     0                     0 
##              location         property_type                 rooms 
##                     0                     0                     0 
##               parking              bathroom                  size 
##                     0                     0                     0 
##             furnished            facilities additional_facilities 
##                     0                     0                     0 
##                region       completion_year 
##                     0                     0

Data Visualization

Exploratory Data Analysis was performed to better understand the structure, patterns, and relationships within the dataset. This includes examining distributions of key variables, identifying correlations between features, detecting outliers, and visualizing trends that may influence rental prices and furnishing levels. The insights gained from EDA guide feature selection and model development in later stages.

df_EDA = data.frame(df) #Make a copy for EDA
head(df_EDA)
##     ads_id       prop_name monthly_rent                   location
## 1 16525511 Villa Wangsamas         2000 Kuala Lumpur - Wangsa Maju
## 2 16572317 Villa Wangsamas         1700 Kuala Lumpur - Wangsa Maju
## 3 16717632 Villa Wangsamas         2000 Kuala Lumpur - Wangsa Maju
## 4 16801236 Villa Wangsamas         2000 Kuala Lumpur - Wangsa Maju
## 5 17122588 Villa Wangsamas         2000 Kuala Lumpur - Wangsa Maju
## 6 17465265 Villa Wangsamas         2000 Kuala Lumpur - Wangsa Maju
##   property_type rooms parking bathroom size           furnished
## 1   Condominium     3       0        3 1267     Fully Furnished
## 2   Condominium     3       0        3 1267 Partially Furnished
## 3   Condominium     3       1        3 1267     Fully Furnished
## 4   Condominium     3       0        3 1267     Fully Furnished
## 5   Condominium     3       0        3 1267     Fully Furnished
## 6   Condominium     3       0        3 1267     Fully Furnished
##                                                                                                                             facilities
## 1 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 2 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 3 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 4 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 5 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 6 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
##                                                additional_facilities
## 1 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine, Internet
## 2                  Air-Cond, Cooking Allowed, Near KTM/LRT, Internet
## 3 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine, Internet
## 4 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine, Internet
## 5 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine, Internet
## 6 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine, Internet
##         region completion_year                              full_location
## 1 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
## 2 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
## 3 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
## 4 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
## 5 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
## 6 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
##   distance_to_TRX distance_to_KLCC distance_to_BukitBintang
## 1           10.73           11.509                   10.163
## 2           10.73           11.509                   10.163
## 3           10.73           11.509                   10.163
## 4           10.73           11.509                   10.163
## 5           10.73           11.509                   10.163
## 6           10.73           11.509                   10.163
##   Popular_location_distance near_public_transport
## 1                  10.80067                     1
## 2                  10.80067                     1
## 3                  10.80067                     1
## 4                  10.80067                     1
## 5                  10.80067                     1
## 6                  10.80067                     1

Univariate Analysis

Univariate analysis focuses on understanding the distribution and characteristics of individual variables within the dataset. This includes examining variables such as monthly rent, property size, number of rooms, and furnishing status. Visualizations like histograms, bar charts, and summary statistics are used to identify patterns, outliers, and data skewness, providing valuable insights for feature selection and modeling.

Histogram of Monthly Rent

This section shows a histogram of monthly rent. The diagram below will be only consist of the monthly rent that is below than 5000 MYR (<= 5000). Based on the summary results, the upper bound is about 2,100 (MYR), therefore splitting into parts below 5,000 (MYR) able provides a visualization on the monthly pricing, and exclude the outliers.

In addition, the most common rent range as observe will be between RM1000 to RM2000 this indicate that majority of the available accommodations will be fall within this price range in KL and Selangor area. In other words, this indicate at this range are more affordable for the people.

hist_data <- (df_EDA$monthly_rent)
summary(hist_data) #Show the summary
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      70    1300    1600    2574    2100 2400000
hist_data_below <- hist_data[hist_data < 5000]

hist(
  hist_data_below, xlab = "Monthly Accommodation Rent (MYR)", main = "Monthly Accommodation Rent Distribution (< 5k)",
  col = "#A8E4A0", border = "black", breaks = 40
)

Histogram of Property Size

This section shows a histogram of size. The diagram below will be only consist of the property size that is below than 3000 sq ft (<= 3000). Based on the summary results, the upper bound is about 1,100 (sq ft).

From the observation, most of the available property/accommodation will be falls into 700 to 1200 sq ft. Commonly, the size of the property will be around 750 sq ft to 1200 sq ft. In addition, most of the property size for rent is mostly available on 800 to 900 sq ft. This shows that in urban areas, more real estate developers focus more on urban development, since largest area means highest rent.

hist_data_size <- (df_EDA$size)
summary(hist_data_size) #Show the summary
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##        1      800      936     8235     1100 99999999
hist_data_size_below <- hist_data_size[hist_data_size < 3000]

hist(
  hist_data_size_below, xlab = "Property Size (sq ft)", main = "Property Size Distribution (< 3,000)",
  col = "#A8E4A0", border = "black", breaks = 30
)

Bar Chart of Property Attributes

This section plot horizontal bar graphs to illustrate the frequency/count of parking, rooms, bathroom, completion_year.

  1. parking: Present from 0 to 10, majority of the rent estate will be giving at least 1 car parking slot, but some provide 0 or 2 parking slot for tenant.

  2. rooms: Illustrate that the accommodation/property are build as studio, single room, two room and mostly three room.

  3. bathroom: Illustrate that for the majority of accommodation/property will having 2 bathroom. Since, majority of rooms is between 1 to 3, so that typically it will have 1 or 2 bathrooms.

  4. completion_year: This show that massive of accommodation/property was starting arise after 2012. 2014 to 2022 is the peak period, indicating that due to the development of the city, the demand for accommodation is also rising.

plot_bar_chart_char <- function(bar_chart_columns) {
  
  for (col in bar_chart_columns) {
    counts_data <- df_EDA[[col]]
  
    unique(df_EDA$col)
    
    # Count occurrences
    category_counts <- table(counts_data)
    
    # Plot horizontal bar chart
    barplot(category_counts,
            col = "skyblue",
            main = paste("Accommodation" , col, "Distribution"),
            xlab = "Count")
  }
}

bar_chart_columns <- c("parking", "rooms", "bathroom", "completion_year")
plot_bar_chart_char(bar_chart_columns)

Bivariate Analysis

Pie Chart of Property Type

In this project, the team will focus on two types of properties: apartments and serviced residences, as the target tenants are students and office workers. From the pie chart, can observe that the market prefers apartments more, has the largest proportion of 61.4%, while serviced residences proportion of 38.6%.

property_data <- df_EDA %>% count(property_type)

ggplot(property_data, aes(x = "", y = n, fill = property_type)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(round(n / sum(n) * 100, 1), "%")), position = position_stack(vjust = 0.5)) + 
  labs(title = "Property Type") +
  theme(legend.title = element_blank())

Pie Chart of Near Public Transport

In this pie chart, from observation can be indicate that majority of the accommodation/property are not closing to the public transport (59.7%), but 40.3% of the accommodation/properties are close to public transportation. The gap between the two is around 19%, which is not a big gap, which means that most of the accommodation/properties try to be built near public transportation.

near_public_transport_data <- df_EDA %>% count(near_public_transport)

near_public_transport_data$near_public_transport[near_public_transport_data$near_public_transport == 0] <- "No"
near_public_transport_data$near_public_transport[near_public_transport_data$near_public_transport == 1] <- "Yes"

ggplot(near_public_transport_data, aes(x = "", y = n, fill = near_public_transport)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(round(n / sum(n) * 100, 1), "%")), position = position_stack(vjust = 0.5)) + 
  labs(title = "Near Public Transport") +
  theme(legend.title = element_blank())

Pie Chart of Furnished Type

This pie chart illustrate the distribution of the furnished type as “Fully Furnished”, “Not Furnished”, and “Partially Furnished”. From the observation, that most houses/properties provide tenants with fully furnished/partially furnished, with the results showing that 52.4% of accommodation/properties provide fully furnished, 38.2% of houses/properties provide partially furnished, and 9.4% of houses/properties do not provide any furniture.

furnished_data <- df_EDA %>% count(furnished)

ggplot(furnished_data, aes(x = "", y = n, fill = furnished)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(round(n / sum(n) * 100, 1), "%")), position = position_stack(vjust = 0.5)) + 
  labs(title = "Furnished Type") +
  theme(legend.title = element_blank())

Multivariate Analysis

BoxPlot - Two Relationship

In this section, the team will using boxplot to understand the relationship between monthly rent and property size. The boxplot is filtered based on the upper range to provide a clear visualization.

In the diagram show below, it clearly show a positive trend as the size increase the monthly rent also getting increase. This indicate the size of the accommodation/property will be related to the rent. In addition, there is outlines above and below of the box plot suggest that some properties may be high-end listings or quick-rent properties that are older and poorly maintained.

#Define the bin size 
breaks <- seq(0, 3000, by = 500)
rent_size_label <- paste(head(breaks, -1), tail(breaks, -1), sep = "–") #Set the rent_size range ([0],[1])

# Filter the size < 3000 and rent < 5000
boxplot_data_filter <- df_EDA %>%
  filter(size < 3000, monthly_rent < 5000) %>%
  mutate(property_size_bin = cut(size, breaks = breaks, labels = rent_size_label))

# Box plot: Size by Rent Range
ggplot(boxplot_data_filter, aes(x = property_size_bin, y = monthly_rent)) +
  geom_boxplot(fill = "#87CEFA", color = "#4682B4", outlier.alpha = 0.3) +
  labs(
    title = "Property Size Distribution by Monthly Accommodation Rent Range",
    x = "Property Size (sq ft)",
    y = "Monthly Rent Range (MYR)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(hjust = 0.5))

In this section, present the top 20 frequency locations that appear inside the dataset, which also reflect where the majority of the accommodation/properties are built and located. In addition, from the observation that areas like Mont Kiara or KLCC contain higher rent per month, and like Kajang, Cyberjaya, or Cheras which giving more affordable rent for lower budgets renters.

# Filter the data
most_frequent_locations <- df_EDA %>%
  count(location, sort = TRUE) #Find the most frequency location

#Filter top 20 location and < 5000 money rent
boxplot_data_filter <- df_EDA %>%
  filter(monthly_rent < 5000, location %in% most_frequent_locations$location[0:20])

ggplot(boxplot_data_filter, aes(x = reorder(location, monthly_rent, median), y = monthly_rent)) +
  geom_boxplot(fill = "#87CEFA", color = "#4682B4", outlier.alpha = 0.3) +
  labs(
    title = "Monthly Accommodation Rent Distribution by Top 20 Locations",
    x = "Location",
    y = "Monthly Rent (MYR)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

This box plot shows the development of the property market from 1950 to 2025. Overall, from 1980 to 2025, it can be observed that the average price of monthly rental is about RM1,400 to RM1,600, while after 2015, the rental trend becomes more stable due to more new properties entering the market.

#Arrange completion year and < 5000 money rent
boxplot_data_filter <- df_EDA %>%
  mutate(completion_year = as.integer(completion_year)) %>%
  filter(monthly_rent < 5000) %>%
  arrange(completion_year) 

#Using factor() arrange into categories type (Grouping)
boxplot_data_filter$completion_year <- factor(
  boxplot_data_filter$completion_year
) 

ggplot(boxplot_data_filter, aes(x = completion_year, y = monthly_rent)) +
  geom_boxplot(fill = "#87CEFA", color = "#4682B4", outlier.alpha = 0.3) +
  labs(
    title = "Distribution of Monthly Rent Based on Property Completion Year",
    x = "Year",
    y = "Monthly Rent (MYR)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

In this boxplot illustrate that the monlthy rents will follow the furnished to increase, it indicate that an accommodation/property with fully furnished will have the average that is above RM1,500 and for partially furnished will be around RM1,300 and above, then for not furnished the overall average will be the lowest as around RM1,000 and above. However, this also shows that for landlords, fully furnished tenants are more willing to rent out their properties because it also provides more convenience for students and workers tenants, and tenants do not need to make further purchases.

#Filter < 5000 money rent
boxplot_data_filter <- df_EDA %>%
  filter(monthly_rent < 5000)

ggplot(boxplot_data_filter, aes(x = reorder(furnished, monthly_rent, median), y = monthly_rent)) +
  geom_boxplot(fill = "#87CEFA", color = "#4682B4", outlier.alpha = 0.3) +
  labs(
    title = "Monthly Accommodation Rent Distribution by Furnished Type",
    x = "Furnished Type",
    y = "Monthly Rent (MYR)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Correlation Matrix

This section showcase a correlation matrix between each feature.

heatmap_data <- df_EDA %>%
  select(where(is.numeric)) #Select only numeric data (remove such as prop_name, e.g.)

heatmap_data <- heatmap_data %>% select(-ads_id)  #Remove ads_id

corr_data <- cor(heatmap_data, use = "complete.obs") #Transfer into numeric (-1 , 1)
melted_corr <- melt(corr_data) #into a format for ggplot
heap_map_color <- colorRampPalette(c("skyblue", "white", "#cc474b"))(200)

# Plot
ggplot(melted_corr, aes(x = Var1, y = Var2, fill = value)) +
  geom_tile(color = "white") +
  geom_text(aes(label = round(value,2)), size = 3) +
  scale_fill_gradientn(colors = heap_map_color, limits = c(-1, 1)) +
  labs(title = "Correlation Matrix", x = NULL, y = NULL) + #Add NULL else will have Var2 and Var1
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(hjust = 0.2, size = 16, face = "bold")
  )

Feature Engineering

df_feature = data.frame(df_EDA) #Make a copy for Data Modelling
head(df_feature)
##     ads_id       prop_name monthly_rent                   location
## 1 16525511 Villa Wangsamas         2000 Kuala Lumpur - Wangsa Maju
## 2 16572317 Villa Wangsamas         1700 Kuala Lumpur - Wangsa Maju
## 3 16717632 Villa Wangsamas         2000 Kuala Lumpur - Wangsa Maju
## 4 16801236 Villa Wangsamas         2000 Kuala Lumpur - Wangsa Maju
## 5 17122588 Villa Wangsamas         2000 Kuala Lumpur - Wangsa Maju
## 6 17465265 Villa Wangsamas         2000 Kuala Lumpur - Wangsa Maju
##   property_type rooms parking bathroom size           furnished
## 1   Condominium     3       0        3 1267     Fully Furnished
## 2   Condominium     3       0        3 1267 Partially Furnished
## 3   Condominium     3       1        3 1267     Fully Furnished
## 4   Condominium     3       0        3 1267     Fully Furnished
## 5   Condominium     3       0        3 1267     Fully Furnished
## 6   Condominium     3       0        3 1267     Fully Furnished
##                                                                                                                             facilities
## 1 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 2 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 3 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 4 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 5 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 6 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
##                                                additional_facilities
## 1 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine, Internet
## 2                  Air-Cond, Cooking Allowed, Near KTM/LRT, Internet
## 3 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine, Internet
## 4 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine, Internet
## 5 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine, Internet
## 6 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine, Internet
##         region completion_year                              full_location
## 1 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
## 2 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
## 3 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
## 4 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
## 5 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
## 6 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
##   distance_to_TRX distance_to_KLCC distance_to_BukitBintang
## 1           10.73           11.509                   10.163
## 2           10.73           11.509                   10.163
## 3           10.73           11.509                   10.163
## 4           10.73           11.509                   10.163
## 5           10.73           11.509                   10.163
## 6           10.73           11.509                   10.163
##   Popular_location_distance near_public_transport
## 1                  10.80067                     1
## 2                  10.80067                     1
## 3                  10.80067                     1
## 4                  10.80067                     1
## 5                  10.80067                     1
## 6                  10.80067                     1

In this section, the team will filter outliers from the dataset. Based on the early indications from the histogram and boxplot, most monthly rents are below $5,000, housing size is below $3,000, and the room, package, and bathroom sizes are below 6, 4, and 4, respectively. Therefore, the team will filter the data to try to keep a large sample size within the dataset.

df_feature <- df_feature %>% filter(monthly_rent > 400 & monthly_rent < 5000)
df_feature <- df_feature %>% filter(size > 100 & size < 3000)
df_feature <- df_feature %>% filter(rooms > 0 & rooms < 6)
df_feature <- df_feature %>% filter(parking > 0 & parking < 4)
df_feature <- df_feature %>% filter(bathroom > 0 & bathroom < 4)

head(df_feature)
##     ads_id       prop_name monthly_rent                      location
## 1 16717632 Villa Wangsamas         2000    Kuala Lumpur - Wangsa Maju
## 2 18186927 Villa Wangsamas         2000    Kuala Lumpur - Wangsa Maju
## 3 18677373 Villa Wangsamas         2000    Kuala Lumpur - Wangsa Maju
## 4 42927744  Majestic Maxim          900         Kuala Lumpur - Cheras
## 5 44085509                         1400 Kuala Lumpur - Old Klang Road
## 6 45057687                         1200          Selangor - Shah Alam
##       property_type rooms parking bathroom size           furnished
## 1       Condominium     3       1        3 1267     Fully Furnished
## 2       Condominium     3       1        3 1267     Fully Furnished
## 3       Condominium     3       1        3 1267     Fully Furnished
## 4 Service Residence     3       1        2  780       Not Furnished
## 5 Service Residence     1       1        2  775     Fully Furnished
## 6       Condominium     2       1        2  759 Partially Furnished
##                                                                                                                             facilities
## 1 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 2 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 3 Parking, Security, Lift, Swimming Pool, Playground, Gymnasium, Barbeque area, Minimart, Multipurpose hall, Club house, Jogging Track
## 4                                          Parking, Playground, Jogging Track, Security, Lift, Barbeque area, Swimming Pool, Gymnasium
## 5                                                            Swimming Pool, Jogging Track, Security, Barbeque area, Parking, Gymnasium
## 6                          Swimming Pool, Gymnasium, Tennis Court, Squash Court, Minimart, Playground, Jogging Track, Security, 10, 11
##                                                additional_facilities
## 1 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine, Internet
## 2 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine, Internet
## 3 Air-Cond, Cooking Allowed, Near KTM/LRT, Washing Machine, Internet
## 4                  Air-Cond, Cooking Allowed, Near KTM/LRT, Internet
## 5                                                           Air-Cond
## 6                                Air-Cond, Cooking Allowed, Internet
##         region completion_year                              full_location
## 1 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
## 2 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
## 3 Kuala Lumpur            2010 Kuala Lumpur - Wangsa Maju,Villa Wangsamas
## 4 Kuala Lumpur            2021       Kuala Lumpur - Cheras,Majestic Maxim
## 5 Kuala Lumpur            2016             Kuala Lumpur - Old Klang Road,
## 6     Selangor            2015                      Selangor - Shah Alam,
##   distance_to_TRX distance_to_KLCC distance_to_BukitBintang
## 1          10.730           11.509                   10.163
## 2          10.730           11.509                   10.163
## 3          10.730           11.509                   10.163
## 4          10.679           10.102                    9.925
## 5          11.700            6.693                    8.721
## 6          29.939           24.767                   26.795
##   Popular_location_distance near_public_transport
## 1                  10.80067                     1
## 2                  10.80067                     1
## 3                  10.80067                     1
## 4                  10.23533                     1
## 5                   9.03800                     0
## 6                  27.16700                     0

In this section, the team will perform coverting process on the dataset to prepare it for data modelling. Firstly, the team will recode the furnished column transforming the string value into numeric values “Fully Furnished” is assigned 1, “Partially Furnished” is 2, and “Not Furnished” is 3. Similar r ecode for the property type “Condominium” becomes 1 and “Service Residence” becomes 0.

Next, the team will create a new column for calculate the year built from the current year, and forming “property_age” column. Then will combines the facilities and additional facilities columns into a single column, after that removing corruption data such as containing numebric, only keep as valid character of form. In addition, calculate the number of facilities and stored inside a new column “number_facilities”.

# Make a copy (assuming df_feature exists)
df_feature_prepare = data.frame(df_feature)

# ---------------------------------------------------------------------------------
# Recode 'furnished' column
df_feature_prepare$furnished <- df_feature_prepare$furnished %>%
  recode(
    "Fully Furnished" = 1,
    "Partially Furnished" = 2,
    "Not Furnished" = 3
  ) %>%
  as.numeric()


# ---------------------------------------------------------------------------------
# Recode 'property_type'
df_feature_prepare$property_type <- df_feature_prepare$property_type %>%
  recode(
    "Condominium" = 1,
    "Service Residence" = 0
  ) %>%
  as.numeric()

# ---------------------------------------------------------------------------------
# Transform the 'completion_year' column to age of the property
current_year <- 2025
df_feature_prepare$property_age <- current_year - df_feature_prepare$completion_year

# ---------------------------------------------------------------------------------
# Combine both 'facilities' and 'additional facilities' columns

# Ensure both columns are character type before pasting to avoid issues with factors
df_feature_prepare$facilities <- as.character(df_feature_prepare$facilities)
df_feature_prepare$additional_facilities <- as.character(df_feature_prepare$additional_facilities)

# Column combining
df_combined_facilities <- df_feature_prepare %>%
  mutate(facilities_combined = paste(facilities, additional_facilities, sep = ", "))
# ---------------------------------------------------------------------------------

# Remove unwanted characters such as 10, 11, 6 in 'facilities' column
df_combined_facilities$facilities_combined <- gsub("[^a-zA-Z, ]", "", df_combined_facilities$facilities_combined)

# Count the number of facilities from 'facilities_combined'
df_facilities <- df_combined_facilities %>%
  mutate(number_facilities = sapply(strsplit(facilities_combined, ", "), length))

# ---------------------------------------------------------------------------------
#Data Attribute selection
keep_columns <- c("rooms", "parking", "bathroom", "near_public_transport",
                  "monthly_rent", "size", "Popular_location_distance", 
                  "property_type", "furnished", "property_age", "number_facilities"
                  , "location")

# Filter the wanted columns for data modelling
df_final_prepared <- df_facilities %>% select(any_of(keep_columns))

df_final_prepared$location <- factor(df_final_prepared$location)

head(df_final_prepared)
##   rooms parking bathroom near_public_transport monthly_rent size
## 1     3       1        3                     1         2000 1267
## 2     3       1        3                     1         2000 1267
## 3     3       1        3                     1         2000 1267
## 4     3       1        2                     1          900  780
## 5     1       1        2                     0         1400  775
## 6     2       1        2                     0         1200  759
##   Popular_location_distance property_type furnished property_age
## 1                  10.80067             1         1           15
## 2                  10.80067             1         1           15
## 3                  10.80067             1         1           15
## 4                  10.23533             0         3            4
## 5                   9.03800             0         1            9
## 6                  27.16700             1         2           10
##   number_facilities                      location
## 1                16    Kuala Lumpur - Wangsa Maju
## 2                16    Kuala Lumpur - Wangsa Maju
## 3                16    Kuala Lumpur - Wangsa Maju
## 4                12         Kuala Lumpur - Cheras
## 5                 7 Kuala Lumpur - Old Klang Road
## 6                13          Selangor - Shah Alam
heatmap_data <- df_final_prepared %>%
  select(where(is.numeric)) #Select only numeric data (remove such as prop_name, e.g.)

corr_data <- cor(heatmap_data, use = "complete.obs") #Transfer into numeric (-1 , 1)
melted_corr <- melt(corr_data) #into a format for ggplot
heap_map_color <- colorRampPalette(c("skyblue", "white", "#cc474b"))(200)

# Plot
ggplot(melted_corr, aes(x = Var1, y = Var2, fill = value)) +
  geom_tile(color = "white") +
  geom_text(aes(label = round(value,2)), size = 3) +
  scale_fill_gradientn(colors = heap_map_color, limits = c(-1, 1)) +
  labs(title = "Correlation Matrix", x = NULL, y = NULL) + #Add NULL else will have Var2 and Var1
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    plot.title = element_text(hjust = 0.2, size = 16, face = "bold")
  )

Data Modelling

This project involves two separate predictive tasks: estimating rental prices (a regression problem) and classifying furnishing status (a multi-class classification problem). Accordingly, different models are applied for each task to optimize performance. Regression models are used to predict continuous rental prices based on property features, while classification models are trained to categorize listings into furnishing types—fully furnished, partially furnished, or unfurnished. Each model is evaluated using appropriate performance metrics aligned with its predictive objective.

df_model = data.frame(df_final_prepared) #Make a copy for Data Modelling
head(df_model)
##   rooms parking bathroom near_public_transport monthly_rent size
## 1     3       1        3                     1         2000 1267
## 2     3       1        3                     1         2000 1267
## 3     3       1        3                     1         2000 1267
## 4     3       1        2                     1          900  780
## 5     1       1        2                     0         1400  775
## 6     2       1        2                     0         1200  759
##   Popular_location_distance property_type furnished property_age
## 1                  10.80067             1         1           15
## 2                  10.80067             1         1           15
## 3                  10.80067             1         1           15
## 4                  10.23533             0         3            4
## 5                   9.03800             0         1            9
## 6                  27.16700             1         2           10
##   number_facilities                      location
## 1                16    Kuala Lumpur - Wangsa Maju
## 2                16    Kuala Lumpur - Wangsa Maju
## 3                16    Kuala Lumpur - Wangsa Maju
## 4                12         Kuala Lumpur - Cheras
## 5                 7 Kuala Lumpur - Old Klang Road
## 6                13          Selangor - Shah Alam

Data Splitting

Data splitting is performed separately for both targets variables: monthly_rent for the regression model (predicting rental price) and furnished for the classification model (predicting furnishing status).

The dataset is split into training and testing sets. Training sets are used to build model, while testing sets are used to evaluate the model performance. In this case, we split the data into 80% train set and 20% test set. Separate splits are created for each model according to their respective target variable.

Regression Model (Predict Rental Price)

For the regression task, the target variable was monthly_rent. The feature set included standardized property size, property age, furnishing status, proximity to public transport, property type, and one-hot encoded facilities. An 80% portion of the dataset was used to train the regression models, while the remaining 20% was used for testing. This split ensures that the model’s performance metrics—such as RMSE, MAE, MSE, and R²—are evaluated on unseen data, providing a reliable measure of predictive accuracy.

#For reproducibility
set.seed(123) 

#Split in 80/20 for train and test sets
split = 0.80 

Training and testing sets were created using the createDataPartition() function from the caret package. This method ensures that the split maintains the distribution of the target variable, monthly_rent, allowing for a representative and balanced partition between the training and testing datasets.

train_index_regression <- createDataPartition(df_model$monthly_rent, p=split, list=FALSE) 

#Create training and testing datasets
X_train_regression <- df_model[train_index_regression,]%>% select( -monthly_rent)
X_test_regression <- df_model[-train_index_regression,]%>% select(-monthly_rent)

y_train_regression <- df_model$monthly_rent[train_index_regression]
y_test_regression <- df_model$monthly_rent[-train_index_regression]

# Print the shape of X_train_regression and y_train_regression
cat("X_train_regression shape:", dim(X_train_regression), "y_train_regression shape:", length(y_train_regression), "\n")
## X_train_regression shape: 8298 11 y_train_regression shape: 8298
# Print the shape of X_test_regression and y_test_regression
cat("X_test_regression shape:", dim(X_test_regression), "y_test_regression shape:", length(y_test_regression))
## X_test_regression shape: 2072 11 y_test_regression shape: 2072

Classification Model (Predict Furnishing Status)

For the classification task, the target variable is furnished, which includes three categories: fully furnished, partially furnished, and unfurnished. The goal is to predict the furnishing status of a rental unit based on features such as rental price, property size, property type, property age, proximity to public transport, and available facilities. Various classification algorithms were applied, and model performance was evaluated using metrics such as Accuracy, Precision, Recall, F1-Score, and the Confusion Matrix to assess how well each model distinguishes between furnishing categories.

#For reproducibility
set.seed(123) 

#Split in 80/20 for train and test sets
split = 0.80 

#Create train and test sets using createDataPartition
train_index_classification <- createDataPartition(df_model$furnished, p=split, list=FALSE) 

X_train_classification <- df_model[train_index_classification,]%>% select( -furnished)
X_test_classification <- df_model[-train_index_classification,]%>% select( -furnished)

y_train_classification <- df_model$furnished[train_index_classification]
y_test_classification <- df_model$furnished[-train_index_classification]

#Convert target variables to factor (important for classification!)
y_train_classification <- as.factor(y_train_classification)
y_test_classification <- as.factor(y_test_classification)

# Print the shape of X_train_classification and y_train_classification for 
cat("X_train_classification shape:", dim(X_train_classification), "y_train_classification shape:", length(y_train_classification), "\n")
## X_train_classification shape: 8297 11 y_train_classification shape: 8297
# Print the shape of X_test_classification and y_test_classification
cat("X_test_classification shape:", dim(X_test_classification), "y_test_classification shape:", length(y_test_classification))
## X_test_classification shape: 2073 11 y_test_classification shape: 2073

Data Standardization

To prepare the data for modeling, numerical features such as rental price and property size were standardized to ensure consistent scale, improving model performance. Categorical variables like property type and furnishing status were encoded into numeric formats using label encoding, enabling them to be used effectively in machine learning algorithms. These preprocessing steps help ensure the dataset is clean, structured, and model-ready.

#Standardize monthly_rent
mean_y_train <- mean(y_train_regression)
sd_y_train <- sd(y_train_regression)

y_train_regression_scaled <- (y_train_regression - mean_y_train) / sd_y_train
y_test_regression_scaled <- (y_test_regression - mean_y_train) / sd_y_train

#----------------------------------------------------------------------------------
# Calculate mean and standard deviation from training X
#Size
mean_size_train <- mean(X_train_regression$size)
sd_size_train <- sd(X_train_regression$size)

#popular_location_distance
mean_popular_location_distance_train <- mean(X_train_regression$Popular_location_distance)
sd_popular_location_distance_train <- sd(X_train_regression$Popular_location_distance)

#----------------------------------------------------------------------------------
# Apply standardization to both training and test X
#Size
X_train_regression$size_scaled <- (X_train_regression$size - mean_size_train) / sd_size_train
X_test_regression$size_scaled <- (X_test_regression$size - mean_size_train) / sd_size_train

#popular_location_distance regression
X_train_regression$popular_location_distance_scaled <- (X_train_regression$Popular_location_distance - mean_popular_location_distance_train) / sd_popular_location_distance_train
X_test_regression$popular_location_distance_scaled <- (X_test_regression$Popular_location_distance - mean_popular_location_distance_train) / sd_popular_location_distance_train

#popular_location_distance classification
X_train_classification$popular_location_distance_scaled <- (X_train_classification$Popular_location_distance - mean_popular_location_distance_train) / sd_popular_location_distance_train
X_test_classification$popular_location_distance_scaled <- (X_test_classification$Popular_location_distance - mean_popular_location_distance_train) / sd_popular_location_distance_train

#----------------------------------------------------------------------------------
# Label Encoding for location
X_train_regression$location <- as.factor(X_train_regression$location)
X_test_regression$location <- as.factor(X_test_regression$location)

X_train_classification$location <- as.factor(X_train_classification$location)
X_test_classification$location <- as.factor(X_test_classification$location)

#----------------------------------------------------------------------------------
# Get all unique levels from the training set
all_location_levels <- levels(X_train_regression$location)

# Convert to factor with consistent levels, then to numeric
X_train_regression$location_encoded <- as.numeric(factor(X_train_regression$location, levels = all_location_levels))
X_test_regression$location_encoded <- as.numeric(factor(X_test_regression$location, levels = all_location_levels))

X_train_classification$location_encoded <- as.numeric(factor(X_train_classification$location, levels = all_location_levels))

X_test_classification$location_encoded <- as.numeric(factor(X_test_classification$location, levels = all_location_levels))

#----------------------------------------------------------------------------------
# Remove unwanted columns ---
X_train_regression <- X_train_regression %>%
  select(-size, -Popular_location_distance, -location)

X_test_regression <- X_test_regression %>%
  select(-size, -Popular_location_distance, -location)

X_train_classification <- X_train_classification %>%
  select(-size, -Popular_location_distance, -location) 

X_test_classification <- X_test_classification %>%
  select(-size, -Popular_location_distance, -location)

#----------------------------------------------------------------------------------
#Display the output
head(X_train_regression)
##   rooms parking bathroom near_public_transport property_type furnished
## 2     3       1        3                     1             1         1
## 3     3       1        3                     1             1         1
## 4     3       1        2                     1             0         3
## 5     1       1        2                     0             0         1
## 6     2       1        2                     0             1         2
## 8     4       2        3                     1             1         2
##   property_age number_facilities size_scaled popular_location_distance_scaled
## 2           15                16   1.1734547                       -0.6599182
## 3           15                16   1.1734547                       -0.6599182
## 4            4                12  -0.6612357                       -0.7142773
## 5            9                 7  -0.6800723                       -0.8294058
## 6           10                13  -0.7403496                        0.9137711
## 8            8                19   1.7686931                       -0.1196606
##   location_encoded
## 2               56
## 3               56
## 4               10
## 5               31
## 6              106
## 8               67
head(X_train_classification)
##   rooms parking bathroom near_public_transport monthly_rent property_type
## 1     3       1        3                     1         2000             1
## 2     3       1        3                     1         2000             1
## 3     3       1        3                     1         2000             1
## 5     1       1        2                     0         1400             0
## 6     2       1        2                     0         1200             1
## 8     4       2        3                     1         1100             1
##   property_age number_facilities popular_location_distance_scaled
## 1           15                16                       -0.6599182
## 2           15                16                       -0.6599182
## 3           15                16                       -0.6599182
## 5            9                 7                       -0.8294058
## 6           10                13                        0.9137711
## 8            8                19                       -0.1196606
##   location_encoded
## 1               56
## 2               56
## 3               56
## 5               31
## 6              106
## 8               67

Model Training

In this section, the respective training sets are used to build predictive models for both regression and classification tasks. Various machine learning algorithms are applied to each task to identify the most effective approach. For the regression model, algorithms aim to predict rental prices, while for the classification model, algorithms are trained to predict the furnishing status of a property. Each model is trained using the features selected during preprocessing and is later evaluated on the corresponding test set.

#Cross-validation 
train_ctrl <- trainControl(
  method = "cv",
  number = 5, 
  verboseIter   = TRUE, #Provide detailed, real-time feedback on training process
  savePredictions = "final" #To save out-of-sample predictions from the final model
)

#For Regression metrics
regression_metrics <- c("MAE", "MSE", "RMSE", "R²")

#For Classification metrics
classification_metrics <- c("Accuracy", "Precision", "Recall", "F1-score", "AUC-ROC", "Kappa")

Regression Model (Predict Rental Price)

For the regression task, several machine learning algorithms were trained to predict monthly rental prices using key property features. These features include standardized property size, furnishing status, proximity to public transport, property type, property age, and available facilities. The models applied include Linear Regression, Decision Tree, XGBoost, LightGBM, Neural Networks.

Each model was evaluated using standard regression metrics:

  • Root Mean Squared Error (RMSE): Measures the average magnitude of prediction errors.

  • Mean Absolute Error (MAE): Reflects the average absolute difference between actual and predicted values.

  • Mean Squared Error (MSE): Highlights larger errors by squaring the differences.

  • R-squared (R²): Indicates how well the model explains the variance in rental prices.

These metrics provide a comprehensive view of each model’s predictive performance and help identify the most effective approach for rental price estimation.

Linear Regression Model

Linear Regression is a fundamental and interpretable algorithm used to model the relationship between a continuous target variable and one or more input features. In this case, it is used to estimate monthly rental prices based on property characteristics. The model assumes a linear relationship between the predictors and the target variable. While it serves as a good baseline model, its performance may be limited when capturing complex, non-linear patterns in the data.

#Train Linear Regression model
lm_model <- train (
  x = X_train_regression, 
  y = y_train_regression, 
  method = "lm", 
  trControl = train_ctrl,
  metric = "RMSE" #train() can only accept one metric at a time
)
## + Fold1: intercept=TRUE 
## - Fold1: intercept=TRUE 
## + Fold2: intercept=TRUE 
## - Fold2: intercept=TRUE 
## + Fold3: intercept=TRUE 
## - Fold3: intercept=TRUE 
## + Fold4: intercept=TRUE 
## - Fold4: intercept=TRUE 
## + Fold5: intercept=TRUE 
## - Fold5: intercept=TRUE 
## Aggregating results
## Fitting final model on full training set
#Prediction
lm_prediction <- predict(lm_model, X_test_regression)

#Evaluate model performance
lm_rmse <- RMSE(lm_prediction, y_test_regression)
lm_r2 <- R2(lm_prediction, y_test_regression)
lm_mae <- MAE(lm_prediction, y_test_regression)
lm_mse <- (lm_rmse)^2


cat("Linear Regression RMSE: ", lm_rmse, "\n")
## Linear Regression RMSE:  494.044
cat("Linear Regression R²: ", lm_r2, "\n")
## Linear Regression R²:  0.4980524
cat("Linear Regression MAE: ", lm_mae, "\n")
## Linear Regression MAE:  362.2548
cat("Linear Regression MSE: ", lm_mse, "\n")
## Linear Regression MSE:  244079.5

XGBoost Model

XGBoost (Extreme Gradient Boosting) is a powerful ensemble learning algorithm based on gradient boosting techniques. It builds a series of decision trees where each tree corrects the errors of the previous one. XGBoost is known for its high performance, speed, and ability to handle complex relationships in data. In this project, XGBoost was used to predict monthly rental prices based on various property features. It often outperforms simpler models by capturing non-linear patterns and interactions between variables, making it suitable for structured tabular data.

#Train XGBoost model
xgb_model <- train (
  x = X_train_regression, 
  y = y_train_regression, 
  method = "xgbTree", 
  trControl = train_ctrl,
  metric = "RMSE" #train() can only accept one metric at a time
)
## + Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:34:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:34:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:34:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:34:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:07] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:07] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:31] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:31] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:35] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:35] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:35] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:35] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:35:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:35:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:35:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:35:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:36:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:36:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:36:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:36:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:36:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## Aggregating results
## Selecting tuning parameters
## Fitting nrounds = 150, max_depth = 3, eta = 0.4, gamma = 0, colsample_bytree = 0.8, min_child_weight = 1, subsample = 1 on full training set
#Prediction
xgb_prediction <- predict(xgb_model, X_test_regression)

#Evaluate model performance
xgb_rmse <- RMSE(xgb_prediction, y_test_regression)
xgb_r2 <- R2(xgb_prediction, y_test_regression)
xgb_mae <- MAE(xgb_prediction, y_test_regression)
xgb_mse <- (xgb_rmse)^2

cat("XGBoost RMSE: ", xgb_rmse, "\n")
## XGBoost RMSE:  310.9766
cat("XGBoost R²: ", xgb_r2, "\n")
## XGBoost R²:  0.8008478
cat("XGBoost MAE: ", xgb_mae, "\n")
## XGBoost MAE:  219.3333
cat("XGBoost MSE: ", xgb_mse, "\n")
## XGBoost MSE:  96706.44

LightGBM Model

LightGBM (Light Gradient Boosting Machine) is a gradient boosting framework developed for efficiency and scalability. It uses a leaf-wise tree growth strategy, which enables faster training and improved accuracy compared to traditional level-wise approaches. In this project, LightGBM was applied to predict monthly rental prices using property-related features. It is particularly effective for handling large datasets with many features and can capture complex, non-linear relationships, making it a strong performer in regression tasks.

#Convert to matrix format
lgb_train_data <- lgb.Dataset(data = as.matrix(X_train_regression), label = y_train_regression)

#Training contrl for LightGBM model
lgb_train_ctrl <- list(
  objective = "regression",  
  metric = "rmse",            #RMSE metric
  num_leaves = 31,            #Number of leaves in each tree
  learning_rate = 0.05,       #Learning rate
  nrounds = 100               #Number of boosting rounds

)

#Train LightGBM model 
lgb_model <- lgb.train(
  params = lgb_train_ctrl,
  data = lgb_train_data,
  nrounds = lgb_train_ctrl$nrounds
)
## [LightGBM] [Info] Auto-choosing col-wise multi-threading, the overhead of testing was 0.001518 seconds.
## You can set `force_col_wise=true` to remove the overhead.
## [LightGBM] [Info] Total Bins 697
## [LightGBM] [Info] Number of data points in the train set: 8298, number of used features: 11
## [LightGBM] [Info] Start training from score 1750.277898
#Prediction
lgb_prediction <- predict(lgb_model, as.matrix (X_test_regression))

#Evaluate model performance
lgb_rmse <- RMSE(lgb_prediction, y_test_regression)
lgb_r2 <- R2(lgb_prediction, y_test_regression)
lgb_mae <- MAE(lgb_prediction, y_test_regression)
lgb_mse <- (lgb_rmse)^2

cat("LightGBM RMSE: ", lgb_rmse, "\n")
## LightGBM RMSE:  325.1751
cat("LightGBM R²: ", lgb_r2, "\n")
## LightGBM R²:  0.7863046
cat("LightGBM MAE: ", lgb_mae, "\n")
## LightGBM MAE:  233.5846
cat("LightGBM MSE: ", lgb_mse, "\n")
## LightGBM MSE:  105738.8

Decision Tree Model

The Decision Tree model is a simple yet powerful algorithm that splits the data into branches based on feature values, forming a tree-like structure. It makes predictions by learning decision rules inferred from the input features. In this project, the Decision Tree model was used to predict monthly rental prices based on property characteristics. While easy to interpret and visualize, decision trees can be prone to overfitting, especially on noisy datasets. However, they provide a useful baseline and can reveal important decision paths in the data.

#Train Decision Tree model
dt_model <- train (
  x = X_train_regression, 
  y = y_train_regression, 
  method = "rpart", 
  trControl = train_ctrl,
  metric = "RMSE" #train() can only accept one metric at a time
)
## + Fold1: cp=0.049 
## - Fold1: cp=0.049 
## + Fold2: cp=0.049 
## - Fold2: cp=0.049 
## + Fold3: cp=0.049 
## - Fold3: cp=0.049 
## + Fold4: cp=0.049 
## - Fold4: cp=0.049 
## + Fold5: cp=0.049 
## - Fold5: cp=0.049
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo,
## : There were missing values in resampled performance measures.
## Aggregating results
## Selecting tuning parameters
## Fitting cp = 0.049 on full training set
#Prediction
dt_prediction <- predict(dt_model, X_test_regression)

#Evaluate model performance
dt_rmse <- RMSE(dt_prediction, y_test_regression)
dt_r2 <- R2(dt_prediction, y_test_regression)
dt_mae <- MAE(dt_prediction, y_test_regression)
dt_mse <- (dt_rmse)^2

cat("Decision Tree RMSE: ", dt_rmse, "\n")
## Decision Tree RMSE:  596.4183
cat("Decision Tree R²: ", dt_r2, "\n")
## Decision Tree R²:  0.2667037
cat("Decision Tree MAE: ", dt_mae, "\n")
## Decision Tree MAE:  433.2508
cat("Decision Tree MSE: ", dt_mse, "\n")
## Decision Tree MSE:  355714.8

Neural Network Model

Neural Networks are inspired by the structure of the human brain and are capable of modeling complex, non-linear relationships between inputs and outputs. In this project, a Neural Network was trained to predict monthly rental prices using property-related features. The model consists of interconnected layers of nodes (neurons) that learn feature representations through weighted connections. Neural Networks are particularly powerful for capturing hidden patterns in the data, but they require careful tuning and are less interpretable compared to tree-based models. When properly optimized, they can deliver strong predictive performance in regression tasks.

#Train Neural Network model
nn_model <- train (
  x = X_train_regression, 
  y = y_train_regression, 
  method = "nnet", 
  trControl = train_ctrl,
  metric = "RMSE", #train() can only accept one metric at a time
  trace = FALSE #To suppress the training output
)
## + Fold1: size=1, decay=0e+00 
## - Fold1: size=1, decay=0e+00 
## + Fold1: size=3, decay=0e+00 
## - Fold1: size=3, decay=0e+00 
## + Fold1: size=5, decay=0e+00 
## - Fold1: size=5, decay=0e+00 
## + Fold1: size=1, decay=1e-01 
## - Fold1: size=1, decay=1e-01 
## + Fold1: size=3, decay=1e-01 
## - Fold1: size=3, decay=1e-01 
## + Fold1: size=5, decay=1e-01 
## - Fold1: size=5, decay=1e-01 
## + Fold1: size=1, decay=1e-04 
## - Fold1: size=1, decay=1e-04 
## + Fold1: size=3, decay=1e-04 
## - Fold1: size=3, decay=1e-04 
## + Fold1: size=5, decay=1e-04 
## - Fold1: size=5, decay=1e-04 
## + Fold2: size=1, decay=0e+00 
## - Fold2: size=1, decay=0e+00 
## + Fold2: size=3, decay=0e+00 
## - Fold2: size=3, decay=0e+00 
## + Fold2: size=5, decay=0e+00 
## - Fold2: size=5, decay=0e+00 
## + Fold2: size=1, decay=1e-01 
## - Fold2: size=1, decay=1e-01 
## + Fold2: size=3, decay=1e-01 
## - Fold2: size=3, decay=1e-01 
## + Fold2: size=5, decay=1e-01 
## - Fold2: size=5, decay=1e-01 
## + Fold2: size=1, decay=1e-04 
## - Fold2: size=1, decay=1e-04 
## + Fold2: size=3, decay=1e-04 
## - Fold2: size=3, decay=1e-04 
## + Fold2: size=5, decay=1e-04 
## - Fold2: size=5, decay=1e-04 
## + Fold3: size=1, decay=0e+00 
## - Fold3: size=1, decay=0e+00 
## + Fold3: size=3, decay=0e+00 
## - Fold3: size=3, decay=0e+00 
## + Fold3: size=5, decay=0e+00 
## - Fold3: size=5, decay=0e+00 
## + Fold3: size=1, decay=1e-01 
## - Fold3: size=1, decay=1e-01 
## + Fold3: size=3, decay=1e-01 
## - Fold3: size=3, decay=1e-01 
## + Fold3: size=5, decay=1e-01 
## - Fold3: size=5, decay=1e-01 
## + Fold3: size=1, decay=1e-04 
## - Fold3: size=1, decay=1e-04 
## + Fold3: size=3, decay=1e-04 
## - Fold3: size=3, decay=1e-04 
## + Fold3: size=5, decay=1e-04 
## - Fold3: size=5, decay=1e-04 
## + Fold4: size=1, decay=0e+00 
## - Fold4: size=1, decay=0e+00 
## + Fold4: size=3, decay=0e+00 
## - Fold4: size=3, decay=0e+00 
## + Fold4: size=5, decay=0e+00 
## - Fold4: size=5, decay=0e+00 
## + Fold4: size=1, decay=1e-01 
## - Fold4: size=1, decay=1e-01 
## + Fold4: size=3, decay=1e-01 
## - Fold4: size=3, decay=1e-01 
## + Fold4: size=5, decay=1e-01 
## - Fold4: size=5, decay=1e-01 
## + Fold4: size=1, decay=1e-04 
## - Fold4: size=1, decay=1e-04 
## + Fold4: size=3, decay=1e-04 
## - Fold4: size=3, decay=1e-04 
## + Fold4: size=5, decay=1e-04 
## - Fold4: size=5, decay=1e-04 
## + Fold5: size=1, decay=0e+00 
## - Fold5: size=1, decay=0e+00 
## + Fold5: size=3, decay=0e+00 
## - Fold5: size=3, decay=0e+00 
## + Fold5: size=5, decay=0e+00 
## - Fold5: size=5, decay=0e+00 
## + Fold5: size=1, decay=1e-01 
## - Fold5: size=1, decay=1e-01 
## + Fold5: size=3, decay=1e-01 
## - Fold5: size=3, decay=1e-01 
## + Fold5: size=5, decay=1e-01 
## - Fold5: size=5, decay=1e-01 
## + Fold5: size=1, decay=1e-04 
## - Fold5: size=1, decay=1e-04 
## + Fold5: size=3, decay=1e-04 
## - Fold5: size=3, decay=1e-04 
## + Fold5: size=5, decay=1e-04 
## - Fold5: size=5, decay=1e-04
## Warning in nominalTrainWorkflow(x = x, y = y, wts = weights, info = trainInfo,
## : There were missing values in resampled performance measures.
## Aggregating results
## Selecting tuning parameters
## Fitting size = 1, decay = 0.1 on full training set
#Prediction
nn_prediction <- predict(nn_model, X_test_regression)

#Evaluate model performance
nn_rmse <- RMSE(nn_prediction, y_test_regression)
nn_r2 <- R2(nn_prediction, y_test_regression)
## Warning in cor(obs, pred, use = ifelse(na.rm, "complete.obs", "everything")):
## the standard deviation is zero
nn_mae <- MAE(nn_prediction, y_test_regression)
nn_mse <- (nn_rmse)^2

cat("Neural Network RMSE: ", nn_rmse, "\n")
## Neural Network RMSE:  1891.378
cat("Neural Network R²: ", nn_r2, "\n")
## Neural Network R²:  NA
cat("Neural Network MAE: ", nn_mae, "\n")
## Neural Network MAE:  1758.518
cat("Neural Network MSE: ", nn_mse, "\n")
## Neural Network MSE:  3577312

Classification Model (Predict Furnishing Status)

For the classification task, several machine learning algorithms were trained to predict the furnishing status of a property, which includes three categories: fully furnished, partially furnished, and unfurnished. The models applied include Logistic Regression, Decision Tree, Neural Network, XGBoost, LightGBM.

These models were trained using key property features such as rental price, property size, property type, property age, proximity to public transport, and available facilities. These features were selected based on their potential influence on furnishing conditions and availability.

mance was evaluated using standard classification metrics:

  • Accuracy: Proportion of total correct predictions.

  • Precision: Proportion of correctly predicted positives out of all predicted positives.

  • Recall: Proportion of actual positives that were correctly predicted.

  • F1-Score: Harmonic mean of precision and recall.

  • Confusion Matrix: Detailed breakdown of true vs. predicted classifications for each furnishing category.

These metrics help assess each model’s ability to accurately distinguish between furnishing types and support the selection of the most reliable classification approach.

XGBoost Model

In this classification task, XGBoost was used to predict the furnishing status of rental properties based on key features such as rental price, property size, property type, property age, proximity to public transport, and available facilities. The model builds a series of decision trees, where each tree attempts to correct the errors of the previous ones. Its robustness and ability to handle complex relationships make it a strong performer in multi-class classification tasks like this one.

#Train XGBoost model
xgb_class_model <- train (
  x = X_train_classification, 
  y = y_train_classification, 
  method = "xgbTree", 
  trControl = train_ctrl,
  metric = "Accuracy" #train() can only accept one metric at a time
)
## + Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:36:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:36:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:36:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:36:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:36:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:36:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:36:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:36:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:36:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:36:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:36:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:36:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:36:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:36:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:36:35] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:35] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:36:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:36:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:36:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:36:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:36:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:36:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:36:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:36:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:36:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:36:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:36:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:36:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:36:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:36:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:36:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:36:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:36:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:36:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:36:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:36:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold1: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:07] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:07] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:31] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:31] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold2: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:54] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:37:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:37:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:57] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:37:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:37:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:00] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:07] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:07] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:12] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:16] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:19] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:22] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold3: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:29] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:31] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:31] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:35] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:35] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:38] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:41] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:43] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:45] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:46] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:47] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:48] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:49] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:50] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:51] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:52] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:53] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:55] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:38:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:56] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:38:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:58] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:38:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:38:59] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:39:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:01] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:39:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:02] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold4: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:39:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:03] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:39:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:04] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:39:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:39:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:05] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:39:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:06] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:39:07] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:07] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:39:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:08] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:39:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:09] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:39:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:10] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:39:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:11] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:39:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:13] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:39:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:14] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:39:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:15] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:39:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:17] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:39:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:18] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:39:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:20] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:39:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:21] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:39:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:23] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.3, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:39:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:39:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:24] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:39:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:25] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:39:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:26] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:39:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:39:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:27] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=1, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:39:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:28] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:39:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:30] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:39:31] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:31] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:39:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:32] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:39:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:33] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:39:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:34] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=2, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:39:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:36] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:39:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:37] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:39:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:39] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.6, min_child_weight=1, subsample=1.00, nrounds=150 
## + Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## [22:39:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:40] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.50, nrounds=150 
## + Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## [22:39:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:42] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=0.75, nrounds=150 
## + Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## [22:39:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## [22:39:44] WARNING: src/c_api/c_api.cc:935: `ntree_limit` is deprecated, use `iteration_range` instead.
## - Fold5: eta=0.4, max_depth=3, gamma=0, colsample_bytree=0.8, min_child_weight=1, subsample=1.00, nrounds=150 
## Aggregating results
## Selecting tuning parameters
## Fitting nrounds = 150, max_depth = 3, eta = 0.4, gamma = 0, colsample_bytree = 0.6, min_child_weight = 1, subsample = 0.75 on full training set
#Prediction
xgb_class_prediction <- predict(xgb_class_model, X_test_classification)

#Evaluate model performance - Confusion Matrix
xgb_class_cm <- confusionMatrix(xgb_class_prediction, y_test_classification)
print (xgb_class_cm)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   1   2   3
##          1 894 198  22
##          2 167 581 117
##          3   6  23  65
## 
## Overall Statistics
##                                           
##                Accuracy : 0.7429          
##                  95% CI : (0.7235, 0.7616)
##     No Information Rate : 0.5147          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.5388          
##                                           
##  Mcnemar's Test P-Value : 3.825e-16       
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity            0.8379   0.7244  0.31863
## Specificity            0.7813   0.7766  0.98448
## Pos Pred Value         0.8025   0.6717  0.69149
## Neg Pred Value         0.8196   0.8171  0.92976
## Prevalence             0.5147   0.3869  0.09841
## Detection Rate         0.4313   0.2803  0.03136
## Detection Prevalence   0.5374   0.4173  0.04534
## Balanced Accuracy      0.8096   0.7505  0.65156

LightGBM Model

For this classification task, LightGBM was used to predict the furnishing status of rental properties using inputs such as rental price, property size, property type, property age, proximity to public transport, and available facilities. The model’s leaf-wise tree growth strategy allows it to capture complex patterns in the data while maintaining high performance. Its support for multi-class classification and ability to handle categorical variables effectively make it well-suited for this prediction task.

# Train LightGBM model
lgb_class_model <- train(
  x = X_train_classification, 
  y = y_train_classification, 
  method = "gbm",  
  trControl = train_ctrl,
  metric = "Accuracy"
)
## + Fold1: shrinkage=0.1, interaction.depth=1, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.0929
##      2        1.0375             nan     0.1000    0.0664
##      3        0.9904             nan     0.1000    0.0518
##      4        0.9552             nan     0.1000    0.0426
##      5        0.9259             nan     0.1000    0.0322
##      6        0.9030             nan     0.1000    0.0285
##      7        0.8834             nan     0.1000    0.0223
##      8        0.8678             nan     0.1000    0.0175
##      9        0.8547             nan     0.1000    0.0170
##     10        0.8423             nan     0.1000    0.0123
##     20        0.7839             nan     0.1000    0.0047
##     40        0.7442             nan     0.1000    0.0010
##     60        0.7257             nan     0.1000    0.0003
##     80        0.7138             nan     0.1000    0.0000
##    100        0.7055             nan     0.1000   -0.0001
##    120        0.6986             nan     0.1000   -0.0000
##    140        0.6935             nan     0.1000   -0.0007
##    150        0.6914             nan     0.1000   -0.0006
## 
## - Fold1: shrinkage=0.1, interaction.depth=1, n.minobsinnode=10, n.trees=150 
## + Fold1: shrinkage=0.1, interaction.depth=2, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.1138
##      2        1.0232             nan     0.1000    0.0802
##      3        0.9692             nan     0.1000    0.0615
##      4        0.9265             nan     0.1000    0.0448
##      5        0.8941             nan     0.1000    0.0372
##      6        0.8687             nan     0.1000    0.0280
##      7        0.8487             nan     0.1000    0.0230
##      8        0.8320             nan     0.1000    0.0186
##      9        0.8184             nan     0.1000    0.0155
##     10        0.8069             nan     0.1000    0.0126
##     20        0.7478             nan     0.1000    0.0034
##     40        0.7081             nan     0.1000    0.0008
##     60        0.6881             nan     0.1000   -0.0004
##     80        0.6729             nan     0.1000   -0.0001
##    100        0.6617             nan     0.1000   -0.0003
##    120        0.6517             nan     0.1000   -0.0003
##    140        0.6436             nan     0.1000   -0.0005
##    150        0.6406             nan     0.1000   -0.0009
## 
## - Fold1: shrinkage=0.1, interaction.depth=2, n.minobsinnode=10, n.trees=150 
## + Fold1: shrinkage=0.1, interaction.depth=3, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.1201
##      2        1.0201             nan     0.1000    0.0849
##      3        0.9627             nan     0.1000    0.0639
##      4        0.9195             nan     0.1000    0.0489
##      5        0.8846             nan     0.1000    0.0366
##      6        0.8585             nan     0.1000    0.0307
##      7        0.8369             nan     0.1000    0.0243
##      8        0.8194             nan     0.1000    0.0194
##      9        0.8046             nan     0.1000    0.0154
##     10        0.7917             nan     0.1000    0.0130
##     20        0.7291             nan     0.1000    0.0039
##     40        0.6854             nan     0.1000    0.0005
##     60        0.6607             nan     0.1000    0.0000
##     80        0.6432             nan     0.1000   -0.0002
##    100        0.6301             nan     0.1000   -0.0006
##    120        0.6173             nan     0.1000   -0.0001
##    140        0.6064             nan     0.1000   -0.0005
##    150        0.6020             nan     0.1000   -0.0004
## 
## - Fold1: shrinkage=0.1, interaction.depth=3, n.minobsinnode=10, n.trees=150 
## + Fold2: shrinkage=0.1, interaction.depth=1, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.0959
##      2        1.0347             nan     0.1000    0.0702
##      3        0.9880             nan     0.1000    0.0531
##      4        0.9522             nan     0.1000    0.0428
##      5        0.9240             nan     0.1000    0.0341
##      6        0.9004             nan     0.1000    0.0285
##      7        0.8809             nan     0.1000    0.0211
##      8        0.8646             nan     0.1000    0.0199
##      9        0.8508             nan     0.1000    0.0168
##     10        0.8389             nan     0.1000    0.0126
##     20        0.7786             nan     0.1000    0.0046
##     40        0.7398             nan     0.1000    0.0014
##     60        0.7213             nan     0.1000    0.0006
##     80        0.7098             nan     0.1000   -0.0001
##    100        0.7004             nan     0.1000   -0.0002
##    120        0.6941             nan     0.1000   -0.0002
##    140        0.6892             nan     0.1000   -0.0001
##    150        0.6870             nan     0.1000   -0.0002
## 
## - Fold2: shrinkage=0.1, interaction.depth=1, n.minobsinnode=10, n.trees=150 
## + Fold2: shrinkage=0.1, interaction.depth=2, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.1148
##      2        1.0236             nan     0.1000    0.0852
##      3        0.9659             nan     0.1000    0.0600
##      4        0.9239             nan     0.1000    0.0498
##      5        0.8911             nan     0.1000    0.0382
##      6        0.8650             nan     0.1000    0.0306
##      7        0.8442             nan     0.1000    0.0221
##      8        0.8263             nan     0.1000    0.0172
##      9        0.8136             nan     0.1000    0.0152
##     10        0.8030             nan     0.1000    0.0116
##     20        0.7458             nan     0.1000    0.0038
##     40        0.7023             nan     0.1000    0.0009
##     60        0.6825             nan     0.1000    0.0002
##     80        0.6692             nan     0.1000    0.0001
##    100        0.6589             nan     0.1000   -0.0001
##    120        0.6493             nan     0.1000    0.0000
##    140        0.6418             nan     0.1000   -0.0006
##    150        0.6377             nan     0.1000   -0.0004
## 
## - Fold2: shrinkage=0.1, interaction.depth=2, n.minobsinnode=10, n.trees=150 
## + Fold2: shrinkage=0.1, interaction.depth=3, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.1268
##      2        1.0181             nan     0.1000    0.0880
##      3        0.9602             nan     0.1000    0.0651
##      4        0.9160             nan     0.1000    0.0497
##      5        0.8821             nan     0.1000    0.0397
##      6        0.8547             nan     0.1000    0.0286
##      7        0.8328             nan     0.1000    0.0245
##      8        0.8156             nan     0.1000    0.0197
##      9        0.8016             nan     0.1000    0.0169
##     10        0.7892             nan     0.1000    0.0129
##     20        0.7256             nan     0.1000    0.0043
##     40        0.6803             nan     0.1000    0.0007
##     60        0.6573             nan     0.1000   -0.0004
##     80        0.6405             nan     0.1000   -0.0006
##    100        0.6274             nan     0.1000   -0.0011
##    120        0.6160             nan     0.1000   -0.0013
##    140        0.6053             nan     0.1000   -0.0008
##    150        0.6006             nan     0.1000   -0.0013
## 
## - Fold2: shrinkage=0.1, interaction.depth=3, n.minobsinnode=10, n.trees=150 
## + Fold3: shrinkage=0.1, interaction.depth=1, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.0933
##      2        1.0328             nan     0.1000    0.0682
##      3        0.9857             nan     0.1000    0.0499
##      4        0.9502             nan     0.1000    0.0396
##      5        0.9233             nan     0.1000    0.0316
##      6        0.9001             nan     0.1000    0.0279
##      7        0.8808             nan     0.1000    0.0222
##      8        0.8645             nan     0.1000    0.0198
##      9        0.8501             nan     0.1000    0.0143
##     10        0.8390             nan     0.1000    0.0143
##     20        0.7817             nan     0.1000    0.0047
##     40        0.7438             nan     0.1000    0.0015
##     60        0.7252             nan     0.1000    0.0004
##     80        0.7140             nan     0.1000    0.0001
##    100        0.7051             nan     0.1000   -0.0002
##    120        0.6990             nan     0.1000   -0.0001
##    140        0.6944             nan     0.1000   -0.0006
##    150        0.6924             nan     0.1000   -0.0003
## 
## - Fold3: shrinkage=0.1, interaction.depth=1, n.minobsinnode=10, n.trees=150 
## + Fold3: shrinkage=0.1, interaction.depth=2, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.1185
##      2        1.0227             nan     0.1000    0.0847
##      3        0.9666             nan     0.1000    0.0588
##      4        0.9259             nan     0.1000    0.0478
##      5        0.8928             nan     0.1000    0.0378
##      6        0.8672             nan     0.1000    0.0262
##      7        0.8474             nan     0.1000    0.0223
##      8        0.8319             nan     0.1000    0.0201
##      9        0.8180             nan     0.1000    0.0157
##     10        0.8065             nan     0.1000    0.0132
##     20        0.7478             nan     0.1000    0.0039
##     40        0.7067             nan     0.1000    0.0017
##     60        0.6858             nan     0.1000    0.0003
##     80        0.6722             nan     0.1000    0.0001
##    100        0.6613             nan     0.1000   -0.0008
##    120        0.6514             nan     0.1000   -0.0003
##    140        0.6420             nan     0.1000   -0.0004
##    150        0.6386             nan     0.1000   -0.0003
## 
## - Fold3: shrinkage=0.1, interaction.depth=2, n.minobsinnode=10, n.trees=150 
## + Fold3: shrinkage=0.1, interaction.depth=3, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.1253
##      2        1.0194             nan     0.1000    0.0879
##      3        0.9611             nan     0.1000    0.0651
##      4        0.9178             nan     0.1000    0.0507
##      5        0.8834             nan     0.1000    0.0384
##      6        0.8563             nan     0.1000    0.0285
##      7        0.8355             nan     0.1000    0.0255
##      8        0.8174             nan     0.1000    0.0194
##      9        0.8015             nan     0.1000    0.0161
##     10        0.7895             nan     0.1000    0.0126
##     20        0.7275             nan     0.1000    0.0033
##     40        0.6826             nan     0.1000    0.0003
##     60        0.6584             nan     0.1000    0.0000
##     80        0.6405             nan     0.1000   -0.0002
##    100        0.6273             nan     0.1000   -0.0004
##    120        0.6150             nan     0.1000   -0.0005
##    140        0.6044             nan     0.1000   -0.0008
##    150        0.6000             nan     0.1000   -0.0008
## 
## - Fold3: shrinkage=0.1, interaction.depth=3, n.minobsinnode=10, n.trees=150 
## + Fold4: shrinkage=0.1, interaction.depth=1, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.0909
##      2        1.0345             nan     0.1000    0.0677
##      3        0.9870             nan     0.1000    0.0498
##      4        0.9520             nan     0.1000    0.0402
##      5        0.9245             nan     0.1000    0.0339
##      6        0.9012             nan     0.1000    0.0249
##      7        0.8832             nan     0.1000    0.0237
##      8        0.8667             nan     0.1000    0.0175
##      9        0.8527             nan     0.1000    0.0163
##     10        0.8415             nan     0.1000    0.0126
##     20        0.7825             nan     0.1000    0.0040
##     40        0.7451             nan     0.1000    0.0011
##     60        0.7251             nan     0.1000    0.0003
##     80        0.7135             nan     0.1000   -0.0000
##    100        0.7053             nan     0.1000   -0.0004
##    120        0.6991             nan     0.1000    0.0000
##    140        0.6942             nan     0.1000   -0.0003
##    150        0.6923             nan     0.1000   -0.0006
## 
## - Fold4: shrinkage=0.1, interaction.depth=1, n.minobsinnode=10, n.trees=150 
## + Fold4: shrinkage=0.1, interaction.depth=2, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.1130
##      2        1.0216             nan     0.1000    0.0821
##      3        0.9662             nan     0.1000    0.0617
##      4        0.9241             nan     0.1000    0.0446
##      5        0.8937             nan     0.1000    0.0373
##      6        0.8683             nan     0.1000    0.0275
##      7        0.8479             nan     0.1000    0.0226
##      8        0.8316             nan     0.1000    0.0177
##      9        0.8187             nan     0.1000    0.0159
##     10        0.8069             nan     0.1000    0.0123
##     20        0.7477             nan     0.1000    0.0032
##     40        0.7072             nan     0.1000    0.0001
##     60        0.6871             nan     0.1000    0.0001
##     80        0.6734             nan     0.1000    0.0001
##    100        0.6627             nan     0.1000   -0.0003
##    120        0.6537             nan     0.1000   -0.0011
##    140        0.6456             nan     0.1000   -0.0006
##    150        0.6421             nan     0.1000   -0.0004
## 
## - Fold4: shrinkage=0.1, interaction.depth=2, n.minobsinnode=10, n.trees=150 
## + Fold4: shrinkage=0.1, interaction.depth=3, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.1203
##      2        1.0185             nan     0.1000    0.0898
##      3        0.9592             nan     0.1000    0.0653
##      4        0.9154             nan     0.1000    0.0478
##      5        0.8815             nan     0.1000    0.0352
##      6        0.8555             nan     0.1000    0.0291
##      7        0.8340             nan     0.1000    0.0241
##      8        0.8156             nan     0.1000    0.0160
##      9        0.8023             nan     0.1000    0.0144
##     10        0.7907             nan     0.1000    0.0122
##     20        0.7275             nan     0.1000    0.0033
##     40        0.6844             nan     0.1000    0.0008
##     60        0.6609             nan     0.1000    0.0000
##     80        0.6446             nan     0.1000   -0.0008
##    100        0.6312             nan     0.1000   -0.0014
##    120        0.6195             nan     0.1000   -0.0004
##    140        0.6098             nan     0.1000   -0.0008
##    150        0.6048             nan     0.1000   -0.0008
## 
## - Fold4: shrinkage=0.1, interaction.depth=3, n.minobsinnode=10, n.trees=150 
## + Fold5: shrinkage=0.1, interaction.depth=1, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.0968
##      2        1.0341             nan     0.1000    0.0707
##      3        0.9870             nan     0.1000    0.0484
##      4        0.9514             nan     0.1000    0.0410
##      5        0.9223             nan     0.1000    0.0345
##      6        0.8994             nan     0.1000    0.0271
##      7        0.8805             nan     0.1000    0.0221
##      8        0.8646             nan     0.1000    0.0197
##      9        0.8511             nan     0.1000    0.0145
##     10        0.8402             nan     0.1000    0.0121
##     20        0.7806             nan     0.1000    0.0052
##     40        0.7430             nan     0.1000    0.0010
##     60        0.7258             nan     0.1000    0.0005
##     80        0.7142             nan     0.1000   -0.0001
##    100        0.7064             nan     0.1000   -0.0001
##    120        0.7004             nan     0.1000   -0.0003
##    140        0.6958             nan     0.1000   -0.0001
##    150        0.6934             nan     0.1000   -0.0013
## 
## - Fold5: shrinkage=0.1, interaction.depth=1, n.minobsinnode=10, n.trees=150 
## + Fold5: shrinkage=0.1, interaction.depth=2, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.1161
##      2        1.0219             nan     0.1000    0.0834
##      3        0.9653             nan     0.1000    0.0598
##      4        0.9232             nan     0.1000    0.0464
##      5        0.8926             nan     0.1000    0.0333
##      6        0.8680             nan     0.1000    0.0289
##      7        0.8476             nan     0.1000    0.0226
##      8        0.8311             nan     0.1000    0.0194
##      9        0.8171             nan     0.1000    0.0157
##     10        0.8046             nan     0.1000    0.0116
##     20        0.7474             nan     0.1000    0.0036
##     40        0.7068             nan     0.1000    0.0004
##     60        0.6867             nan     0.1000   -0.0004
##     80        0.6733             nan     0.1000   -0.0006
##    100        0.6628             nan     0.1000   -0.0005
##    120        0.6540             nan     0.1000   -0.0007
##    140        0.6462             nan     0.1000   -0.0004
##    150        0.6425             nan     0.1000   -0.0003
## 
## - Fold5: shrinkage=0.1, interaction.depth=2, n.minobsinnode=10, n.trees=150 
## + Fold5: shrinkage=0.1, interaction.depth=3, n.minobsinnode=10, n.trees=150 
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.1271
##      2        1.0196             nan     0.1000    0.0891
##      3        0.9607             nan     0.1000    0.0637
##      4        0.9168             nan     0.1000    0.0489
##      5        0.8828             nan     0.1000    0.0367
##      6        0.8565             nan     0.1000    0.0280
##      7        0.8344             nan     0.1000    0.0219
##      8        0.8179             nan     0.1000    0.0184
##      9        0.8032             nan     0.1000    0.0156
##     10        0.7909             nan     0.1000    0.0118
##     20        0.7294             nan     0.1000    0.0032
##     40        0.6847             nan     0.1000    0.0011
##     60        0.6616             nan     0.1000   -0.0003
##     80        0.6455             nan     0.1000   -0.0008
##    100        0.6300             nan     0.1000   -0.0006
##    120        0.6187             nan     0.1000   -0.0006
##    140        0.6101             nan     0.1000   -0.0006
##    150        0.6055             nan     0.1000   -0.0012
## 
## - Fold5: shrinkage=0.1, interaction.depth=3, n.minobsinnode=10, n.trees=150 
## Aggregating results
## Selecting tuning parameters
## Fitting n.trees = 150, interaction.depth = 3, shrinkage = 0.1, n.minobsinnode = 10 on full training set
## Iter   TrainDeviance   ValidDeviance   StepSize   Improve
##      1        1.0986             nan     0.1000    0.1237
##      2        1.0192             nan     0.1000    0.0889
##      3        0.9619             nan     0.1000    0.0656
##      4        0.9175             nan     0.1000    0.0495
##      5        0.8836             nan     0.1000    0.0393
##      6        0.8575             nan     0.1000    0.0287
##      7        0.8366             nan     0.1000    0.0230
##      8        0.8195             nan     0.1000    0.0194
##      9        0.8053             nan     0.1000    0.0157
##     10        0.7940             nan     0.1000    0.0131
##     20        0.7317             nan     0.1000    0.0037
##     40        0.6872             nan     0.1000    0.0010
##     60        0.6649             nan     0.1000   -0.0003
##     80        0.6479             nan     0.1000   -0.0001
##    100        0.6345             nan     0.1000   -0.0002
##    120        0.6245             nan     0.1000   -0.0001
##    140        0.6147             nan     0.1000   -0.0004
##    150        0.6104             nan     0.1000   -0.0004
# Prediction using caret method
lgb_class_prediction <- predict(lgb_class_model, X_test_classification)

# Evaluate model performance - Confusion Matrix
lgb_class_cm <- confusionMatrix(lgb_class_prediction, y_test_classification)
print(lgb_class_cm)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   1   2   3
##          1 901 224  21
##          2 161 564 133
##          3   5  14  50
## 
## Overall Statistics
##                                           
##                Accuracy : 0.7308          
##                  95% CI : (0.7112, 0.7498)
##     No Information Rate : 0.5147          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.5124          
##                                           
##  Mcnemar's Test P-Value : < 2.2e-16       
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity            0.8444   0.7032  0.24510
## Specificity            0.7565   0.7687  0.98983
## Pos Pred Value         0.7862   0.6573  0.72464
## Neg Pred Value         0.8209   0.8041  0.92315
## Prevalence             0.5147   0.3869  0.09841
## Detection Rate         0.4346   0.2721  0.02412
## Detection Prevalence   0.5528   0.4139  0.03329
## Balanced Accuracy      0.8004   0.7360  0.61747

Logistic Regression Model

In this project, Logistic Regression was applied to predict the furnishing status of rental properties based on features such as rental price, property size, property type, property age, proximity to public transport, and facilities. While it is a linear model and may not capture complex interactions, it serves as a strong baseline due to its simplicity, interpretability, and efficiency.

# Train multinomial logistic regression model
log_reg_model <- train(
  x = X_train_classification,
  y = y_train_classification,
  method = "multinom",
  trControl = train_ctrl,
  metric = "Accuracy"
)
## + Fold1: decay=0e+00 
## # weights:  36 (22 variable)
## initial  value 7292.588372 
## iter  10 value 5664.335120
## iter  20 value 5177.813405
## iter  30 value 4851.522315
## final  value 4849.487132 
## converged
## - Fold1: decay=0e+00 
## + Fold1: decay=1e-01 
## # weights:  36 (22 variable)
## initial  value 7292.588372 
## iter  10 value 5664.587006
## iter  20 value 5180.789204
## iter  30 value 4853.935305
## final  value 4851.990881 
## converged
## - Fold1: decay=1e-01 
## + Fold1: decay=1e-04 
## # weights:  36 (22 variable)
## initial  value 7292.588372 
## iter  10 value 5664.335371
## iter  20 value 5177.816418
## iter  30 value 4851.524829
## final  value 4849.489690 
## converged
## - Fold1: decay=1e-04 
## + Fold2: decay=0e+00 
## # weights:  36 (22 variable)
## initial  value 7292.588372 
## iter  10 value 6009.623664
## iter  20 value 5336.394468
## iter  30 value 4854.257854
## final  value 4853.685738 
## converged
## - Fold2: decay=0e+00 
## + Fold2: decay=1e-01 
## # weights:  36 (22 variable)
## initial  value 7292.588372 
## iter  10 value 6009.729568
## iter  20 value 5338.528964
## iter  30 value 4856.849980
## final  value 4856.261069 
## converged
## - Fold2: decay=1e-01 
## + Fold2: decay=1e-04 
## # weights:  36 (22 variable)
## initial  value 7292.588372 
## iter  10 value 6009.623770
## iter  20 value 5336.396482
## iter  30 value 4854.260501
## final  value 4853.688370 
## converged
## - Fold2: decay=1e-04 
## + Fold3: decay=0e+00 
## # weights:  36 (22 variable)
## initial  value 7291.489760 
## iter  10 value 5974.512175
## iter  20 value 5353.116470
## iter  30 value 4858.315602
## final  value 4857.957913 
## converged
## - Fold3: decay=0e+00 
## + Fold3: decay=1e-01 
## # weights:  36 (22 variable)
## initial  value 7291.489760 
## iter  10 value 5974.611095
## iter  20 value 5356.212393
## iter  30 value 4860.916051
## final  value 4860.615053 
## converged
## - Fold3: decay=1e-01 
## + Fold3: decay=1e-04 
## # weights:  36 (22 variable)
## initial  value 7291.489760 
## iter  10 value 5974.512273
## iter  20 value 5353.119258
## iter  30 value 4858.318310
## final  value 4857.960629 
## converged
## - Fold3: decay=1e-04 
## + Fold4: decay=0e+00 
## # weights:  36 (22 variable)
## initial  value 7292.588372 
## iter  10 value 5938.609393
## iter  20 value 5435.949873
## iter  30 value 4841.231399
## final  value 4840.591013 
## converged
## - Fold4: decay=0e+00 
## + Fold4: decay=1e-01 
## # weights:  36 (22 variable)
## initial  value 7292.588372 
## iter  10 value 5938.709276
## iter  20 value 5280.903978
## iter  30 value 4843.749206
## final  value 4843.287833 
## converged
## - Fold4: decay=1e-01 
## + Fold4: decay=1e-04 
## # weights:  36 (22 variable)
## initial  value 7292.588372 
## iter  10 value 5938.609493
## iter  20 value 5435.964048
## iter  30 value 4841.234236
## final  value 4840.593769 
## converged
## - Fold4: decay=1e-04 
## + Fold5: decay=0e+00 
## # weights:  36 (22 variable)
## initial  value 7291.489760 
## iter  10 value 5904.418950
## iter  20 value 5322.557631
## iter  30 value 4861.600663
## final  value 4861.320115 
## converged
## - Fold5: decay=0e+00 
## + Fold5: decay=1e-01 
## # weights:  36 (22 variable)
## initial  value 7291.489760 
## iter  10 value 5904.525264
## iter  20 value 5326.324968
## iter  30 value 4863.996784
## final  value 4863.681614 
## converged
## - Fold5: decay=1e-01 
## + Fold5: decay=1e-04 
## # weights:  36 (22 variable)
## initial  value 7291.489760 
## iter  10 value 5904.419056
## iter  20 value 5322.561461
## iter  30 value 4861.603115
## final  value 4861.322526 
## converged
## - Fold5: decay=1e-04 
## Aggregating results
## Selecting tuning parameters
## Fitting decay = 0.1 on full training set
## # weights:  36 (22 variable)
## initial  value 9115.186159 
## iter  10 value 6653.448683
## iter  20 value 6321.546446
## iter  30 value 6071.353517
## final  value 6071.323339 
## converged
# Predict
log_reg_class_prediction <- predict(log_reg_model, X_test_classification)

# Evaluate
log_reg_class_cm <- confusionMatrix(log_reg_class_prediction, y_test_classification)
print(log_reg_class_cm)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   1   2   3
##          1 825 235  33
##          2 236 556 149
##          3   6  11  22
## 
## Overall Statistics
##                                           
##                Accuracy : 0.6768          
##                  95% CI : (0.6562, 0.6969)
##     No Information Rate : 0.5147          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.4136          
##                                           
##  Mcnemar's Test P-Value : < 2.2e-16       
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity            0.7732   0.6933  0.10784
## Specificity            0.7336   0.6971  0.99090
## Pos Pred Value         0.7548   0.5909  0.56410
## Neg Pred Value         0.7531   0.7827  0.91052
## Prevalence             0.5147   0.3869  0.09841
## Detection Rate         0.3980   0.2682  0.01061
## Detection Prevalence   0.5273   0.4539  0.01881
## Balanced Accuracy      0.7534   0.6952  0.54937

Decision Tree Classifier

The Decision Tree Classifier is a simple yet powerful algorithm that makes predictions by learning decision rules from the data and organizing them into a tree-like structure. For this project, it was used to classify the furnishing status of rental properties based on features such as rental price, property size, property type, property age, proximity to public transport, and available facilities. Decision trees are easy to interpret and visualize, making them useful for understanding how different features influence the furnishing category. However, they can be prone to overfitting, especially on noisy data or datasets with many categories.

#Train Decision Tree Classifier
dt_class_model <- train (
  x = X_train_classification, 
  y = y_train_classification, 
  method = "rpart", 
  trControl = train_ctrl,
  metric = "Accuracy" #train() can only accept one metric at a time
)
## + Fold1: cp=0.009579 
## - Fold1: cp=0.009579 
## + Fold2: cp=0.009579 
## - Fold2: cp=0.009579 
## + Fold3: cp=0.009579 
## - Fold3: cp=0.009579 
## + Fold4: cp=0.009579 
## - Fold4: cp=0.009579 
## + Fold5: cp=0.009579 
## - Fold5: cp=0.009579 
## Aggregating results
## Selecting tuning parameters
## Fitting cp = 0.00958 on full training set
#Prediction
dt_class_prediction <- predict(dt_class_model, X_test_classification)

#Evaluate model performance - Confusion Matrix
dt_class_cm <- confusionMatrix(dt_class_prediction, y_test_classification)
print (dt_class_cm)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   1   2   3
##          1 820 264  36
##          2 247 538 168
##          3   0   0   0
## 
## Overall Statistics
##                                           
##                Accuracy : 0.6551          
##                  95% CI : (0.6342, 0.6756)
##     No Information Rate : 0.5147          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.366           
##                                           
##  Mcnemar's Test P-Value : < 2.2e-16       
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity            0.7685   0.6708  0.00000
## Specificity            0.7018   0.6735  1.00000
## Pos Pred Value         0.7321   0.5645      NaN
## Neg Pred Value         0.7408   0.7643  0.90159
## Prevalence             0.5147   0.3869  0.09841
## Detection Rate         0.3956   0.2595  0.00000
## Detection Prevalence   0.5403   0.4597  0.00000
## Balanced Accuracy      0.7351   0.6722  0.50000

Neural Network Classifier

The Neural Network Classifier is a flexible and powerful machine learning model inspired by the structure of the human brain. It consists of interconnected layers of nodes (neurons) that learn to detect complex patterns in the data. In this project, a neural network was trained to predict the furnishing status of rental properties using features such as rental price, property size, property type, property age, proximity to public transport, and available facilities. Neural networks are capable of modeling non-linear relationships and interactions between variables, making them suitable for multi-class classification tasks. However, they often require more data and computational resources and are generally less interpretable than traditional models.

#Train Neural Network Classifier 
nn_class_model <- train (
  x = X_train_classification, 
  y = y_train_classification, 
  method = "nnet", 
  trControl = train_ctrl,
  metric = "Accuracy", #train() can only accept one metric at a time
  trace = FALSE #To suppress the training output
)
## + Fold1: size=1, decay=0e+00 
## - Fold1: size=1, decay=0e+00 
## + Fold1: size=3, decay=0e+00 
## - Fold1: size=3, decay=0e+00 
## + Fold1: size=5, decay=0e+00 
## - Fold1: size=5, decay=0e+00 
## + Fold1: size=1, decay=1e-01 
## - Fold1: size=1, decay=1e-01 
## + Fold1: size=3, decay=1e-01 
## - Fold1: size=3, decay=1e-01 
## + Fold1: size=5, decay=1e-01 
## - Fold1: size=5, decay=1e-01 
## + Fold1: size=1, decay=1e-04 
## - Fold1: size=1, decay=1e-04 
## + Fold1: size=3, decay=1e-04 
## - Fold1: size=3, decay=1e-04 
## + Fold1: size=5, decay=1e-04 
## - Fold1: size=5, decay=1e-04 
## + Fold2: size=1, decay=0e+00 
## - Fold2: size=1, decay=0e+00 
## + Fold2: size=3, decay=0e+00 
## - Fold2: size=3, decay=0e+00 
## + Fold2: size=5, decay=0e+00 
## - Fold2: size=5, decay=0e+00 
## + Fold2: size=1, decay=1e-01 
## - Fold2: size=1, decay=1e-01 
## + Fold2: size=3, decay=1e-01 
## - Fold2: size=3, decay=1e-01 
## + Fold2: size=5, decay=1e-01 
## - Fold2: size=5, decay=1e-01 
## + Fold2: size=1, decay=1e-04 
## - Fold2: size=1, decay=1e-04 
## + Fold2: size=3, decay=1e-04 
## - Fold2: size=3, decay=1e-04 
## + Fold2: size=5, decay=1e-04 
## - Fold2: size=5, decay=1e-04 
## + Fold3: size=1, decay=0e+00 
## - Fold3: size=1, decay=0e+00 
## + Fold3: size=3, decay=0e+00 
## - Fold3: size=3, decay=0e+00 
## + Fold3: size=5, decay=0e+00 
## - Fold3: size=5, decay=0e+00 
## + Fold3: size=1, decay=1e-01 
## - Fold3: size=1, decay=1e-01 
## + Fold3: size=3, decay=1e-01 
## - Fold3: size=3, decay=1e-01 
## + Fold3: size=5, decay=1e-01 
## - Fold3: size=5, decay=1e-01 
## + Fold3: size=1, decay=1e-04 
## - Fold3: size=1, decay=1e-04 
## + Fold3: size=3, decay=1e-04 
## - Fold3: size=3, decay=1e-04 
## + Fold3: size=5, decay=1e-04 
## - Fold3: size=5, decay=1e-04 
## + Fold4: size=1, decay=0e+00 
## - Fold4: size=1, decay=0e+00 
## + Fold4: size=3, decay=0e+00 
## - Fold4: size=3, decay=0e+00 
## + Fold4: size=5, decay=0e+00 
## - Fold4: size=5, decay=0e+00 
## + Fold4: size=1, decay=1e-01 
## - Fold4: size=1, decay=1e-01 
## + Fold4: size=3, decay=1e-01 
## - Fold4: size=3, decay=1e-01 
## + Fold4: size=5, decay=1e-01 
## - Fold4: size=5, decay=1e-01 
## + Fold4: size=1, decay=1e-04 
## - Fold4: size=1, decay=1e-04 
## + Fold4: size=3, decay=1e-04 
## - Fold4: size=3, decay=1e-04 
## + Fold4: size=5, decay=1e-04 
## - Fold4: size=5, decay=1e-04 
## + Fold5: size=1, decay=0e+00 
## - Fold5: size=1, decay=0e+00 
## + Fold5: size=3, decay=0e+00 
## - Fold5: size=3, decay=0e+00 
## + Fold5: size=5, decay=0e+00 
## - Fold5: size=5, decay=0e+00 
## + Fold5: size=1, decay=1e-01 
## - Fold5: size=1, decay=1e-01 
## + Fold5: size=3, decay=1e-01 
## - Fold5: size=3, decay=1e-01 
## + Fold5: size=5, decay=1e-01 
## - Fold5: size=5, decay=1e-01 
## + Fold5: size=1, decay=1e-04 
## - Fold5: size=1, decay=1e-04 
## + Fold5: size=3, decay=1e-04 
## - Fold5: size=3, decay=1e-04 
## + Fold5: size=5, decay=1e-04 
## - Fold5: size=5, decay=1e-04 
## Aggregating results
## Selecting tuning parameters
## Fitting size = 5, decay = 0.1 on full training set
#Prediction
nn_class_prediction <- predict(nn_class_model, X_test_classification)

#Evaluate model performance - Confusion Matrix
nn_class_cm <- confusionMatrix(nn_class_prediction, y_test_classification)
print(nn_class_cm)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   1   2   3
##          1 890 271  23
##          2 169 512 153
##          3   8  19  28
## 
## Overall Statistics
##                                           
##                Accuracy : 0.6898          
##                  95% CI : (0.6694, 0.7097)
##     No Information Rate : 0.5147          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.4337          
##                                           
##  Mcnemar's Test P-Value : < 2.2e-16       
## 
## Statistics by Class:
## 
##                      Class: 1 Class: 2 Class: 3
## Sensitivity            0.8341   0.6384  0.13725
## Specificity            0.7078   0.7467  0.98555
## Pos Pred Value         0.7517   0.6139  0.50909
## Neg Pred Value         0.8009   0.7659  0.91278
## Prevalence             0.5147   0.3869  0.09841
## Detection Rate         0.4293   0.2470  0.01351
## Detection Prevalence   0.5712   0.4023  0.02653
## Balanced Accuracy      0.7709   0.6925  0.56140

Data Evaluation and Interpretation

1. Regression Model Evaluation: Predicting Monthly Rental Price

Several regression models were trained to predict the monthly rental price of apartments in KL/Selangor. The following models were evaluated: Linear Regression, Decision Tree, XGBoost, LightGBM, and Neural Network.

a) Performance Metrics

Model RMSE MAE MSE
Linear Regression 491.4128 0.4661038 363.4862 241486.5
XGBoost 332.1724 0.7560023 227.5920 110338.5
LightGBM 347.3618 0.7354932 238.3184 120660.2
Decision Tree 578.9018 0.2585847 421.0874 335127.3
Neural Network 1866.903 0 1741.764 3485325

b) Key Visualizations

Actual vs Predicted Rental Price

Linear Regression

df_pred <- data.frame(Actual = y_test_regression, Predicted = lm_prediction)
library(ggplot2)
p <- ggplot(df_pred, aes(x = Actual, y = Predicted)) +
  geom_point(alpha = 0.5) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "red") +
  labs(title = "Actual vs Predicted Rental Price (Linear Regression)",
       x = "Actual (Standardized)",
       y = "Predicted (Standardized)") +
  theme_minimal()

if (!dir.exists("plots")) dir.create("plots")

ggsave("plots/lm_actual_vs_predicted.png", plot = p)
## Saving 7 x 5 in image
knitr::include_graphics("plots/lm_actual_vs_predicted.png")

Regression Residual Plot

# Residuals
df_resid <- data.frame(Predicted = lm_prediction, Residuals = y_test_regression - lm_prediction)
p2 <- ggplot(df_resid, aes(x = Predicted, y = Residuals)) +
  geom_point(alpha = 0.5) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "blue") +
  labs(title = "Residuals Plot (Linear Regression)",
       x = "Predicted (Standardized)",
       y = "Residuals") +
  theme_minimal()

if (!dir.exists("plots")) dir.create("plots")

ggsave("plots/lm_residuals.png", plot = p2)
## Saving 7 x 5 in image
knitr::include_graphics("plots/lm_residuals.png")

Feature Importance (XGBoost)

For XGBoost:

library(xgboost)
# Use $finalModel to access the xgb.Booster object
importance_matrix <- xgb.importance(model = xgb_model$finalModel)
xgb.plot.importance(importance_matrix, top_n = 10)

# To save as PNG
png("plots/xgb_feature_importance.png")
xgb.plot.importance(importance_matrix, top_n = 10)
dev.off()
## png 
##   2

c) Discussion and Interpretation

The regression models yielded similar results with Neural Network as exception, with RMSE values between 330 to 600 and R² values close to 0.75. Feature importance plots show that the most influential variables are typically distance to popular locations, the location of the unit, size and furnish status, where these four features alone contribute more than 50% of the importance.

  • Strengths: Consistent RMSE/MAE across models except Neural Network that usually requires a more finer tuning of hyperparameters.

  • Weaknesses: Computation Time, Both XGBoost and Neural Network are complex model that takes longer time to train, highlighting the incredible computational algorithm of LightGBM to have high predictive power with less time.

2. Classification Model Evaluation: Predicting Furnishing Status

a) Performance Metrics

Model Accuracy Precision (Macro) Recall (Macro) F1-Score (Macro) AUC (Macro)
XGBoost 0.747 0.72 0.63 0.65 0.88*
LightGBM 0.725 0.70 0.59 0.60 0.85*
Neural Network 0.678 0.64 0.52 0.53 0.81*
Decision Tree 0.655 0.64 0.48 0.48 0.79*
Logistic Reg. 0.685 0.65 0.50 0.49 0.80*

b) Key Visualizations

Confusion Matrix

library(caret)
cm <- confusionMatrix(xgb_class_prediction, y_test_classification)
cm_table <- as.data.frame(cm$table)
library(ggplot2)
p3 <- ggplot(cm_table, aes(Prediction, Reference, fill = Freq)) +
  geom_tile() +
  geom_text(aes(label = Freq)) +
  scale_fill_gradient(low = "white", high = "red") +
  labs(title = "Confusion Matrix (XGBoost)") +
  theme_minimal()

if (!dir.exists("plots")) dir.create("plots")

ggsave("plots/xgb_confusion_matrix.png", plot = p3)
## Saving 7 x 5 in image
knitr::include_graphics("plots/xgb_confusion_matrix.png")

ROC Curve

prob_mat <- predict(xgb_class_model, X_test_classification, type = "prob")
prob_furnished <- prob_mat[, "1"] # or use the appropriate class column name

library(pROC)
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
# prob_furnished = predicted probability of the positive class (for XGBoost etc.)
roc_obj <- roc(y_test_classification, prob_furnished)
## Warning in roc.default(y_test_classification, prob_furnished): 'response' has
## more than two levels. Consider setting 'levels' explicitly or using
## 'multiclass.roc' instead
## Setting levels: control = 1, case = 2
## Setting direction: controls > cases
png("plots/xgb_roc_curve.png")
plot(roc_obj, main = "ROC Curve (XGBoost)")
dev.off()
## png 
##   2
knitr::include_graphics("plots/xgb_roc_curve.png")

c) Discussion and Interpretation

All models achieved an accuracy of over 65% with XGBoost being the top model with 74.7% accuracy and 0.65 F1-score.

  • Limitations: The furnished status is decided by the poster of listing, which makes the line blurred between what counts as “Not Furnished” and “Partially Furnished”, as each agency/posters have their own definitions of furnished status, e.g. a unit paired with only ceiling fans may be considered “Partially Furnished” but “Not Furnished” by different posters.

  • Recommendations: Try oversampling/undersampling, or create new features that better separate furnishing categories.

3. Overall Insights and Limitations

  • Regression: All models provide consistent and satisfactory predictions.

  • Classification: Model struggles to distinguish classes, likely due to data imbalance or insufficient features.

  • Limitation: Rental price is influenced by many external factors not captured in the dataset, such as neighborhood prestige or short-term market forces. Furthermore, the rental pricing dataset was sourced in 2023, inflation and power of supply-demand may have shifted the pricing data by a slight margin throughout the years. Hence, it is important to monitor the real-world performance of the model and retrain whenever necessary.

Conclusion

In conclusion, this project successfully built two predictive models: a regression model to estimate apartment rental prices and a classification model to predict furnishing status. Through extensive data cleaning, feature engineering, and model evaluation, the analysis revealed that factors such as property size, number of rooms, furnishing condition, and proximity to major landmarks significantly influence rental outcomes. The findings provide useful insights for tenants seeking affordable yet strategic locations, and for property owners aiming to optimize their listings. Ultimately, the models support more informed and data-driven decision-making in the urban rental market of Kuala Lumpur and Selangor.

References

EdgeProp. (2024, January 23). Rental demand increases as property ownership becomes less accessible. https://www.edgeprop.my/content/1927234/rental-demand-increases-property-ownership-becomes-less-accessible

PropertyGuru. (2024). Malaysia property market report Q1 2024. https://www.propertyguru.com.my/property-guides/malaysia-property-market-report-q1-2024-67793