XGboost Google-AI-Model ожидает значения с плавающей запятой вместо использования категорийных значений и конвертирует их - PullRequest
2 голосов
/ 15 января 2020

Я пытаюсь запустить простое прогнозирование XGBoost на основе Google Cloud, используя этот простой пример https://cloud.google.com/ml-engine/docs/scikit/getting-predictions-xgboost#get_online_predictions

Модель строится нормально, но когда я пытаюсь запустить прогноз с примером ввода JSON происходит сбой с ошибкой «Не удалось инициализировать DMatrix из входов: не удалось преобразовать строку в число с плавающей запятой :», как показано на экране ниже. Я понимаю, что это происходит потому, что в тестовом вводе есть строки, я надеялся, что модель машинного обучения Google должна иметь информацию для преобразования категориальных значений в числа с плавающей точкой. Я не могу ожидать, что мой пользователь отправит запрос онлайн-прогнозирования со значениями с плавающей запятой.

На основе данного учебника он должен работать без преобразования категориальных значений в значения с плавающей запятой. Пожалуйста, сообщите, я приложил GIF с более подробной информацией. Спасибо

enter image description here

import json
import numpy as np
import os
import pandas as pd
import pickle
import xgboost as xgb
from sklearn.preprocessing import LabelEncoder

# these are the column labels from the census data files
COLUMNS = (
    'age',
    'workclass',
    'fnlwgt',
    'education',
    'education-num',
    'marital-status',
    'occupation',
    'relationship',
    'race',
    'sex',
    'capital-gain',
    'capital-loss',
    'hours-per-week',
    'native-country',
    'income-level'
)

# categorical columns contain data that need to be turned into numerical
# values before being used by XGBoost
CATEGORICAL_COLUMNS = (
    'workclass',
    'education',
    'marital-status',
    'occupation',
    'relationship',
    'race',
    'sex',
    'native-country'
)

# load training set
with open('./census_data/adult.data', 'r') as train_data:
    raw_training_data = pd.read_csv(train_data, header=None, names=COLUMNS)
# remove column we are trying to predict ('income-level') from features list
train_features = raw_training_data.drop('income-level', axis=1)
# create training labels list
train_labels = (raw_training_data['income-level'] == ' >50K')


# load test set
with open('./census_data/adult.test', 'r') as test_data:
    raw_testing_data = pd.read_csv(test_data, names=COLUMNS, skiprows=1)
# remove column we are trying to predict ('income-level') from features list
test_features = raw_testing_data.drop('income-level', axis=1)
# create training labels list
test_labels = (raw_testing_data['income-level'] == ' >50K.')

# convert data in categorical columns to numerical values
encoders = {col:LabelEncoder() for col in CATEGORICAL_COLUMNS}
for col in CATEGORICAL_COLUMNS:
    train_features[col] = encoders[col].fit_transform(train_features[col])
for col in CATEGORICAL_COLUMNS:
    test_features[col] = encoders[col].fit_transform(test_features[col])

# load data into DMatrix object
dtrain = xgb.DMatrix(train_features, train_labels)
dtest = xgb.DMatrix(test_features)

# train XGBoost model
bst = xgb.train({}, dtrain, 20)
bst.save_model('./model.bst')

1 Ответ

0 голосов
/ 15 января 2020

Вы можете использовать pandas для преобразования категориальных строк в коды для входов модели. Для ввода прогноза вы можете определить словарь для каждой категории с соответствующими значениями категорий и кодами. Например, для рабочего класса:

df['workclass_cat'] = df['workclass'].astype('category')
df['workclass_cat'] = df['workclass_cat'].cat.codes
workclass_dict = dict(zip(list(df['workclass'].values), list(df['workclass_cat'].values)))

Если вход предсказания - «somestring», вы можете получить доступ к его коду следующим образом:

category_input = workclass_dict['somestring']
...