【问题标题】:Pass prediction method as function argument将预测方法作为函数参数传递
【发布时间】:2019-01-02 23:34:17
【问题描述】:

我想通过函数参数指定使用哪种预测方法。比如:

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

通过参数model(例如,LinearRegression、LogisticRegression)传递模型函数效果很好,但我无法通过参数predict_method 传递预测方法(例如,predict、predict_proba)。

当我指定predict_method=predict 时,我得到一个错误'name 'predict' is not defined';如果我指定predict_method=LinearRegression.predict,我会收到一条错误消息,提示“LinearRegression”对象没有属性“predict_function”。

this discussion,我也试过了

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 的模块。

感谢您的帮助!

【问题讨论】:

标签: python scikit-learn arguments predict


【解决方案1】:

我注意到在您的代码中,您没有使用您在代码中任何地方传递的 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)

关于你之后的尝试:在这种情况下,从保存函数名称的字符串调用函数是不必要的,只会增加开销,所以这可能不是正确的方法:)

希望这会有所帮助。

【讨论】:

  • 我确实使用了LinearRegression.predict,只是仔细检查了predict_method=LogisticRegression.predict_proba,我收到了类似的错误“LogisticRegression”对象没有属性“predict_method”。我正在使用sklearn 0.20.0。谢谢阿比纳夫!
猜你喜欢
  • 2013-09-11
  • 1970-01-01
  • 2016-10-14
  • 2011-08-18
  • 2016-11-02
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多