我有一个包含9个特征和9个预期目标的CSV文件,我希望在这组数据上测试两个回归模型(这些数据应以流的形式生成)。
当我使用相同的数据(通过scikit-multiflow从CSV文件生成流)测试两个模型时,我得到了一个很差的R2分数。
但当我使用scikit-learn对数据进行标准化后进行测试时,我得到了一个非常好的R2分数。问题是我不应该使用scikit-learn,因为我应该实时标准化数据。
所以我在scikit-multiflow中寻找类似的方法,我找到了两个方法:normalize_sample(X)
和normalize_targets(y)
。
但问题是normalize_sample依赖于一个名为examples_seen的变量,这个变量是模型已经使用过的样本数量(用于训练和测试)。据我所知,当我们对模型调用“evaluate”方法时,这个变量会发生变化。但这没有任何意义,因为我们应该先标准化数据然后再进行训练,而不是相反。我确定我在这里错过了什么。请有人帮帮我,因为没有这种用法的例子。
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) # 这里它会返回一个包含10个零的数组,因为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) 显示为0 evaluator.evaluate(stream=stream, model=[ht,rh], model_names=['HT', 'RH']) # print(ht.examples_seen) 显示为200000 ht.normalize_sample(stream.X) # 即使在这里它也会显示错误“操作数无法与形状(5733524,9) (9,) (5733524,) (9,) 一起广播”
我希望能在调用“evaluate
”方法之前使用“normalize_sample
”。请帮助我
回答:
简而言之: 当前版本的scikit-multiflow
(0.3.0)没有提供增量标准化数据的专用方法。这仅由一些回归模型(RegressionHoeffdingTree
和MultiTargetRegressionHoeffdingTree
)内部执行。
关于实现细节:来自sklearn
的标准化数据是不同的,因为正如你提到的,它考虑了所有数据。另一方面,normalize_sample
和normalize_targets
在模型观察到新样本时进行增量标准化。
evaluate
方法不是模型的一部分,而是评估器类(你示例中的EvaluatePrequential
)的一部分。特别是,预评估器首先调用predict
(测试)方法,然后调用相应模型的partial_fit
方法。内部参数samples_seen
仅在训练期间更新。
来源: 我是scikit-multiflow
的维护者
注意: 快速联系scikit-multiflow
的开发者和社区的方法是通过官方平台(用户组、聊天、GitHub页面)。