【问题标题】:How to normalize data before evaluation in scikit-multiflow?如何在 scikit-multiflow 评估之前标准化数据?
【发布时间】:2019-12-02 18:53:14
【问题描述】:

我有一个包含 9 个特征和 9 个预期目标的 CSV 文件,我想在这个数据上测试 2 个回归模型(应该作为流生成)。

当我使用相同的数据(使用 CSV 文件中的 scikit-multiflow 作为流生成)测试 2 个模型时,我得到了一个错误的 R2_score。

但是当我使用 scikit-learn 对我的数据进行标准化版本测试时,我得到了非常好的 R2 分数。问题是我不应该使用 scikit-learn,因为我应该实时规范化数据。

所以我在 scikit-multiflow 中搜索了类似的东西,发现了 2 种方法:normalize_sample(X)and normalize_targets(y)

但问题是 normalize_sample 依赖于一个名为 examples_seen 的变量,这个变量是模型已经使用的示例数量(用于训练和测试)。 据我所知,当我们在模型上调用“评估”方法时,这个变量会发生变化。 但这没有任何意义,因为我们应该规范化数据然后训练它,而不是相反。我确定我在这里遗漏了一些东西。 谁能帮帮我,因为没有这种用法的例子。

    import csv
    from skmultiflow.data.file_stream import FileStream
    from skmultiflow.trees import MultiTargetRegressionHoeffdingTree
    from skmultiflow.evaluation import EvaluatePrequential
    from skmultiflow.meta import RegressorChain
    stream = FileStream('supervised_file_v4.csv', target_idx=9, n_targets=9)
    stream.prepare_for_use()
    ht = MultiTargetRegressionHoeffdingTree()
    rh = RegressorChain()
    ht.normalize_sample(stream.X)
    # here it gives me an array of 10 zeros beacause examples_seen = 0
    evaluator = EvaluatePrequential(show_plot=False,
                            pretrain_size=30000,
                            max_samples=200000, 
                           metrics = ['average_mean_absolute_error','average_root_mean_square_error'])
    # print(ht.examples_seen) gives 0
    evaluator.evaluate(stream=stream, model=[ht,rh], model_names=['HT', 'RH'])
    # print(ht.examples_seen) gives 200000
    ht.normalize_sample(stream.X)
    # even here it gives a error saying "operands could not be broadcast together with shapes (5733524,9) (9,) (5733524,) (9,)"

我希望我们可以在调用“evaluate”方法之前使用“normalize_sample”。请帮忙

【问题讨论】:

    标签: python machine-learning scikit-learn


    【解决方案1】:

    简而言之:当前版本的scikit-multiflow (0.3.0) 没有提供专用的方法来逐步规范化数据。这仅由某些回归模型(RegressionHoeffdingTreeMultiTargetRegressionHoeffdingTree)在内部执行。

    关于实施细节: 来自sklearn 的标准化数据是不同的,因为正如您所提到的,它考虑了所有数据。另一方面,normalize_samplenormalize_targets 增量地执行归一化,因为模型会观察到新样本

    evaluate 方法不是模型的一部分,而是评估器类的一部分(在您的示例中为EvaluatePrequential)。特别是,前置评估器首先调用predict(测试)方法,然后调用相应模型的partial_fit 方法。内部参数samples_seen在训练期间更新。

    来源:我是scikit-multiflow的维护者

    注意:联系scikit-multiflow 的开发人员和社区的一种快速方式是通过官方平台(用户组、聊天、GitHub 页面)。

    【讨论】:

    • 非常感谢您的回答,您说有一些回归模型可以逐步执行数据规范化,请给我一些名称(即使它们是单目标模型)?你能给我一些别的建议(标准化数据)吗?
    • 我已经编辑了我的答案,提到了在内部执行规范化的算法。另一种方法是创建一个normalize 转换器以与模型配对。
    • 非常感谢,关于变压器,你的意思是像这个链接scikit-multiflow.github.io/scikit-multiflow/_autosummary/…
    • 是的。在示例中,transformer 对象 (one_hot_to_categorical) 与模型配对。这是由pipeline 对象处理的。
    猜你喜欢
    • 2016-09-07
    • 2014-03-31
    • 2018-08-12
    • 2020-03-25
    • 2012-01-22
    • 2015-03-10
    • 2019-11-29
    • 2023-03-17
    • 2021-01-15
    相关资源
    最近更新 更多