Кластеризация данных с использованием группировки
Есть DataFrame, который содержит в себе такие данные:
df_scale = pd.DataFrame({"название_книги_код": [1, 1, 1, 2, 2, 3, 3, 3, 3, 4],
"век_описание": [-0.051467, -0.051467,-0.051467, -0.048411, -0.048411,
-0.173312, -0.173312, -0.173312, -0.173312, -0.040507],
"век_название_главы": [-0.084965, -0.087059, -0.088990, -0.089571, -0.089679,
-0.083948, -0.081229, -0.100679, -0.090792, 0.086691],
"значение_главы": [15, 35, 50, 50, 50, 25, 25, 25, 25, 19],
"век_навыки_текст": [-0.021923, -0.076697, -0.051627, -0.023046, -0.026204, 0.003370,
-0.103621, -0.002899, -0.115548, 0.026655]})
Необходимо кластеризировать данные так, чтобы на каждое название_книги_код приходился один кластер. Известно, что есть 5 кластеров. Текстовые данные я уже представил в числовом формате.
Я воспользовался простым методом KMeans:
tfidf = TfidfVectorizer()
tfidf.fit(df.название_книги)
text = tfidf.transform(df.навыки_текст)
kmeans = KMeans(n_clusters=5, random_state=100).fit_predict(text)
но на предсказании выводится следующее:
in[]: kmeans
out[]: array([1, 3, 3, 1, 1, 2, 5, 5, 4, 4])
Получается так, что выводом являются кластеры, которые разнятся для название_книги_код.
Вывод должен быть, например, такой:
in[]: kmeans
out[]: array([4, 4, 4, 1, 1, 5, 5, 5, 5, 4])
Ответы (1 шт):
На первом занятии по кластеризации вам должны были рассказать, что есть данные номинальные, а есть данные числовые. Даже если вы зашифровали свои номинальные данные числами, от того они числовыми не стали. Если вы названия книг превратили в код - это все равно не число. Его нельзя складывать, умножать, делить. Все что с ним можно делать - это сравнивать "равно-не равно".
Метод kMeans - даже из названия это видно - строит кластеры исходя из средних значений попавших в него элементов. А что значит "среднее значение названий книг"? Бред. Про остальные ваши параметры - похоже примерно то-же самое, хотя я не понимаю, что реально представляют ваши числа.
Итак, если на вход метода, по своей сути предназначенного для работы с числовыми данными подать данные номинальные, алгоритм честно отработает и честно на выходе выдаст бредовый результат.
Нельзя решать задачу методами, по определению не предназначенными для работы с такими данными.