AttributeError: ‘numpy.ndarray’ 对象没有属性 ‘toarray’

我在从文本语料库中提取特征,并使用 scikit-learn 中的 td-fidf 向量化器和截断奇异值分解来实现这一目标。然而,由于我想尝试的算法需要密集矩阵,而向量化器返回的是稀疏矩阵,因此我需要将这些矩阵转换为密集数组。但每当我尝试转换这些数组时,我都会收到一个错误,提示我的 numpy 数组对象没有 “toarray” 属性。我做错了什么?

函数如下:

def feature_extraction(train,train_test,test_set):    vectorizer = TfidfVectorizer(min_df = 3,strip_accents = "unicode",analyzer = "word",token_pattern = r'\w{1,}',ngram_range = (1,2))            print("fitting Vectorizer")    vectorizer.fit(train)    print("transforming text")    train = vectorizer.transform(train)    train_test = vectorizer.transform(train_test)    test_set = vectorizer.transform(test_set)    print("Dimensionality reduction")    svd = TruncatedSVD(n_components = 100)    svd.fit(train)    train = svd.transform(train)    train_test = svd.transform(train_test)    test_set = svd.transform(test_set)    print("convert to dense array")    train = train.toarray()    test_set = test_set.toarray()    train_test = train_test.toarray()    print(train.shape)    return train,train_test,test_set

错误追踪:

Traceback (most recent call last):  File "C:\Users\Anonymous\workspace\final_submission\src\linearSVM.py", line 24, in <module>    x_train,x_test,test_set = feature_extraction(x_train,x_test,test_set)  File "C:\Users\Anonymous\workspace\final_submission\src\Preprocessing.py", line 57, in feature_extraction    train = train.toarray()AttributeError: 'numpy.ndarray' object has no attribute 'toarray'

更新:Willy 指出我对矩阵是稀疏的假设可能是错误的。所以我尝试在没有转换的情况下将我的数据直接输入到我的算法中进行降维处理,实际上它可以正常工作。然而,当我排除降维处理,得到大约 53k 个特征时,我得到了以下错误:

    Traceback (most recent call last):  File "C:\Users\Anonymous\workspace\final_submission\src\linearSVM.py", line 28, in <module>    result = bayesian_ridge(x_train,x_test,y_train,y_test,test_set)  File "C:\Users\Anonymous\workspace\final_submission\src\Algorithms.py", line 84, in bayesian_ridge    algo = algo.fit(x_train,y_train[:,i])  File "C:\Python27\lib\site-packages\sklearn\linear_model\bayes.py", line 136, in fit    dtype=np.float)  File "C:\Python27\lib\site-packages\sklearn\utils\validation.py", line 220, in check_arrays    raise TypeError('A sparse matrix was passed, but dense 'TypeError: A sparse matrix was passed, but dense data is required. Use X.toarray() to convert to a dense numpy array.

能有人解释一下吗?

更新2

应要求,我将提供所有涉及的代码。由于代码分散在不同的文件中,我将按步骤发布。为了清晰起见,我将省略所有模块导入。

这是我如何预处理代码的:

def regexp(data):    for row in range(len(data)):        data[row] = re.sub(r'[\W_]+'," ",data[row])        return datadef clean_the_text(data):    alist = []    data = nltk.word_tokenize(data)    for j in data:        j = j.lower()        alist.append(j.rstrip('\n'))    alist = " ".join(alist)    return alistdef loop_data(data):    for i in range(len(data)):        data[i] = clean_the_text(data[i])    return data  if __name__ == "__main__":    print("loading train")    train_text = porter_stemmer(loop_data(regexp(list(np.array(p.read_csv(os.path.join(dir,"train.csv")))[:,1]))))    print("loading test_set")    test_set = porter_stemmer(loop_data(regexp(list(np.array(p.read_csv(os.path.join(dir,"test.csv")))[:,1]))))

在将我的训练集拆分为 x_train 和 x_test 用于交叉验证后,我使用上面的 feature_extraction 函数转换我的数据。

x_train,x_test,test_set = feature_extraction(x_train,x_test,test_set)

最后,我将它们输入到我的算法中

def bayesian_ridge(x_train,x_test,y_train,y_test,test_set):    algo = linear_model.BayesianRidge()    algo = algo.fit(x_train,y_train)    pred = algo.predict(x_test)    error = pred - y_test    result.append(algo.predict(test_set))    print("Bayes_error: ",cross_val(error))    return result

回答:

TruncatedSVD.transform 返回的是数组,而不是稀疏矩阵。事实上,在当前版本的 scikit-learn 中,只有向量化器会返回稀疏矩阵。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注