Я провел некоторое исследование по этому вопросу. Большинство людей спорят, какой из них использовать для повышения градиента. https://www.kaggle.com/c/home-credit-default-risk/discussion/59873 Большинство kagglers здесь объясняют, что кодировщик меток используется или порядковые значения и горячие для категориальных.
Например: гений, умный, менее умный должен быть закодирован как genius = 3, умный = 2 и менее умный = 1.
Однако, согласно документации sklearn, кодирование меток используется только для целевых значений. https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html
Итак, я обучил модель, конвертировав одну из своих функций, используя одноклавишный кодировщик и кодировщик меток, чтобы увидеть, какой из них будет лучше предсказывать. (согласно sklearn do c, кодировщик метки должен использоваться для целевых значений. В моем случае это неправильно, поскольку я использовал его для одной из моих независимых переменных (x)?)
Сначала, используя кодировщик меток.
label_encoder = preprocessing.LabelEncoder()
label_encoder.fit(data_set["region"])
data_set['region'] = label_encoder.transform(data_set["region"])
X, y = data_set.iloc[:, 1:6], data_set.iloc[:,-1]
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3, random_state=0)
gbr_le = GradientBoostingRegressor(
n_estimators = 1000,
learning_rate = 0.1,
random_state = 0
)
model = gbr_le.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f'RMSE with label encoding (best_num_trees) = {np.sqrt(metrics.mean_squared_error(y_test, y_pred))}')
>>> RMSE with label encoding (best_num_trees) = 4.881378370139346
Теперь на этот раз с использованием горячих клавиш
regions = pd.get_dummies(data_set_onehot.region)
data_set_onehot.drop(columns=['region'], inplace=True)
X, y = data_set_onehot.iloc[:, 1:5], data_set_onehot.iloc[:,-1]
X = pd.concat([X, regions], axis=1)
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3, random_state=0)
gbr_onehot = GradientBoostingRegressor(
n_estimators = 1000,
learning_rate = 0.1,
random_state = 0
)
model = gbr_onehot.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f'RMSE with one-hot encoding (best_num_trees) = {np.sqrt(metrics.mean_squared_error(y_test, y_pred))}')
>>> RMSE with one-hot encoding (best_num_trees) = 4.86943654679908
На этот раз модель, обученная после использования горячих клавиш, показала лучший результат по rmse. Я не думаю, что могу судить, так как в зависимости от значения random_state от train_test_split, GradientBoostingRegressor изменяет значение RMSE.
Каков наилучший способ измерить более высокую точность между двумя моделями с обработкой различных объектов?