Как заполнить пропущенное значение с помощью предварительно обученной модели? - PullRequest
2 голосов
/ 09 мая 2020

У меня есть индекс временного ряда с несколькими переменными и показаниями влажности. Я уже обучил модель машинного обучения предсказывать значения влажности на основе X, Y и Z. Теперь, когда я загружаю сохраненную модель с помощью pickle, я хотел бы заполнить недостающие значения влажности с помощью X, Y и Z. Однако он должен учтите тот факт, что сами по себе X, Y и Z не должны отсутствовать.

Time                    X        Y        Z       Humidity
1/2/2017 13:00          31       22       21           48
1/2/2017 14:00          NaN      12       NaN          NaN
1/2/2017 15:00          25       55       33           NaN

В этом примере последняя строка влажности будет заполнена с использованием модели. В то время как 2-я строка не должна предсказываться моделью, так как X и Z также отсутствуют.

Я пробовал это до сих пор:

with open('model_pickle','rb') as f:
    mp = pickle.load(f)

for i, value in enumerate(df['Humidity'].values):
    if np.isnan(value):
        df['Humidity'][i] = mp.predict(df['X'][i],df['Y'][i],df['Z'][i])
* 1008 принимает от 2 до 5 позиционных аргументов, но было дано 6 », а также я не рассматривал значения столбцов X, Y и Z. Ниже приведен код, который я использовал для обучения модели и сохранения ее в файл:
df = df.dropna()

dfTest = df.loc['2017-01-01':'2019-02-28']
dfTrain = df.loc['2019-03-01':'2019-03-18'] 
features = [ 'X', 'Y', 'Z'] 
train_X = dfTrain[features]
train_y = dfTrain.Humidity
test_X = dfTest[features]
test_y = dfTest.Humidity

model = xgb.XGBRegressor(max_depth=10,learning_rate=0.07)
model.fit(train_X,train_y)
predXGB = model.predict(test_X)
mae = mean_absolute_error(predXGB,test_y)
import pickle
with open('model_pickle','wb') as f:
    pickle.dump(model,f)

У меня не было ошибок во время обучения и сохранения модели.

Ответы [ 3 ]

0 голосов
/ 15 мая 2020

Попробуйте

df['Humidity'][i] = mp.predict(df[['X', 'Y', 'Z']][i])  

Таким образом, данные будут переданы как один аргумент, как и ожидает функция. Как вы это написали, вы разбиваете данные на 3 аргумента.

0 голосов
/ 15 мая 2020

Для прогнозирования, поскольку вы хотите убедиться, что у вас есть все значения X, Y, Z, вы можете сделать,

df = df.dropna(subset = ["X", "Y", "Z"])

И теперь вы можете предсказать значения для оставшихся действительных примеров как,

# where features = ["X", "Y", "Z"]
df['Humidity'] = mp.predict(df[features]) 

mp.predict вернет прогноз для всех строк, поэтому нет необходимости прогнозировать итеративно.

Изменить :.

Для вывода предположим, что у вас есть фрейм данных df, вы можете,

# Get rows with missing Humidity where it can be predicted.
df_inference = df[df.Humidity.isnull()]

# remaining rows
df = df[df.Humidity.notnull()]

# This might still have rows with missing features.
# Since you cannot infer with missing features, Remove them too and add them to remaining rows
df = df.append(df_inference[df_inference[features].isnull().any(1)])

# and remove them from df_inference
df_inference = df_inference[~df_inference[features].isnull().any(1)]

#Now you can infer on these rows
df_inference['Humidity'] = mp.predict(df_inference[features])

# Now you can merge this back to the remaining rows to get the original number of rows and sort the rows by index
df = df.append(df_inference)
df.sort_index()
0 голосов
/ 09 мая 2020

Можете ли вы сообщить об ошибке?

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

Pandas документация содержит хорошее руководство о том, как с ними бороться: https://pandas.pydata.org/pandas-docs/stable/user_guide/missing_data.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...