Numpy Sklearn与稀疏矩阵值误差
我知道以前也有人问过类似的问题,我尝试过其中的所有建议,但我仍然感到困惑。我有一个包含两列的数据集:第一列包含表示单词的向量,存储为1x10000稀疏csr矩阵(因此每个单元格中都有一个矩阵),第二列包含整数评级,我将用于分类。当我运行以下代码时Numpy Sklearn与稀疏矩阵值误差,numpy,scipy,scikit-learn,sklearn-pandas,Numpy,Scipy,Scikit Learn,Sklearn Pandas,我知道以前也有人问过类似的问题,我尝试过其中的所有建议,但我仍然感到困惑。我有一个包含两列的数据集:第一列包含表示单词的向量,存储为1x10000稀疏csr矩阵(因此每个单元格中都有一个矩阵),第二列包含整数评级,我将用于分类。当我运行以下代码时 for index, row in data.iterrows(): print(row) print(row[0].shape) 我得到了所有行的正确输出 Name: 0, dtype: object (1, 10000) Vect
for index, row in data.iterrows():
print(row)
print(row[0].shape)
我得到了所有行的正确输出
Name: 0, dtype: object
(1, 10000)
Vector (0, 0)\t1.0\n (0, 1)\t1.0\n (0, 2)\t1.0\n ...
Rating 5
现在,当我尝试在任何SKlearn分类器中传递数据时,如下所示:
uniform_random_classifier = DummyClassifier(strategy='uniform')
uniform_random_classifier.fit(data["Vectors"], data["Ratings"])
我得到以下错误:
array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: setting an array element with a sequence.
我做错了什么?我已经确定了我所有的稀疏矩阵都是相同大小的,并且我尝试过以各种方式重塑我的数据,但是运气不好,而且Sklearn分类器应该能够处理csr矩阵
更新:将整个“Vectors”列转换为一个大的二维矩阵是成功的,但为了完整性起见,如果有人好奇并想尝试解决原始问题,下面是我用来生成数据帧的代码。假设数据是一个数据框,其中的行看起来像
“560 420 222”5.0
“2345 2344 2344 5”3.0
请在此处添加一个可复制的代码片段。“…每个单元格中有一个矩阵…”这是对稀疏矩阵的非标准使用。我想您必须将数据结构扁平化才能使用普通2D矩阵,其中矩阵中的每个元素都是标量。几天前,我遇到了一个
稀疏
矩阵的问题,并通过将其转换为密集
矩阵来解决它。如果这对你来说是可行的,那么这是一个简单的解决方案。告诉我们你是如何构造稀疏矩阵的。一个csr
矩阵只能用一个简单的数值dtype
进行计算。其他任何东西都会在某个点上产生问题。是的,正如你所说的Warren Weckesser,当我把向量转换成一个2-D X*10000稀疏矩阵时,它起到了作用。为了完整性起见,我将更新如何生成数据,并查看是否有人知道如何解决原始问题
def vectorize(feature, size):
"""Given a numeric string generated from a vocabulary table return a binary vector representation of
each feature"""
vector = sparse.lil_matrix((1, size))
for number in feature.split(' '):
try:
vector[0, int(number) - 1] = 1
except ValueError:
pass
return vector
def vectorize_dataset(data, vectorize, size):
"""Given a dataset in the appropriate "num num num..." format, a specific vectorization format, and a vector size,
returns the dataset in vectorized form"""
result_data = pd.DataFrame(index=range(data.shape[0]), columns=["Vector", "Rating"])
for index, row in data.iterrows():
# All the mixing up of decodings and encoding has made it so that Pandas incorrectly parses EOF chars
if type(row[0]) == type('str'):
result_data.iat[index, 0] = vectorize(row[0], size).tocsr()
result_data.iat[index, 1] = data.loc[index][1]
return result_data