Nano Hash - криптовалюты, майнинг, программирование

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

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

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

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

Помощь будет очень признательна, я был на этом в течение длительного времени :)

import sqlalchemy
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score
from sklearn import metrics
from sklearn.metrics import accuracy_score
from sklearn import metrics
import pickle

### Connect to MYSQL database
##
#
dbServerName = "localhost"
dbUser = "root"
dbPassword = "woodycool123"
dbName = "azure_support_tweets"

engine = sqlalchemy.create_engine('mysql+pymysql://root:woodycool123@localhost:3306/azure_support_tweets')
pd.set_option('display.max_colwidth', -1)
df = pd.read_sql_table("preprocessed_tweets", engine)
data = pd.DataFrame(df)

### Training and Test Data Split
##
#
features_train, features_test, labels_train, labels_test = train_test_split(data['text_tweet'], data['main_category'], random_state = 42, test_size=0.34)

### CountVectorizer
##
#
cv = CountVectorizer(ngram_range=(1,2), stop_words='english', min_df=3, max_df=0.50)
features_train_cv = cv.fit_transform(features_train)
# Uncomment to print a matrix count of tokens
# print(features_train_cv.toarray())
print("Feature Count\nCountVectorizer() #", len(cv.get_feature_names()))


### TF-IDF Transformer
##
#
tfidfv = TfidfTransformer(use_idf=True)
features_train_tfidfv = tfidfv.fit_transform(features_train_cv)
print("Feature Set\nTfidfVectorizer() #", features_train_tfidfv.shape)
# Remove to print the top 10 features
# features = tfidfv.get_feature_names()
# feature_order = np.argsort(tfidfv.idf_)[::-1]
# top_n = 10
# top_n_features = [features[i] for i in feature_order[:top_n]]
# print(top_n_features)


### SelectKBest
##
#
selector = SelectKBest(chi2, k=1000).fit_transform(features_train_tfidfv, labels_train)
print("Feature Set\nSelectKBest() and chi2 #", selector.shape)

### Train Model
##
#
clf = MultinomialNB()
clf.fit(selector, labels_train)


### Test Model
##
#
features_test_cv = cv.transform(features_test)
features_test_cv_two = tfidfv.transform(features_test_cv)
pred = clf.predict(features_test_cv)

Ошибка:

Traceback (most recent call last):
  File "/Users/bethwalsh/Documents/classifier-twitter/building_the_classifer/feature_generation_selection.py", line 76, in <module>
    pred = clf.predict(features_test_cv)
  File "/Users/bethwalsh/anaconda3/lib/python3.6/site-packages/sklearn/naive_bayes.py", line 66, in predict
    jll = self._joint_log_likelihood(X)
  File "/Users/bethwalsh/anaconda3/lib/python3.6/site-packages/sklearn/naive_bayes.py", line 725, in _joint_log_likelihood
    return (safe_sparse_dot(X, self.feature_log_prob_.T) +
  File "/Users/bethwalsh/anaconda3/lib/python3.6/site-packages/sklearn/utils/extmath.py", line 135, in safe_sparse_dot
    ret = a * b
  File "/Users/bethwalsh/anaconda3/lib/python3.6/site-packages/scipy/sparse/base.py", line 515, in __mul__
    raise ValueError('dimension mismatch')
ValueError: dimension mismatch

Ответы:


1

Тестовый набор тоже нужно пройти через селектор, но сначала нужно сделать подгонку

selector = SelectKBest(chi2, k=1000)
selector.fit(features_train_tfidfv, labels_train)

clf = MultinomialNB()
clf.fit(selector.transform(features_train_tfidfv), labels_train)

features_test_cv = selector.transform(tfidfv.transform(cv.transform(features_test)))
pred = clf.predict(features_test_cv)    

Он выдает эту ошибку, потому что селектор уменьшает размер обучающего набора, но не тестового набора.

06.12.2018

2

Похоже, вы забыли использовать уменьшение размерности, также известное как SelectKBest, в части тестовой модели. Я не знаю, правильно ли использовать SelectKBest таким образом, если вы будете преобразовывать тестовые данные. Но в любом случае, наивная байесовская модель

clf = MultinomialNB()
clf.fit(selector, labels_train)

ожидание чего-то в форме selector, то есть с k = 1000 в вашем примере. В тестовой части модели

features_test_cv = cv.transform(features_test)
features_test_cv_two = tfidfv.transform(features_test_cv)
pred = clf.predict(features_test_cv)

вы пропустили это преобразование, поэтому clf.predict принимает матрицу другой формы. Попробуйте использовать SelectKBest.transform, чтобы получить желаемый результат:

selector_model = SelectKBest(chi2, k=1000). # create an object, use it later
selector = selector_model.fit_transform(features_train_tfidfv, labels_train)
print("Feature Set\nSelectKBest() and chi2 #", selector.shape)

clf = MultinomialNB()
clf.fit(selector, labels_train)

features_test_cv = cv.transform(features_test)
features_test_cv_two = tfidfv.transform(features_test_cv)
selector_test = selector_model.transform(features_test_cv_two)
pred = clf.predict(selector_test)
06.12.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..