2013-11-22 3 views
4

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

Update: Вилли указал, что мое предположение матрицы, скудно может быть неправильным. Так что я пытался кормить свои данные для моего алгоритма с уменьшением размерности и он фактически работал без какого-либо преобразования, однако, когда я исключил снижение размерности, который дал мне около 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. 

Может кто-то объяснить это ?

Update2

В соответствии с просьбой, я дам весь код участие. Поскольку он разбросан по разным файлам, я просто отправлю его поэтапно. Для ясности я оставлю все модули.

Это, как я препроцессировать мой код:

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 для cross_validation я трансформировать свои данные с помощью функции 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 
+4

Если 'train' уже является ndarray, то ваше предположение о его возврате разреженной матрицы неверно. – willy

+0

Возможно, вы правы, позвольте мне проверить это. – Learner

+0

Проверено. Теперь вы можете добавить редактирование на мой вопрос. – Learner

ответ

1

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

+0

@Learner: он находится в [docstring] (http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.TruncatedSVD.html#sklearn.decomposition.TruncatedSVD.transform) для этого метода. –

Смежные вопросы