Передать метод прогнозирования в качестве аргумента функции - PullRequest
0 голосов
/ 03 января 2019

Я хотел бы указать, какой метод прогнозирования использовать через аргумент функции.Что-то вроде:

from sklearn.linear_model import LinearRegression

def Process(data_y_train, data_x_train, data_x_test, 
            model=LinearRegression, predict_method=predict):
  model_fit = model().fit(data_x_train, data_y_train)
  predicted_values = model_fit.predict_method(data_x_test)
  return predicted_values

Передача функции модели через arugment model (например, LinearRegression, LogisticRegression) работает хорошо, но у меня возникают проблемы при передаче метода предиката (например, предиката ,gnett_proba) через аргументpredict_method.

Когда я указываю predict_method=predict, я получаю сообщение об ошибке: «имя» предикт «не определено»;если я укажу predict_method=LinearRegression.predict, я получу сообщение о том, что у объекта '' LinearRegression 'нет атрибута' функция предиката ''.

За это обсуждение , я также пытался

import sklearn.linear_model.LinearRegression

def Process(data_y_train, data_x_train, data_x_test, 
            model_module='sklearn.linear_model.LinearRegression',
            model=LinearRegression, predict_method='predict'):
  model_fit = model().fit(data_x_train, data_y_train)
  predict_call = getattr(__import__(model_module), predict_method)
  predicted_values = model_fit.predict_call(data_x_test)
  return predicted_values

Но здесь я получаю сообщение об ошибке: нет модуля с именем LinearRegression.

Спасибо за помощь!

1 Ответ

0 голосов
/ 03 января 2019

Я заметил, что в вашем коде вы не используете параметр predict_method, который вы указали где-либо в вашем коде, поэтому я не думаю, что вы написали то, что пытались сделать.

В настоящее время в вашем коде вы сохраняете выходные данные функции model().fit(data_x_train, data_y_train) в переменной model_fit и затем вызываете атрибут predict_method этой переменной. Если вышеупомянутое все еще не работает, это должно быть то, откуда исходит ошибка, тогда.

Я подозреваю, что вы хотите сделать следующее:

def Process(data_y_train, data_x_train, data_x_test,
            model=LinearRegression, predict_method=LinearRegression.predict):
    model_instance = model() # create an instance of the class stored in the variable 'model'
    model_instance.fit(data_x_train, data_y_train) # run the function 'fit' belonging to that instance
    predicted_values = predict_method(model_instance,data_x_test) # run the method stored in the variable 'predict_method' - you have to pass the instance the method belongs to in the first parameter
    return predicted_values

Дополнительная информация:

  • LinearRegression - это класс . Он определяет кучу методов и т. Д.
  • Чтобы создать экземпляр этого класса, вы должны сделать что-то вроде inst = LinearRegression(). Переменная inst теперь является экземпляром класса LinearRegression
  • LinearRegression.predict является примером метода экземпляра . Это означает, что ему нужен экземпляр для запуска (или в этом случае его можно считать «оперирующим»)
  • Поэтому я могу позвонить inst.predict(x,y,z), но не LinearRegression.predict(x,y,z) напрямую.
  • Если вы хотите вызвать LinearRegression.predict, вы должны передать экземпляр в первом аргументе: LinearRegression.predict(inst,x,y,z)

Относительно того, что вы пытались потом: вызов функции из строки, содержащей имя функции, в этой ситуации не является необходимым, а только увеличивает накладные расходы, поэтому, возможно, это неправильный путь:)

Надеюсь, это поможет.

...