Алгоритм машинного обучения не работает после векторизации функции, имеющей тип текста - PullRequest
0 голосов
/ 10 сентября 2018

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

строка 51, в classifier.fit (X_train, y_train.values.ravel ())

ValueError: установка элемента массива с последовательностью.

Ниже мой код.

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from io import StringIO
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import LinearSVC
from sklearn.model_selection import cross_val_score
from sklearn.metrics import confusion_matrix

df = pd.read_csv('data.csv')
df = df[pd.notnull(df['memo'])]
df = df[pd.notnull(df['name'])]


# factorize type, name, and categorized account
df['type_id'] = df.txn_type.factorize()[0]
df['name_id'] = df.name.factorize()[0]
df['categorizedAccountId'] = df.categorizedAccount.factorize()[0]

my_list = df['categorizedAccountId'].tolist()

print(my_list)

tfidf = TfidfVectorizer(sublinear_tf=True, min_df=5, norm='l2', encoding='latin-1', ngram_range=(1, 2), stop_words='english')
memoFeatures = tfidf.fit_transform(df.memo)

df['memo_id'] = pd.Series(memoFeatures, index=df.index)



X = df.loc[:, ['type_id', 'name_id', 'memo_id']]
y = df.loc[:, ['categorizedAccountId']]



X_train, X_test, y_train, y_test = train_test_split(X, y)



'''print(X_train.shape)
print(X_test.shape)
print(y_train.shape)
print(y_test.shape)
'''
classifier = LogisticRegression(random_state=0)
classifier.fit(X_train, y_train.values.ravel())

y_pred = classifier.predict(X_test)
confusion_matrix = confusion_matrix(y_test, y_pred)

print('Accuracy of logistic regression classifier on test set: {:.2f}'.format(classifier.score(X_test, y_test)))

А также вот несколько строк моих данных. В верхней строке есть метки, а классифицированная учетная запись - это класс

"txn_type","name","memo","account","amount","categorizedAccount"
"Journal","","ABC.com 11/29/16 Payments",0,207.24,"1072 ABC.com Money Out Clearing"
"Bill Payment","College Tuition Fund","Multiple inv. (details on stub)",164,-207.24,"1072 ABC.com Money Out Clearing"

1 Ответ

0 голосов
/ 10 сентября 2018

Хорошо, поэтому я реализовал некоторые модификации вашего кода, которые я вставил сюда.Этот фрагмент идет сразу после того, как вы прочитаете CSV и удалите пустые строки.Вы должны сами реализовать train_test_split.

df['categorizedAccount'] = df['categorizedAccount'].astype('category')

df['all_text'] = df['txn_type'] + ' ' + df['name'] + ' ' + df['memo']

X = df['all_text']
y = df['categorizedAccount']

X_train = X # Change these four lines for train_test_split
X_test = X # I don't have enough rows in the mock dataset to implement it,
y_train = y # And it returns an error
y_test = y

tfidf = TfidfVectorizer()
X_train_transformed = tfidf.fit_transform(X_train)
classifier = LogisticRegression(random_state=0)
classifier.fit(X_train_transformed, y_train)

X_test_transformed = tfidf.transform(X_test)
y_pred = classifier.predict(X_test_transformed)

classifier.score(X_test_transformed, y_pred)

Несколько комментариев, однако:

from sklearn.feature_extraction.text import TfidfVectorizer 

Импортировано один раз, хорошо

from io import StringIO

Насколько мне нужноможно увидеть

from sklearn.feature_extraction.text import TfidfVectorizer 

Почему вы импортируете его снова?

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

TfidfVectorizer выполняет работу как CountVectorizer, так и TfidfTransformer.От sklearn: «Эквивалент CountVectorizer, за которым следует TfidfTransformer».См. здесь для получения дополнительной информации

from sklearn.naive_bayes import MultinomialNB 
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import LinearSVC
from sklearn.model_selection import cross_val_score

Не используется, не импортируйте.

Дополнительно:

1) Непонятно, что вы пытаетесьделать с факторизацией.TfidfVectorizer автоматически выполняет токенизацию для любой предоставленной вами строки текста.Все столбцы, которые вы выбрали в исходном коде, содержат только строки, поэтому имеет смысл объединить их и позволить tfidf выполнить токенизацию, а не пытаться сделать это самостоятельно.

2) Используйте Конвейер конструктор, он спасет вашу жизнь.

3) X = df.loc[:, ['type_id', 'name_id', 'memo_id']] Этот тип соединения выглядит очень плохо, просто позвоните df[['column_name_1','column_name_2','column_name_3']]

4) И помните PEP20, "Простойлучше, чем сложный "!

В качестве последнего совета, при разработке модели ML всегда лучше начать с чего-то простого и простого, а затем развиваться дальше, когда у вас есть что-то, что работает.

...