как проверить горячую Vs. кодировщик меток в градиентном склеарне - PullRequest
2 голосов
/ 13 января 2020

Я провел некоторое исследование по этому вопросу. Большинство людей спорят, какой из них использовать для повышения градиента. 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.

Каков наилучший способ измерить более высокую точность между двумя моделями с обработкой различных объектов?

...