Python中的高错误机器学习回归器算法 - XGBOOST Regressor

数据挖掘 机器学习 Python xgboost 数据科学模型
2022-02-13 15:22:10

我有一个包含来自佛罗里达州的真实状态数据的数据框,它包括单间公寓和建筑物数据:

在此处输入图像描述

'TRUE_SITE_CITY': The city where the building is. variable: Miami, Aventura...;
'CONDO_FLAG': If it is a condominium or not, variable: yes/no;
'BEDROOM_COUNT': Number of total bethrooms, variable: integuer,
'BUILDING_actual_AREA': The area of the entire building, or apartment in the case that there are only one apartment or house. variable: integuer;
'FLOOR_COUNT': Number of the floors that the building has;
'DOR_CODE_CUR': the type of the building. Variable: categorical;
'UNIT_COUNT': Number of apartments or houses in the building. Variable: integuer;
'YEAR_BUILT': Year that the building or house or apartment was build: Variable: categorical;
'public_transport_min_distance': I have calculated the nearest stations of the public transport;
'Price': The variable that I want to predict.Variable: integer.

我进行了探索性数据分析,我删除了一些具有空值的数据和一些不正确的数据。我也删除了带有异常值的值。

价格列(目标列)的基本统计:

在此处输入图像描述

我检查了分类特征,每个特征都有足够的变量将它们保留在模型中。

我已经做了一个管道来为分类值制作一个热编码器,并为数值制作一个标准标准化。在其中我包含了 XGBOOST 回归:

from xgboost import XGBRegressor
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import cross_validate
from sklearn import metrics
from sklearn import preprocessing, feature_extraction
from sklearn.pipeline import Pipeline
from sklearn import preprocessing, feature_extraction
from sklearn.pipeline import make_pipeline, make_union
from mlxtend.feature_selection import ColumnSelector
from sklearn.preprocessing import StandardScaler
from category_encoders import OneHotEncoder

x_numeric = df_x[['BEDROOM_COUNT','BATHROOM_COUNT',
       'HALF_BATHROOM_COUNT', 'FLOOR_COUNT','UNIT_COUNT','public_transport_min_distance','BUILDING_actual_AREA']]

x_categorical = df_x[['TRUE_SITE_CITY','CONDO_FLAG','YEAR_BUILT']]

categorical_col = x_categorical.columns

numeric_col = x_numeric.columns

estimator_pipeline = Pipeline([
    ('procesador', procesing_pipeline),
    ('estimador', estimator)
])

score2 = cross_validate(estimator_pipeline, X= df_x, y= df_y, scoring=scoring,return_train_score=False, cv=5,n_jobs=2)

但我得到了一个很高的错误。价格的平均值几乎是 200.000,我得到的错误是:

在此处输入图像描述

我已经使用 RFE 完成了特征选择,但我也获得了很高的错误。

我也运行它做 RandomizedSearchCV

from sklearn.model_selection import RandomizedSearchCV

params = {"estimator__learning_rate"    : [0.05, 0.10, 0.15, 0.20, 0.25, 0.30 ] ,
 "estimator__max_depth"        : [ 3, 4, 5, 6, 8, 10, 12, 15],
 "estimator__min_child_weight" : [ 1, 3, 5, 7 ],
 "estimator__gamma"            : [ 0.0, 0.1, 0.2 , 0.3, 0.4 ],
 "estimator__colsample_bytree" : [ 0.3, 0.4, 0.5 , 0.7 ] }

random_search = RandomizedSearchCV(
    estimator=estimator_pipeline, 
    param_distributions=params, cv=5, refit=True,
    scoring="neg_mean_squared_error", n_jobs= 3,
    return_train_score=True,
    n_iter=50)

但我获得了类似的错误值。

我能做什么?

1个回答
  • 使用基于树的方法时,没有必要对分类特征进行一次热编码基本上,这个想法是树必须进行多次拆分才能确定类别。相反,您可以使用序数编码器(即使类别未排序)。

  • 我也不会将“YEAR_BUILT”设置为分类变量,即使它是离散的。通过对该变量进行一次热编码,您最终会得到一个非常分裂的数据集,其中树必须将每个 YEAR_BUILT 视为一个子集,并且它可能没有太多的观察结果来这样做。通过将其视为连续的,它使算法能够确定相关的 2 或 3 个枢轴年份(货币变化、经济危机……)。

我认为第二点确实可以提高性能。