Вы изучили кластеризацию K-средств, и теперь вы хотите применить ее в реальных приложениях?
Применяете алгоритм кластеризации, но не удовлетворены результатами?
Начните с самого простого набора данных, который вы когда-либо видели, и узнайте, как масштабирование влияет на кластеризацию и как небольшое изменение данных приводит к совершенно другим кластерам!

Предпосылки

  1. Вы должны знать, что такое кластеризация.
  2. Вы должны знать алгоритм KMeans.
  3. Основы Python

Давайте перейдем к кодированию

Шаг 1. Импортируйте необходимые библиотеки

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

Шаг 2. Прочтите набор данных

movies = pd.read_csv('movies.csv')

Шаг 3. Изучите набор данных

# View the first five rows of the dataset
movies.head()
# If you want to view first n rows of the dataset:
# movies.head(n=number)

#View summary of the data
movies.info()

Мы видим, что всего имеется 10 строк и 6 функций (столбцов).
Две функции относятся к целочисленному типу, а четыре из них относятся к объектному типу .
Мы видим, что он показывает 10 ненулевых значений, что означает, что всего 10 ненулевых записей и всего 10 строк, подразумевающих, что в данных нет нулевых значений.

Мы можем удалить функцию «Идентификатор», поскольку она не предоставляет нам никакой соответствующей информации.

del movies['Id']

Давайте посмотрим на полные данные, так как их всего 10 строк.

#View the complete data
display(movies)

Это небольшой набор данных, и мы видим, что существует много фильмов с одними и теми же актерами или режиссерами, но мы можем использовать groupby, чтобы узнать больше о данных.

#Grouping the movies by actors and displaying them
actors = movies.groupby('Actor')
for actor,rows in actors:
    display(actor,rows)

Мы видим, что всего четыре актера: Кристиан Бэйл, Хью Джекман, Хоакин Феникс и Том Круз.
У Кристиана Бэйла наибольшее количество фильмов в наборе данных, т.е. 5, у Хоакина Феникса и Тома Круза по два фильма, а у Хью Джекмана есть один фильм.

Давайте теперь сгруппируем по директору

#Grouping the movies by directors and displaying them
directors = movies.groupby('Director')
for director,rows in directors:
    display(director,rows)

Всего шесть режиссеров, Кристофер Нолан и Дэвид О Рассел работали только с Кристианом Бейлом, тогда как Джеймс Мангольд работал с двумя актерами, Хью Джекманом и Томом Крузом.

Давайте теперь сгруппируем по жанрам

#Grouping the movies by genre and displaying them
genres = movies.groupby('Genre')
for genre,rows in genres:
    display(genre,rows)

Есть 3 уникальных жанра. Только Том Круз снимался в боевиках, Кристиан Бэйл и Хоакин Феникс снимались как в комиксах, так и в драмах.

Шаг 4: предварительная обработка

Перед моделированием мы должны преобразовать данные в числовой формат, поскольку KMeans не работает с категориальной переменной.
Следовательно, мы должны создать фиктивные переменные для Актера, Режиссера и Жанра.
Мы не создаем фиктивные переменные для имя фильма, как и id, также является идентификатором и не используется при кластеризации, поэтому мы его тоже удаляем.

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

#Creating dummy variables
actor_dummy = pd.get_dummies(movies['Actor'])
director_dummy = pd.get_dummies(movies['Director'])
genre_dummy = pd.get_dummies(movies['Genre'])
#Concatenating the dummy variables to the original dataset movie_dummy_set=pd.concat([movies,actor_dummy,
director_dummy,genre_dummy],axis=1)
#Deleting categorical variable from the dummy set
del movie_dummy_set['MovName']
del movie_dummy_set['Actor']
del movie_dummy_set['Director']
del movie_dummy_set['Genre'].

Шаг 5: моделирование

Начнем с импорта библиотеки, необходимой для моделирования.

#Importing KMeans
from sklearn.cluster import KMeans

Пусть k равно 2, т.е. нам нужно два кластера для данных.

#Modeling
kmeans = KMeans(2)
kfit = kmeans.fit(movie_dummy_set)
identified_clusters = kfit.predict(movie_dummy_set)

Мы сохранили идентифицированные кластеры в новой переменной и добавим ее в исходный набор данных.

#Appending the identified clusters to the original data
clustered_data = movies.copy()
clustered_data['Cluster'] = identified_clusters
#Viewing the data with clusters
display(clustered_data.sort_values(by='Cluster'))

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

Что ж, если вы разобрались отлично !, давайте продолжим и построим кластеры

#Plotting the graph
plt.xlabel('Year')
plt.ylabel('Cluster')
plt.scatter(clustered_data['Year'],clustered_data['Cluster'],c=clustered_data['Cluster'])

Мы видим, что кластеры основаны на Годе. Кластер 0 содержит фильмы, выпущенные до 2012 года, а кластер 1 - фильмы, выпущенные после 2012 года.

Но почему он был основан на году, а не на других характеристиках: актер, режиссер и жанр.
Мы что-то забыли? Думаю, да, мы забыли масштабировать данные.

Помните, что все данные числовые, а данные в Year очень большие по величине. Он находится в диапазоне 2000-х годов, тогда как данные в других функциях либо 0, либо 1, поскольку они фиктивные.

Это может быть причиной того, что кластеризация была основана на Годе, поскольку значения в Годе значительно больше и, следовательно, максимизируют его значение.

Давайте масштабируем данные, а затем применим KMeans.

#Importing the library
from sklearn import preprocessing
#Passing the values of the dataset to Min-Max-Scaler
movies_values = movie_dummy_set.values
min_max_scaler = preprocessing.MinMaxScaler()
x_scaled = min_max_scaler.fit_transform(movies_values)
movies_scaled = pd.DataFrame(x_scaled,
columns=movie_dummy_set.columns)

Мы масштабировали данные и сохранили в переменной "movies_scaled". Давайте применим KMeans с k = 2 и посмотрим, получим ли мы разные результаты или одинаковые.

#Modeling
kmeans = KMeans(2)
kfit = kmeans.fit(movies_scaled)
identified_clusters_scaled = kfit.predict(movies_scaled)
#Appending the identified clusters to the dataframe
clustered_data_scaled = movies.copy()
clustered_data_scaled['Cluster'] = identified_clusters_scaled
display(clustered_data_scaled.sort_values(by='Cluster'))

Результаты удивительны, не так ли! Кластеры теперь основаны на Актере, Кластер 0 содержит фильмы, в которых снимался Кристиан Бэйл, тогда как Кластер 1 содержит все другие фильмы.

Давайте посмотрим, что произойдет, если количество кластеров равно 3, то есть k = 3.

Опять же, кластеры основаны на актере, кластер 0 содержит фильмы с Томом Крузом в главной роли, кластер 1 содержит фильмы с Кристианом Бейлом в главной роли, а кластер 2 содержит другие фильмы.

Давайте посмотрим, что произойдет, если количество кластеров равно 4, то есть k = 4.

Кластеры теперь основаны на двух характеристиках: актере и режиссере.
Кластер 0 содержит Тома Круза в главных ролях фильмов. Кластер 1 содержит фильмы Кристиана Бэйла с участием фильмов режиссера Дэвида О Рассела. Кластер 3 содержит Хоакина Феникса и Хью Джекмана в главных ролях, а кластер 4 также содержит фильмы Кристиана Бэйла, но режиссер Кристофер Нолан.

Шаг 6: Заключение

Мы видели, как масштабирование повлияло на кластеризацию. До масштабирования два кластера основывались на году, но после масштабирования кластеры основывались на актере.
Мы также видели, как изменение количества кластеров меняет группировку данных, и все зависит от специалиста по данным, который определит число. кластеров.

У вас может возникнуть несколько вопросов, например, какое количество кластеров подходит или как определить значение «k». Один из подходов к определению значения «k» - это метод локтя.

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

Рассмотрим пример и посмотрим, как кластеризация зависит от данных.

Я сделал всего одно изменение в наборе данных, я изменил Год начала Бэтмена с 2005 на 2014 (да, это неверно, но результат удивительный!)

Мы видим, что теперь кластеризация основана на жанре !, простое изменение одного значения в наборе данных приводит к значительному изменению кластеров.

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

Попробуйте разное количество кластеров и разные алгоритмы и посмотрите, как они меняются, как формируются кластеры.

Ссылка на репозиторий: https://github.com/njain9104/Movies-Clustering

Последний шаг: конец