稀疏矩阵长度不明确

fat*_*mau 2 python scikit-learn keras sklearn-pandas

我对机器学习很陌生,所以这个问题可能听起来很愚蠢。我正在学习有关文本分类教程,但遇到了一个我不知道如何解决的错误。

这是我拥有的代码(基本上就是教程中找到的代码)

import pandas as pd

filepath_dict = {'yelp':   'data/yelp_labelled.txt',
              'amazon': 'data/amazon_cells_labelled.txt',
              'imdb':   'data/imdb_labelled.txt'}

df_list = []
for source, filepath in filepath_dict.items():
df = pd.read_csv(filepath, names=['sentence', 'label'], sep='\t')
df['source'] = source  
df_list.append(df)

df = pd.concat(df_list)
print(df.iloc[0:4])


from sklearn.feature_extraction.text import CountVectorizer

df_yelp = df[df['source'] == 'yelp']

sentences = df_yelp['sentence'].values
y = df_yelp['label'].values

from sklearn.model_selection import train_test_split
sentences_train, sentences_test, y_train, y_test = train_test_split(sentences, y, test_size=0.25, random_state=1000)


from sklearn.feature_extraction.text import CountVectorizer


vectorizer = CountVectorizer()
vectorizer.fit(sentences_train)

X_train = vectorizer.transform(sentences_train)
X_test  = vectorizer.transform(sentences_test)

from keras.models import Sequential
from keras import layers

input_dim = X_train.shape[1] 

model = Sequential()
model.add(layers.Dense(10, input_dim=input_dim, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', 
            optimizer='adam', 
            metrics=['accuracy'])
model.summary()

history = model.fit(X_train, y_train,
nb_epoch=100,
verbose=False,
validation_data=(X_test, y_test),
batch_size=10)
Run Code Online (Sandbox Code Playgroud)

当我到达最后一行时,出现错误

“类型错误:稀疏矩阵长度不明确;使用 getnnz() 或 shape[0]”

我想我必须对我正在使用的数据执行某种转换,或者我应该尝试以不同的方式加载这些数据。我已经尝试在 Stackoverflow 上进行搜索,但是 - 对这一切都不熟悉 - 我找不到任何有用的东西。

我如何使这项工作?理想情况下,我不仅希望获得解决方案,还希望获得有关错误发生原因以及解决方案如何解决错误的简要说明。

谢谢!

Ser*_*nov 6

你面对这种困难的原因是,你的X_trainX_test有型<class scipy.sparse.csr.csr_matrix>而您的模型期望它是一个 numpy 数组。

尝试将它们铸造成密集型,然后就可以了:

X_train = X_train.todense()
X_test = X_test.todense()
Run Code Online (Sandbox Code Playgroud)