2016-07-02 4 views
0

Я пытаюсь сделать KNN с помощью сходства Косинус в SciKIt Learn, но он продолжает бросать эти предупреждения. Может ли кто-нибудь объяснить, в чем смысл этого, и почему он приходит только тогда, когда я пытаюсь подгонять модель KNN с подобием косинуса, а не с какой-либо другой метрикой расстояния?KNN с TF-IDF Бросок «Измените свои данные» Предупреждения с косинусом Сходство как метрика расстояния

Код:

t0 = time.time() 
count_vect = CountVectorizer() 
X_train_counts = count_vect.fit_transform(X) 

tfidf_transformer = TfidfTransformer() 
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts) 

vectorizer = TfidfVectorizer() 
vec_fit = vectorizer.fit_transform(X) 

t1 = time.time() 
total = t1-t0 
print "TF-IDF built:", total 

#######################------------------------############################ 

t0 = time.time() 
nbrs = NearestNeighbors(n_neighbors=20, algorithm='auto', metric=cosine_similarity) 
nbrs.fit(X_train_tfidf.toarray())#,Y) 
#KD_TREE won't work here becuase it doesn't work with Sparse Matrix -- on giving it a dense matrix, it throws a memory error 

t1 = time.time() 
total = t1-t0 
print "KNN Built:", total 

Повторное предупреждение Msg:

C:\Anaconda2\lib\site-packages\sklearn\utils\validation.py:386: DeprecationWarning: Passing 1d arrays as data is depreca 
ted in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.reshape(-1, 1) if your data has a single 
feature or X.reshape(1, -1) if it contains a single sample. 
    DeprecationWarning) 

По предложению Попробованная это сделать:

nbrs = NearestNeighbors(n_neighbors=20, algorithm='auto', metric=cosine_similarity) 
nbrs.fit(numpy.array(X_train_tfidf).reshape(1, -1)) 

который выдает следующее сообщение об ошибке:

Traceback (most recent call last): 
    File ".\tf-idf.py", line 54, in <module> 
    nbrs.fit(numpy.array(X_train_tfidf).reshape(1, -1)) 
    File "C:\Miniconda2\lib\site-packages\sklearn\neighbors\base.py", line 816, in fit 
    return self._fit(X) 
    File "C:\Miniconda2\lib\site-packages\sklearn\neighbors\base.py", line 221, in _fit 
    X = check_array(X, accept_sparse='csr') 
    File "C:\Miniconda2\lib\site-packages\sklearn\utils\validation.py", line 373, in check_array 
    array = np.array(array, dtype=dtype, order=order, copy=copy) 
ValueError: setting an array element with a sequence. 

ответ

0

Для меня не имеет смысла, чтобы это не отображалось с другими метриками (например, linear_kernel), я думаю, что это то, что они забыли (?) Для обновления, потому что оба (linear_kernel и cosine_similarity) являются операциями ядра.

В связи с этим вы получаете эту ошибку, потому что метод fit() ожидает 2-мерный массив, но вы проходите одномерную. , например, это поднимет это предупреждение X_train_tfidf=np.array([1,2,3,4.234,213.2]), так как оно имеет форму 5. С другой стороны это не будет X_train_tfidf=np.array([[1,2,3,4.234,213.2]]), потому что оно имеет форму (5,1) и поэтому является двумерным.

что предлагает предупреждающее сообщение, чтобы взять 1-мерный массив и преобразовать его в 2-мерный как X_train_tfidf=np.array([1,2,3,4.234,213.2]).reshape(1, -1) что эквивалентно X_train_tfidf=np.array([[1,2,3,4.234,213.2]]) матриц

ядра в основном дети линейной алгебры и вовлекает матричные операции, которые по по умолчанию 2-мерный.

Надеюсь, что это имеет смысл, если нет, пожалуйста, кричите.

+0

TF-IDF - это редкая матрица, поэтому я не очень разбираюсь в ней. и что numpy.array(). reshape (1, -1) ---- не работает. Отредактировал ответ. – user3667569

+0

попробуйте этот 'X_train_tfidf.toarray(). Reshape (1, -1)' – kazAnova

+0

Пробовал. Та же проблема. – user3667569

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

  • Нет связанных вопросов^_^