ValueError: формы (831,18) и (1629,2) не выровнены: 18 (dim 1)! = 1629 (dim 0) - PullRequest
0 голосов
/ 28 октября 2018

Итак, я пытался классифицировать популярность песни, основываясь на ее текстах и ​​других параметрах, таких как темп и т. Д. Теперь вот фрагмент кода, который я пытаюсь запустить через tkinter.

import pandas as pd
from sklearn_pandas import DataFrameMapper
from sklearn.feature_extraction.text import TfidfTransformer, TfidfVectorizer,CountVectorizer

df = pd.read_csv(r'Dataset(Advanced)(processed lyrics).csv') 

df['Lyrics'] = df['Lyrics'].astype(str)   

mapper = DataFrameMapper([('Lyrics', CountVectorizer()),
  ('Tempo', None),
  ('Energy', None),
   ('Loudness', None),
  ('Danceability', None),
  ('Speechiness', None),
  ('Acousticness', None),
 ('Artist Hit', None)
 ])

features = mapper.fit_transform(df[['Lyrics', 'Tempo', 'Energy', 'Loudness', 'Danceability', 'Speechiness'
                                , 'Acousticness', 'Artist Hit']])
y = df['Hit']

from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB()

model.fit(features, y)

Теперь эту функцию я вызываю, когда нажимаю на кнопку. Здесь я беру все значения, такие как текст песни, темп и т. Д. Для песни, и преобразую ее в атрибут dataframe, чтобы он поместился в DataFrameMapper. Хотя все это выглядит хорошо,

def predict():
user_Lyrics = lyricsTextBox2.get(1.0, "end-1c")
user_Lyrics = user_Lyrics.values.astype(str)
print(user_Lyrics.head())
print(type(user_Lyrics))

# Everything in lowercase
user_Lyrics = user_Lyrics.apply(lambda x: " ".join(x.lower() for x in str(x).split()))

# Removing punctuation that does not add meaning to the song
user_Lyrics = user_Lyrics.str.replace('[^\w\s]', '')

# Removing of stop words
from nltk.corpus import stopwords

stop = stopwords.words('english')
user_Lyrics = user_Lyrics.apply(lambda x: " ".join(x for x in str(x).split() if x not in stop))

# Correction of Spelling mistakes
from textblob import TextBlob
user_Lyrics = user_Lyrics.apply(lambda x: str(TextBlob(x).correct()))

# Lemmatization is basically converting a word into its root word. It is preferred over Stemming.
from textblob import Word
user_Lyrics = user_Lyrics.apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()]))



df['AP'] = float(ArtistPopularityEntry.get())
df['SE'] = float(EnergyEntry.get())
df['SL'] = float(LoudnessEntry.get())
df['SA'] = float(AcousticnessEntry.get())
df['ST'] = float(TempoEntry.get())
df['SD'] = float(DanceabilityEntry.get())
df['SS'] = float(SpeechinessEntry.get())

mapper2 = DataFrameMapper([
    ('Lyrics_User', CountVectorizer()),
    ('ST', None),
    ('SE', None),
    ('SL', None),
    ('SD', None),
    ('SS', None),
    ('SA', None),
    ('AP', None)
])
features2 = mapper2.fit_transform(df[['Lyrics_User', 'ST', 'SE', 'SL', 'SD', 'SS', 'SA', 'AP']])

print(type(features2))
print(len(features2))
print(features2.shape)

print(type(features))
print(len(features))
print(features.shape)

user_prediction = model.predict(features2)
print(user_prediction)
if (user_prediction[0] == 1):
    resultLabel2.config(text='Song is Hit')
else:
    resultLabel2.config(text='Song is not Hit')

Выход:

<class 'numpy.ndarray'>
831
(831, 18)
<class 'numpy.ndarray'>
831
(831, 1629)

Error: 

Exception in Tkinter callback Traceback (most recent call last):   File "C:\Users\moksh\Anaconda3\lib\tkinter\__init__.py", line 1702, in
    __call__
        return self.func(*args)   File "<ipython-input-4-f6ddab248363>", 
line 69, in predict
        user_prediction = model.predict(features2)   File 
"C:\Users\moksh\Anaconda3\lib\site-packages\sklearn\naive_bayes.py", line 
66, in predict
        jll = self._joint_log_likelihood(X)   File 
"C:\Users\moksh\Anaconda3\lib\site-packages\sklearn\naive_bayes.py", line 
725, in _joint_log_likelihood
        return (safe_sparse_dot(X, self.feature_log_prob_.T) +   File 
"C:\Users\moksh\Anaconda3\lib\site-packages\sklearn\utils\extmath.py", 
line 140, in safe_sparse_dot
        return np.dot(a, b) ValueError: shapes (831,18) and (1629,2) not 
aligned: 18 (dim 1) != 1629 (dim 0)

EDIT

 df['AP'] = float(ArtistPopularityEntry.get())
 df['SE'] = float(EnergyEntry.get())
 df['ST'] = float(TempoEntry.get())


 features2 = mapper.transform(df[['Lyrics_User', 'ST', 'SE', 'AP']])

Это дает еще одну ошибку:

Исключение в обратном вызове Tkinter (последний последний вызов):
файл "C: \ Users \ moksh \ Anaconda3 \ Lib \ сайта-пакеты \ панды \ ядро ​​\ индексы \ base.py", строка 3063, в get_loc вернуть файл self._engine.get_loc (key) файл "pandas_libs \ index.pyx", строка 140, в файле pandas._libs.index.IndexEngine.get_loc "pandas_libs \ index.pyx", строка 162, в Файл pandas._libs.index.IndexEngine.get_loc "pandas_libs \ hashtable_class_helper.pxi", строка 1492, в Файл pandas._libs.hashtable.PyObjectHashTable.get_item "pandas_libs \ hashtable_class_helper.pxi", строка 1500, в pandas._libs.hashtable.PyObjectHashTable.get_item KeyError: 'Lyrics'

Во время обработки вышеуказанного исключения произошло другое исключение:

Traceback (последний вызов был последним): File "C: \ Users \ moksh \ Anaconda3 \ lib \ tkinter__init __. Py", строка 1702, в вызов return self.func (* args) Файл "", строка 53, в прогнозе features2 = mapper.transform (файл df [['Lyrics_User', 'ST', 'SE', 'AP']]) "C: \ Users \ moksh \ Anaconda3 \ Lib \ сайта-пакеты \ sklearn_pandas \ dataframe_mapper.py", строка 289, в преобразовании Xt = self._get_col_subset (X, столбцы, input_df) Файл "C: \ Users \ moksh \ Anaconda3 \ lib \ site-packages \ sklearn_pandas \ dataframe_mapper.py", строка 182, в _get_col_subset t = X [cols [0]] Файл "C: \ Users \ moksh \ Anaconda3 \ lib \ site-packages \ pandas \ core \ frame.py", строка 2685, в getitem вернуть self._getitem_column (key) файл "C: \ Users \ moksh \ Anaconda3 \ lib \ site-packages \ pandas \ core \ frame.py", строка 2692, в _getitem_column вернуть self._get_item_cache (ключ) Файл "C: \ Users \ moksh \ Anaconda3 \ lib \ site-packages \ pandas \ core \ generic.py", строка 2486, в _get_item_cache values ​​= self._data.get (item) Файл "C: \ Users \ moksh \ Anaconda3 \ lib \ site-packages \ pandas \ core \ internals.py", линия 4115, в get loc = self.items.get_loc (item) Файл "C: \ Users \ moksh \ Anaconda3 \ lib \ site-packages \ pandas \ core \ indexes \ base.py", строка 3065, в get_loc вернуть self._engine.get_loc (self._maybe_cast_indexer (key)) файл "pandas_libs \ index.pyx", строка 140, в Файл pandas._libs.index.IndexEngine.get_loc "pandas_libs \ index.pyx", строка 162, в Файл pandas._libs.index.IndexEngine.get_loc "pandas_libs \ hashtable_class_helper.pxi", строка 1492, в Файл pandas._libs.hashtable.PyObjectHashTable.get_item "pandas_libs \ hashtable_class_helper.pxi", строка 1500, в pandas._libs.hashtable.PyObjectHashTable.get_item KeyError: 'Lyrics'

1 Ответ

0 голосов
/ 29 октября 2018

Вы подходите к двум различным CountVectorizer объектам (один для обучения и другой для предсказания), который изучает два разных набора словарного запаса.

Во время обучения, поскольку данные большие и состоят из нескольких выборок, создается словарь из 1629 слов.Но во время прогнозирования, поскольку вы используете его только для прогнозирования одной выборки, словарь составляет 18.

Это источник ошибки.

Теперь скажите мне, почему вы используете один и тот же объект model вместо нового при прогнозировании?Это потому, что новый model ничему не научится.Таким же образом, оригинальный объект CountVectorizer внутри mapper узнал кое-что о ваших данных, которые необходимо использовать при прогнозировании.

Вместо объявления нового объекта mapper2 и вызова fit_transform() (который узнает о данных, переданных ему с нуля), вам нужно использовать старый mapper (который уже установлен),и вызовите transform () для него.

Вместо:

mapper2 = DataFrameMapper([
    ('Lyrics_User', CountVectorizer()),
    ('ST', None),
    ('SE', None),
    ('SL', None),
    ('SD', None),
    ('SS', None),
    ('SA', None),
    ('AP', None)
])
features2 = mapper2.fit_transform(df[['Lyrics_User', 'ST', 'SE', 'SL', 'SD', 'SS', 'SA', 'AP']])

Сделайте это:

features2 = mapper.transform(df[['Lyrics', 'ST', 'SE', 'SL', 'SD', 'SS', 'SA', 'AP']])
...