ML管道OneHotEncoder不适合

时间:2020-03-04 06:06:12

标签: python function machine-learning error-handling data-science

我是数据科学的新手,我能够建立一个模型,并与onehotencoder一起建立管道。但是,当我调用自己构建的函数时,会出现错误。请看下面,并请指教。提前致谢!

clf = Pipeline(steps=[('ohe', OneHotEncoder()),
                  ('rfc', RandomForestClassifier(n_estimators=1000,criterion="entropy",max_features=None))])  
pickle.dump(clf,open('model.pkl','wb'))

# load model
model = pickle.load(open('model.pkl','rb'))

def predict(A,B,C,D,E,F,G):

    result = model.predict(x)

    # send back to browser
    output = {'results': int(result[0])}


    # return data
    return jsonify(results=output)

调用功能:

predict('A','B','C','D','E','F','G')

错误:

NotFittedError: This OneHotEncoder instance is not fitted yet. Call 'fit' with appropriate arguments before using this estimator.

2 个答案:

答案 0 :(得分:1)

在将数据提供给RandomForestClassifier之前,使用它来转换数据:

def trainPipeline(pipeline, X, y):
    X_transformed = X
    for name, step in pipeline.steps[:-1]:
        X_transformed = step.fit_transform(X_transformed, y)
    pipeline.steps[-1][1].fit(X_transformed, y)

注意:仅当您的管道有两个步骤,并且第一步是OneHotEncoder()时,此方法才有效。

答案 1 :(得分:0)

TL; DR

  • 使用scikit-learn库,您需要先适合估算器,然后才能使用它进行预测。
  • 您要传递代码中未定义的变量x
  • 您永远不会使用传递给predict的任何参数。
  • 如果您尝试加载预先训练的模型,则不应被实例化的不合适的Pipeline对象覆盖。

长版

取决于您“建立模型”的含义,是否在此实际完成操作值得怀疑。

在数据科学中,您应该做的第一件事就是了解您要解决的问题。之后,您需要收集一个数据集,对其进行分析,然后确定它是否可以合理地解决您的问题。最后,您可以构建一个模型,并使用数据集来训练该模型(即调整模型的参数),然后才能进行任何类型的预测。

我建议您在尝试进行实践之前,深入研究并尝试理解一些机器学习的基础理论,以及构建模型的实际含义。