weixin_51967179 2023-09-04 15:08 采纳率: 0%
浏览 11

LocalOutlierFactor模型导出pmml文件报错 'LocalOutlierFactor' object has no attribute '_y'。

LocalOutlierFactor模型导出pmml文件, 该模型属于无监督模型,所以将skl_to_pmml()函数中的target_name=' ',但报错 'LocalOutlierFactor' object has no attribute '_y'。

#但类似的无监督模型,如IsolationForest、OneClassSVM不会报错,求大佬解答一下谢谢

         from nyoka import skl_to_pmml
         pipeline = PMMLPipeline([("classifier", LocalOutlierFactor()])
        skl_to_pmml(pipeline, col_names=featname, target_name=' ', pmml_f_name=pmml_path)

        AttributeError: 'LocalOutlierFactor' object has no attribute '_y'
  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-04 16:11
    关注

    【以下回答由 GPT 生成】

    问题解答:

    背景知识:

    1. LocalOutlierFactor模型:LocalOutlierFactor是一种基于密度的无监督异常检测算法,用于识别数据集中的异常点。它通过计算每个样本点周围邻近样本的平均密度来确定异常值。

    2. pmml文件:Predictive Model Markup Language(PMML)是一种用于保存和传输预测模型的标准文件格式。它可以将机器学习模型导出为可供其他系统使用的格式。

    3. skl_to_pmml()函数:你提到的skl_to_pmml()函数用于将scikit-learn模型导出为pmml文件。

    问题原因:

    根据你提供的问题描述,LocalOutlierFactor模型在导出为pmml文件时出现了报错'LocalOutlierFactor' object has no attribute '_y'。这个报错的原因是LocalOutlierFactor模型在内部需要访问目标变量的_y属性,但正如你所说,LocalOutlierFactor是一个无监督模型,没有目标变量,因此导致了报错。

    解决方案:

    目前来说,skl_to_pmml()函数不支持直接将LocalOutlierFactor模型导出为pmml文件。但我们有一些替代的解决方案来导出LocalOutlierFactor模型:

    方案一: 使用pickle库将模型序列化保存。

    可以使用pickle库将LocalOutlierFactor模型保存为二进制文件,以便以后加载使用。以下是一个示例代码:

    import pickle
    
    lof_model = LocalOutlierFactor()
    # 训练模型
    # ...
    
    # 保存模型为二进制文件
    with open('lof_model.pkl', 'wb') as f:
        pickle.dump(lof_model, f)
    

    这样做可以保留模型的状态,以备以后使用。

    方案二: 将模型转换为其他格式,如joblibprotobuf

    除了pmml格式,还有其他一些机器学习模型导出的格式。例如,你可以尝试使用joblib库将模型保存为二进制文件,或使用protobuf库将模型保存为protocol buffer格式。以下是示例代码:

    使用joblib保存和加载模型:

    from sklearn.externals import joblib
    
    lof_model = LocalOutlierFactor()
    # 训练模型
    # ...
    
    # 保存模型为二进制文件
    joblib.dump(lof_model, 'lof_model.joblib')
    
    # 加载模型
    lof_model = joblib.load('lof_model.joblib')
    

    使用protobuf保存和加载模型:

    import tensorflow as tf
    from tensorflow.python.saved_model import signature_constants
    from tensorflow.python.saved_model import tag_constants
    
    lof_model = LocalOutlierFactor()
    # 训练模型
    # ...
    
    # 保存模型为protobuf格式
    builder = tf.saved_model.builder.SavedModelBuilder('lof_model')
    signature = tf.saved_model.signature_def_utils.build_signature_def(
        inputs={"input": tf.saved_model.utils.build_tensor_info(input_tensor)},
        outputs={"output": tf.saved_model.utils.build_tensor_info(output_tensor)},
        method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)
    builder.add_meta_graph_and_variables(
        sess, [tag_constants.SERVING], signature_def_map={signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature})
    builder.save()
    

    根据实际需求选择适合的格式进行保存和加载模型。

    结论:

    由于LocalOutlierFactor模型在skl_to_pmml()函数中无法直接导出为pmml文件,因此我们提供了两种可行的替代方案:使用pickle库将模型序列化保存为二进制文件,或将模型转换为其他格式,如joblibprotobuf。通过这些方法,你可以保存和加载LocalOutlierFactor模型,并在以后使用。

    希望以上解决方案能帮助到你!如果你有任何进一步的问题,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 9月4日