能否将Dask-ML KMeans用于Dask数组?遇类型错误求助
嗨,别急,完全可以用Dask数组搭配Dask-ML来处理超内存数据集——这正是Dask-ML的核心设计目标之一!你的报错不是因为Dask数组不能和Dask-ML配合,而是代码里的一个小疏忽。
报错原因分析
看你的代码,关键问题出在fit()方法的参数上:
你已经通过da.concatenate(features, axis=1)生成了正确的Dask数组feature_array,但调用model.fit()时,却传入了原始的features列表(而不是拼接后的feature_array)。Dask-ML的模型可以直接接受Dask数组作为输入,但无法直接处理数组列表,这才触发了那个TypeError: 'float' object cannot be interpreted as an integer。
修正后的代码
只需要把fit()的参数改成拼接后的Dask数组即可:
import dask.array as da from dask_ml.cluster import KMeans # 假设features是多个Dask数组的列表 feature_array = da.concatenate(features, axis=1) # 不需要调用compute() model = KMeans(n_clusters=4) model.fit(feature_array, y=None) # 传入Dask数组feature_array,而非原始列表features
为什么compute()后能运行?
当你对feature_array执行compute()时,它会被转换成NumPy数组并加载到内存中。此时如果你的features列表本身是NumPy数组的集合,或者你误将compute后的feature_array当成features传入,Scikit-learn风格的模型可以处理这种内存内的数组列表,但这完全违背了Dask处理超内存数据的初衷——毕竟compute()会把整个数据集加载到单台机器的内存,无法应对真正超出内存规模的数据。
关于Dask-ML的核心价值
Dask-ML的KMeans就是为超内存数据集设计的:它会在Dask数组上进行并行、分块的计算,不需要把整个数据集加载到内存,完美匹配你处理超大规模数据的需求。只要确保传入模型的是Dask数组(而非原始数组列表),就可以正常运行。
内容的提问来源于stack exchange,提问作者FlorianEn

