AttributeError: объект «numpy.ndarray» не имеет атрибута «toarray»

Я извлекаю функции из текстового корпуса, и для этого я использую векторизатор td-fidf и усеченное разложение по сингулярным значениям из scikit-learn. Однако, поскольку алгоритм, который я хочу опробовать, требует плотных матриц, а векторизатор возвращает разреженные матрицы, мне нужно преобразовать эти матрицы в плотные массивы. Но всякий раз, когда я пытаюсь преобразовать эти массивы, я получаю сообщение об ошибке, сообщающее мне, что мой объект массива 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'

Обновление: Вилли указал, что мое предположение о разреженности матрицы может быть неверным. Итак, я попытался передать свои данные моему алгоритму с уменьшением размерности, и он действительно работал без какого-либо преобразования, однако, когда я исключил уменьшение размерности, что дало мне около 53 тысяч функций, я получаю следующую ошибку:

    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 data

def 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 alist
def 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]))))

После разделения моего train_set на 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

person Learner    schedule 22.11.2013    source источник
comment
Если train уже является ndarray, то ваше предположение о том, что он возвращает разреженную матрицу, неверно.   -  person willy    schedule 22.11.2013
comment
Возможно, ты прав, позволь мне проверить это.   -  person Learner    schedule 22.11.2013
comment
Проверил. Собираюсь добавить редактирование к моему вопросу прямо сейчас.   -  person Learner    schedule 22.11.2013
comment
вы должны включить весь код, а не только сообщения. ndarray плотна по определению, разреженные матрицы представлены в разных объектах, так что скорее ошибка в вашем коде (которую вы не прикрепили)   -  person lejlot    schedule 22.11.2013
comment
Хорошо, я добавлю весь задействованный код.   -  person Learner    schedule 23.11.2013


Ответы (1)


TruncatedSVD.transform возвращает массив, а не разреженную матрицу. Фактически, в текущей версии scikit-learn только векторизаторы возвращают разреженные матрицы.

person Fred Foo    schedule 23.11.2013
comment
@Learner: это в строка документации для этого метода. - person Fred Foo; 23.11.2013