Строковое прогнозирование для фрейма данных Pandas путем передачи sklearn.predict в df.apply - PullRequest
0 голосов
/ 09 июня 2018

Предполагая, что у нас есть фрейм данных Pandas и модель scikit-learn, обученные (подходящие) с использованием этого фрейма данных.Есть ли способ сделать построчное прогнозирование?Сценарий использования - использование функции предиктора для заполнения пустых значений в кадре данных с использованием модели sklearn.

Я ожидал, что это будет возможно при использовании функции применения панд (с осью = 1), но япродолжайте получать ошибки размерности.

Использование версии Pandas '0.22.0' и версии sklearn '0.19.1'.

Простой пример:

import pandas as pd
from sklearn.cluster import kmeans

data = [[x,y,x*y] for x in range(1,10) for y in range(10,15)]

df = pd.DataFrame(data,columns=['input1','input2','output'])

model = kmeans()
model.fit(df[['input1','input2']],df['output'])

df['predictions'] = df[['input1','input2']].apply(model.predict,axis=1)

Полученная ошибка размерности:

ValueError: ('Expected 2D array, got 1D array instead:\narray=[ 1. 
10.].\nReshape your data either using array.reshape(-1, 1) if your data has 
a single feature or array.reshape(1, -1) if it contains a single sample.', 
'occurred at index 0')

Выполнение прогнозирования для всего столбца работает нормально:

df['predictions'] = model.predict(df[['input1','input2']])

Однако я хочу использовать эту строку по гибкости.

Я имеюпробовал различные подходы для изменения формы данных, например:

def reshape_predict(df):
    return model.predict(np.reshape(df.values,(1,-1)))

df[['input1','input2']].apply(reshape_predict,axis=1)

, который просто возвращает ввод без ошибок, тогда как я ожидаю, что он вернет один столбец выходных значений (в виде массива).

РЕШЕНИЕ:

Спасибо Якиму за предоставленное рабочее решение!Попробовав несколько вариантов, основанных на его предложении, самым простым решением было просто заключить значения строк в квадратные скобки (я пробовал это ранее, но без индекса 0 для прогноза, без удачи).

df['predictions'] = df[['input1','input2']].apply(lambda x: model.predict([x])[0],axis=1)

1 Ответ

0 голосов
/ 09 июня 2018

Чуть более многословно, вы можете превратить каждую строку в 2D-массив, добавив новую ось к значениям.Затем вам нужно будет получить доступ к прогнозу с индексом 0:

df["predictions"] = df[["input1", "input2"]].apply(
    lambda s: model.predict(s.values[None])[0], axis=1
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...