假设我有一个看起来像这样的dataframe:
import pandas as pd
import numpy as np
vectors = pd.Series([[1.0, 2.0, 3.0], [0.5, 1.5, 2.5], [0.1, 1.1, 2.1]], name='vector')
output = pd.Series([True, False, True], name='target')
data = pd.concat((vectors, output), axis=1)
data
看起来像这样:一系列浮点数列表和一系列布尔值:
vector target
0 [1.0, 2.0, 3.0] True
1 [0.5, 1.5, 2.5] False
2 [0.1, 1.1, 2.1] True
现在,我想在向量之上拟合一个简单的scikit-learn LogisticRegression模型来预测目标输出。
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
clf.fit(X=data['vector'], y=data['target'])
这不起作用,出现错误:
ValueError: setting an array element with a sequence
我首先尝试将向量数据转换为np数组,使用
data['vector'].apply(np.array)
但这会产生与之前相同的错误。
我可以通过执行以下命令使它工作:
input_vectors = np.array(data['vector'].to_list())
clf.fit(X=input_vectors, y=data['target'])
但这看起来相当笨拙和庞大-我把整个pandas数组变成一个列表,然后把它变成一个numpy数组。
我想知道这里是否有更好的方法将这种数据格式转换为scikit-learn可以接受的格式。实际上,我的数据集要大得多,这种转换是昂贵的。考虑到scikit-learn和pandas通常是多么兼容,我想我可能错过了一些东西。
2条答案
按热度按时间xtupzzrd1#
既然你知道列数,那么:
这将把列表分解成一个序列,获取numpy值,将它们转换为正确的类型(你也可以使用
np.float32
,因为这些值看起来不会太大),然后用正确的列数重新整形。flseospp2#
你应该传递一个数组给
clf.fit
,而不是数组的列表/系列。使用
numpy.vstack
: