能否直接将py2neo返回的Cursor对象输入机器学习模型?
能否直接将py2neo的Cursor对象传入机器学习模型?
不行,没法直接把py2neo.cypher.Cursor对象传入train_test_split或其他机器学习模型。
原因
scikit-learn等主流机器学习库的API(包括train_test_split)要求输入是序列或类数组结构(比如列表、NumPy数组、Pandas DataFrame),这类结构支持随机访问、形状检查等ML算法必需的操作。而Cursor本质是一个迭代器,只会逐行返回Neo4j查询结果,不具备ML库需要的核心数据结构特性,所以会抛出Expected sequence or array-like, got <class 'py2neo.cypher.Cursor'>错误。
替代方案
虽然不能直接用Cursor,但可以用高效的方式将其转换为ML库支持的类型,或者在数据库端提前拆分数据集:
方案1:快速转换为NumPy数组
直接从Cursor生成数组,避免冗余的中间存储:
import numpy as np from sklearn.model_selection import train_test_split from py2neo import Graph # 连接数据库 graph = Graph("bolt://localhost:11003", auth=("neo4j", "12345678")) # 获取Cursor对象 cursor_X = graph.run("MATCH (n:Battery) RETURN n.cycle, n.voltage_measured, n.current_measured, n.temperature_measured,n.voltage_load") cursor_y = graph.run("MATCH (n:Battery) RETURN n.time") # 转换为NumPy数组 X = np.array(list(cursor_X)) y = np.array(list(cursor_y)).flatten() # 将单列标签转为一维数组 # 拆分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
方案2:数据库端拆分(适合大数据量)
如果数据量极大,不想一次性加载到Python内存,可以在Neo4j中直接拆分数据集,再分别读取:
# 训练集:抽取80%随机样本 train_cursor_X = graph.run("MATCH (n:Battery) WHERE rand() < 0.8 RETURN n.cycle, n.voltage_measured, n.current_measured, n.temperature_measured,n.voltage_load") train_cursor_y = graph.run("MATCH (n:Battery) WHERE rand() < 0.8 RETURN n.time") # 测试集:抽取剩余20%样本 test_cursor_X = graph.run("MATCH (n:Battery) WHERE rand() >= 0.8 RETURN n.cycle, n.voltage_measured, n.current_measured, n.temperature_measured,n.voltage_load") test_cursor_y = graph.run("MATCH (n:Battery) WHERE rand() >= 0.8 RETURN n.time") # 转换为数组供模型使用 X_train = np.array(list(train_cursor_X)) y_train = np.array(list(train_cursor_y)).flatten() X_test = np.array(list(test_cursor_X)) y_test = np.array(list(test_cursor_y)).flatten()
注意:直接用
rand()可能导致训练/测试集有少量重叠,更严谨的方式是先给每个Battery节点添加一个随机数属性,再基于该属性拆分。
内容的提问来源于stack exchange,提问作者Utkarsh Kumar
相关产品推荐
相关产品推荐

