Предполагая, что у нас есть фрейм данных 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)