2014-11-04 2 views
0

Я пытаюсь адаптировать this example к некоторым данным в социальных сетях, которые у меня есть в базе данных SQL-сервера.SciKit-Learn Text Classification от ODBC

Я намеренно заставлял как учебные, так и тестовые комплекты иметь только сообщения в социальных сетях, содержащие слово «пучки». Поэтому я ожидал бы чрезвычайно высокий f-score для этого слова, когда я запускаю его через все алгоритмы. Вместо этого я получаю f-десятки около 2-4%. У меня такое чувство, что я не правильно подаю данные в алгоритмы.

from __future__ import print_function 
import numpy as np 
from time import time 
from sklearn.feature_extraction.text import TfidfVectorizer 
import pyodbc 
import pprint 

#local windows connection 
train = [] 
db = pyodbc.connect('DRIVER={SQL Server Native Client 11.0};SERVER=SERVER_IP;DATABASE=DB_NAME;Trusted_Connection=Yes;') 
cursor = db.cursor() 
training_query = "SELECT top 2 percent postTitle FROM dbo.All_CH_Posts where monitorID ='1168136050' and postTitle like '%bunches%' ORDER BY NEWID()" 
trainquery = cursor.execute(training_query) 
traindata = cursor.fetchall() 
for row in traindata: 
    train.extend(row) 

test = [] 
test_query = "SELECT top 1 percent postTitle FROM dbo.All_CH_Posts where monitorID ='1168136050' and postTitle like '%bunches%' ORDER BY NEWID()" 
testquery = cursor.execute(test_query) 
testdata = cursor.fetchall() 
for row in testdata: 
    test.extend(row) 
print('traindata') 
pp.pprint(traindata) 
print('testdata') 
pp.pprint(testdata) 
print('data loaded') 

# split a training set and a test set 
y_train = train 
y_test =test 


print("Extracting features from the training dataset using a sparse vectorizer") 
t0 = time() 
vectorizer = TfidfVectorizer(decode_error='ignore',sublinear_tf=True, 
          stop_words='english', lowercase=True, min_df=20) 
X_train = vectorizer.fit_transform(train) 
duration = time() - t0 

print("Extracting features from the test dataset using the same vectorizer") 
t0 = time() 
X_test = vectorizer.transform(test) 
duration = time() - t0 
print("n_samples: %d, n_features: %d" % X_test.shape) 

feature_names = np.asarray(vectorizer.get_feature_names()) 
print(feature_names) 

Я намеренно установить min_df высоко, чтобы взглянуть на то, что слова в моей разреженной матрицы:

n_samples: 237, n_features: 26 
['almonds' 'amp' 'best' 'bowl' 'box' 'bunches' 'cereal' 'cheerios' 'crunch' 
'day' 'don' 'eat' 'eating' 'good' 'gt' 'honey' 'http' 'just' 'like' 'lol' 
'love' 'miss' 'morning' 'oats' 'rt' 'want'] 

Так что я делаю неправильно? Или я думаю об этой проблеме неправильным образом/имеет неправильное представление о классификации текста?

Here is my training set.

Here is my test set.

+1

Итак, каковы ваши ярлыки? В коде вы устанавливаете '' y_train = train'', который выглядит так, будто вы используете текст в качестве ярлыков, что я считаю довольно запутанным. Какие f-баллы вы используете? Фактически, если все тексты имеют общую особенность, эта функция неинформативна и должна иметь f-оценку нуля (iirc). –

+0

Добавляя к комментарию @AndreasMueller, есть ** Загрузите некоторые категории из раздела учебного набора ** в код примера, что означает, что вам нужно указать категории/метки для классификации. Вы можете проверить значение 'data_train.target_names'? Это должен быть список классов, которые вы пытаетесь классифицировать. –

+0

@Guru Ok я думаю я понимаю. Если бы я добавил метки/категории, они были бы идентификатором monitorID. Я не понимаю, как я привязываю метку к данным, которые проходят через вектор, если мои данные поступают из «select monitorID, postTitle from Table», так как это будет список кортежей и приведет к сбою vectorizor. – dreyco676

ответ

2

Благодаря @AndreasMueller и @Guru. Проблема была в моих ярлыках.

Решение заключается в создании меток для каждой строки.

training_query = "SELECT top 2 percent monitorID, postTitle FROM dbo.All_CH_Posts where monitorID in ('1168136050','469407080') and postTitle <>'' ORDER BY NEWID()" 
trainquery = cursor.execute(training_query) 
traindata = cursor.fetchall() 
for row in traindata: 
    train_data.append(row.postTitle) 
    train_target.append(row.monitorID) 

test_data = [] 
test_target = [] 
test_query = "SELECT top 2 percent monitorID, postTitle FROM dbo.All_CH_Posts where monitorID in ('1168136050','469407080') and postTitle <>'' ORDER BY NEWID()" 
testquery = cursor.execute(test_query) 
testdata = cursor.fetchall() 
for row in testdata: 
    test_data.append(row.postTitle) 
    test_target.append(row.monitorID) 

print("data loaded") 


#assigning labels 
train_le = preprocessing.LabelEncoder() 
y_train = train_le.fit_transform(train_target) 

test_le = preprocessing.LabelEncoder() 
y_test = test_le.fit_transform(test_target) 
Смежные вопросы