Как сделать так, чтобы классификатор SK Learn принимал двумерный массив в качестве входных данных для прогнозов?

Итак, я создал модель со смешанными типами данных и использовал рекомендуемый пример из SK Learn Docs, используя преобразователь столбцов для построения классификатора.

https://scikit-learn.org/stable/auto_examples/compose/plot_column_transformer_mixed_types.html#sphx-glr-auto-examples-compose-plot-column-transformer-mixed-types-py

Поскольку ввод поступает из csv и преобразуется в фрейм данных Pandas, похоже, что X_test, X_train, y_test, y_train также являются фреймами данных. Передача y_test в функцию clf.predict () работает нормально, и я получаю прогнозы.

Однако я хочу разместить эту модель Google Cloud ML Engine, которая принимает 2D-массив экземпляров в API запросов прогнозов. Как мне заставить мой классификатор приспособиться и принять массив входных данных, а не фрейм данных? Я понимаю, что это может быть довольно тривиально, но изо всех сил пытаюсь найти решение.


person Cashew    schedule 22.12.2018    source источник
comment
Будет ли работать массив numpy? Если это так, и вы начинаете с DataFrame df, то просто передайте df.values. Если вам нужен собственный 2D-список Python, df.values.tolist(). Я не знаком с Google ML Cloud, поэтому, возможно, это совершенно не соответствует действительности.   -  person Alex L    schedule 23.12.2018


Ответы (1)


Чтобы сделать ваш классификатор совместимым с Google Cloud Machine Learning Engine (CMLE), вам необходимо отделить препроцессор и классификатор LogisticRegression от конвейера. Вам нужно будет выполнить логику предварительной обработки на стороне клиента, а автономный классификатор будет размещен на CMLE.

После чтения файла csv и определения числовых и категориальных преобразователей вам необходимо изменить обучающий код следующим образом:

...

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, numeric_features),
        ('cat', categorical_transformer, categorical_features)])
model = LogisticRegression(solver='lbfgs')

X_train_transformed = preprocessor.fit_transform(X_train)
model.fit(X_train_transformed, y_train)
print("model score: %.3f" % model.score(preprocessor.transform(X_test), y_test))

Вы можете экспортировать модель (используя pickle или joblib) и развернуть ее в CMLE. При создании json-запроса к CMLE для прогнозирования вам сначала необходимо предварительно обработать фрейм данных в 2D-массив, используя: preprocessor.transform(X_test).

person ktang    schedule 21.01.2019