Классификация текста SciKit-Learn от ODBC

Я пытаюсь адаптировать этот пример к некоторым данным социальных сетей, которые у меня есть в База данных SQL-сервера.

Я намеренно заставил как обучающие, так и тестовые наборы содержать только сообщения в социальных сетях, содержащие слово «пучки». Поэтому я ожидал бы чрезвычайно высокого значения 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']

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

Вот мой обучающий набор.

Вот мой набор тестов.


person dreyco676    schedule 04.11.2014    source источник
comment
Так какие у вас ярлыки? В коде вы устанавливаете y_train = train, который выглядит так, как будто вы используете текст в качестве меток, что меня довольно сбивает с толку. Какие f-баллы вы вычисляете? На самом деле, если у всех текстов есть общая черта, эта функция неинформативна и должна иметь нулевой f-балл (iirc).   -  person Andreas Mueller    schedule 05.11.2014
comment
Добавляя к комментарию @AndreasMueller, в примере кода есть раздел Загрузить некоторые категории из обучающего набора, что означает, что вам нужно указать категории / метки для классификации. Вы можете проверить значение data_train.target_names? Это должен быть список классов, которые вы пытаетесь классифицировать.   -  person Gurupad Hegde    schedule 05.11.2014
comment
@Guru Хорошо, я понимаю. Если бы я добавил ярлыки / категории, это были бы идентификаторы монитора. Мне неясно, как я сохраняю ярлык, связанный с данными, которые проходят через векторизатор, если мои данные поступают из select monitorID, postTitle из таблицы, поскольку это будет список кортежей и приведет к сбою векторизатора.   -  person dreyco676    schedule 05.11.2014
comment
Вы не должны передавать метки векторизатору (ну, вы можете использовать y, но он ничего не сделает). Ярлыки - это то, что во всем scikit-learn называется y.   -  person Andreas Mueller    schedule 05.11.2014
comment
@AndreasMueller, спасибо. У меня возникли проблемы с пониманием того, как я могу организовать свои данные, чтобы он знал, что определенные ярлыки прикреплены к определенным сообщениям в моем обучающем наборе. Кажется, что они почти полностью разделены.   -  person dreyco676    schedule 05.11.2014
comment
Тогда я не понимаю, какую задачу вы пытаетесь решить. Вы говорите о f-показателях, поэтому я предположил, что вы хотите провести классификацию текста. Разве это не то, что ты хочешь делать?   -  person Andreas Mueller    schedule 05.11.2014
comment
Да, я хочу провести классификацию текста. Похоже, вы правы, и моя проблема в отсутствии ярлыков. Итак, я полагаю, что корень проблемы решен. Я попробую несколько вещей и закрою вопрос.   -  person dreyco676    schedule 05.11.2014
comment
Хорошо, спасибо, ребята. Я решил эту проблему. Я не знал, что ярлыки так слабо связаны. Это буквально список меток для каждой строки.   -  person dreyco676    schedule 05.11.2014


Ответы (1)


Спасибо @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)
person dreyco676    schedule 05.11.2014