从Pandas dataframe列获取scikit-learn模型的功能

1mrurvl1  于 2023-04-19  发布在  其他
关注(0)|答案(2)|浏览(132)

假设我有一个看起来像这样的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通常是多么兼容,我想我可能错过了一些东西。

xtupzzrd

xtupzzrd1#

既然你知道列数,那么:

X = data["vector"].explode().values.astype(float).reshape(-1, 3)

这将把列表分解成一个序列,获取numpy值,将它们转换为正确的类型(你也可以使用np.float32,因为这些值看起来不会太大),然后用正确的列数重新整形。

flseospp

flseospp2#

你应该传递一个数组给clf.fit,而不是数组的列表/系列。
使用numpy.vstack

import numpy as np
from sklearn.linear_model import LogisticRegression

clf = LogisticRegression()

clf.fit(X=np.vstack(data['vector']), y=data['target'])

clf.coef_
# array([[0.02622973, 0.02623115, 0.02623258]])

clf.intercept_
# array([0.57262013]))

相关问题