Ошибка CountVectorizer: ValueError: установка элемента массива с последовательностью - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть набор данных из 144 отзывов учеников с 72 положительными и 72 отрицательными отзывами соответственно.Набор данных имеет два атрибута, а именно данные и цель, которые содержат предложение и настроение (положительное или отрицательное) соответственно.Рассмотрим следующий код:

import pandas as pd
feedback_data = pd.read_csv('output.csv')
print(feedback_data)  


    data    target
0      facilitates good student teacher communication.  positive
1                           lectures are very lengthy.  negative
2             the teacher is very good at interaction.  positive
3                       good at clearing the concepts.  positive
4                       good at clearing the concepts.  positive
5                                    good at teaching.  positive
6                          does not shows test copies.  negative
7                           good subjective knowledge.  positive
8                           good communication skills.  positive
9                               good teaching methods.  positive
10   posseses very good and thorough knowledge of t...  positive
11   posseses superb ability to provide a lots of i...  positive
12   good conceptual skills and knowledge for subject.  positive
13                      no commuication outside class.  negative
14                                     rude behaviour.  negative
15            very negetive attitude towards students.  negative
16   good communication skills, lacks time punctual...  positive
17   explains in a better way by giving practical e...  positive
18                               hardly comes on time.  negative
19                          good communication skills.  positive
20   to make students comfortable with the subject,...  negative
21                       associated to original world.  positive
22                             lacks time punctuality.  negative

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(binary = True)
cv.fit(feedback_data['data'].values)
X = feedback_data['data'].apply(lambda X : cv.transform([X])).values
X_test = cv.transform(feedback_data_test)

from sklearn import svm
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split

target = [1 if i<72 else 0 for i in range(144)]
print(target)

X_train, X_val, y_train, y_val = train_test_split(X, target, train_size = 0.50)

clf = svm.SVC(kernel = 'linear', gamma = 0.001, C = 0.05)
#The below line gives the error
clf.fit(X , target)

Я не знаю, что не так.Пожалуйста, помогите

1 Ответ

0 голосов
/ 25 февраля 2019

Ошибка исходит из способа X, как было сделано.Вы не можете использовать непосредственно X в методе Fit.Вам нужно сначала преобразовать его немного больше (я не мог бы сказать вам, что для другой проблемы, поскольку у меня не было информации)

сейчас у вас есть следующее:

array([<1x23 sparse matrix of type '<class 'numpy.int64'>'
with 5 stored elements in Compressed Sparse Row format>,
   ...
   <1x23 sparse matrix of type '<class 'numpy.int64'>'
with 3 stored elements in Compressed Sparse Row format>], dtype=object)

Что достаточно для раскола.Мы просто собираемся преобразовать его, как вы понимаете, так же, как и метод подгонки:

X = list([list(x.toarray()[0]) for x in X])

Что мы делаем, это конвертируем разреженную матрицу в массив с пустым фрагментом, берём первый элемент (он имеет только один элемент)и затем преобразовать его в список, чтобы убедиться, что он имеет правильное измерение.

Теперь, почему мы делаем это:

X - что-то вроде

>>>X[0]
   <1x23 sparse matrix of type '<class 'numpy.int64'>'
   with 5 stored elements in Compressed Sparse Row format>

, такмы преобразуем его, чтобы увидеть, что это на самом деле:

>>>X[0].toarray()
   array([[0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
         0]], dtype=int64)

, а затем, как вы видите, возникает небольшая проблема с измерением, поэтому мы берем первый элемент.

возвращаясь к спискуничего не делает, это просто для вас, чтобы хорошо понять, что вы видите.(вы можете сбросить его для скорости)

ваш код теперь такой:

cv = CountVectorizer(binary = True)
cv.fit(df['data'].values)
X = df['data'].apply(lambda X : cv.transform([X])).values
X = list([list(x.toarray()[0]) for x in X])
clf = svm.SVC(kernel = 'linear', gamma = 0.001, C = 0.05)
clf.fit(X, target)
...