2015-10-05 4 views
0

У меня есть текстовые файлы с документами и их описание. Я использую SGD Classifier, доступный в scikit-learn, чтобы получить два отдельных класса документов. Я обучил свою модель, используя следующий код:scikit-learn SGD Классификатор документов: Использование только важных функций

fo = open('training_data.txt','rb') 
all_classes = np.array([0,1]) 

for i,line in enumerate(generate_in_chunks(fo,1000)): 

    x = [member.split('^')[2] for member in line if member!="\n"] 
    y = [member.split('^')[1] for member in line if member!="\n"] 
    vectorizer = HashingVectorizer(decode_error='ignore', n_features=2 ** 18,non_negative=True) 

    x_train = vectorizer.transform(x) 
    y_train = np.asarray(y,dtype=int) 

    clf = SGDClassifier(loss='log',penalty='l2',shuffle=True) 

    clf.partial_fit(x_train, y_train,classes=all_classes) 

Теперь я использую этот объект clf в своем тестовом наборе данных. Здесь я хочу использовать преобразование упомянутых в учебнике: http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.SGDClassifier.html#sklearn.linear_model.SGDClassifier

Код:

fo = open('test_data.txt','rb') 
prob_comp = open('pred_prob_actual.txt','wb') 
for i,line in enumerate(generate_in_chunks(fo,21000)): 
    x = [member.split('^')[2] for member in line if member!="\n"] 
    y = [member.split('^')[1] for member in line if member!="\n"] 

    vectorizer = HashingVectorizer(decode_error='ignore', n_features=2 ** 18,non_negative=True) 

    x_test = vectorizer.transform(x) 
    y_test = np.asarray(y,dtype=int) 

    clf.predict(clf.transform(x_test)) 

Ошибка:

Traceback (самый последний вызов последнего):

Файл "test.py" , строка 106, в clf.predict (clf.transform (x_test)) Файл «/opt/anaconda2.2/lib/python2.7/site-packages/sklearn/linear_model/base.py», строка 223, в предсказать scores = self.decision_function (X) Файл «/opt/anaconda2.2/lib/python2.7/site-packages/sklearn/linear_model/base.py», строка 204, в решении_функции % (X.shape [ 1], n_features))

ValueError: X имеет 78 функций на образец; ожидая 206

Так что в основном это определило важные функции, но не может их использовать при прогнозировании на тестовых данных.

Любое предложение о том, как я могу использовать метод преобразования для тестовых данных, будет широко оценено. Я хочу использовать только важные функции и искать способы, которые могут помочь в этом, только чтобы сделать его более понятным. Спасибо.

+0

Для важных функций, я предлагаю вам взглянуть на [TfIdfVectorizer] (http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#sklearn.feature_extraction.text.TfidfVectorizer). С его помощью вы сможете указать «min_df», который поможет вам извлечь более важные функции в документе. –

ответ

0

Изменение ваша последняя линия:

clf.predict(x_test.toarray()) 

Вы трансформируют набор данных с HashingVectorizer, но этого недостаточно. Вам необходимо применить toarray(), чтобы получить матрицу векторов признаков, на основе которых выполняется прогнозирование.

Хотя, для удобства чтения и «лучше» (по-моему) структурирование кода я бы порекомендовал вам настроить свой код на:

x_train = vectorizer.fit_transform(x) 
... 
x_test = vectorizer.transform(x).toarray() 
y_test = np.asarray(y,dtype=int) 

result = clf.predict(x_test) 

print result 
+0

Спасибо, Sir, я попробовал, как вы предложили, и получил следующую ошибку: Traceback (последний последний звонок): Файл «test.py», строка 106, в clf.predict (clf.transform (x_test). to_array()) Файл «/opt/anaconda2.2/lib/python2.7/site-packages/scipy/sparse/base.py», строка 499, в __getattr__ raise AttributeError (attr + «not found») AttributeError: to_array не найден –

+0

@PappuJha Пожалуйста, взгляните на мой ответ сейчас. Он должен исправить вашу проблему. –

+0

@PappuJha Как нас найти?Откорректируйте строку для 'x_train = fit_transform (x)' –