Предыстория: Предположим, вы находитесь в своем классе, и ваш учитель приходит и говорит, что вы все должны объединиться в группы по четыре или пять человек для предстоящей презентации, чтобы сделать то, что вы делаете здесь? Как вы продолжаете формировать группы между собой? Есть ли здесь предопределенные критерии для создания группы? Машинное обучение бывает трех типов в зависимости от типа доступных данных: если есть помеченные данные, мы используем то, что мы назвали обучением с учителем, если нет помеченных данных, то оно называется обучением без учителя, и если машина учится на основе окружающая среда на нем называется обучением с подкреплением. До сих пор у нас был набор данных, в котором был столбец целевой переменной, и у нашей машины была целевая переменная для прогнозирования на основе ее опыта, и когда целевая переменная отсутствует, мы пытаемся создать небольшой кластер данных и проверить, чтобы увидеть закономерности в данных. У нас есть разные неконтролируемые алгоритмы, и кластеризация K-средних является одним из алгоритмов.

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

Части: здесь нам нужны две вещи K — количество кластеров/групп, которые мы хотим создать. Это можно наблюдать на графиках сначала при выполнении EDA, а затем с помощью метода локтя для определения оптимального значения K, чтобы сумма квадратов расстояния или инерции была минимальной. Вторая часть — это мера расстояния, которая использовалась при измерении расстояния между центроидом и точками данных.

Типы: Типы основаны на расстояниях, которые используются для измерения центроида.

  1. Евклидово расстояние
  2. Манхэттен Расстояние
  3. Косинусные расстояния

План игры: Здесь у нас есть набор данных о клиентах торгового центра, предоставленный нашим клиентом, и нам нужно найти некоторые идеи из набора данных и передать их нашему клиенту, что, в свою очередь, принесет некоторую пользу бизнесу. Мы уже знакомы с EDA и Feature Engineering, поэтому мы будем делать некоторые из них здесь, чтобы получить представление, а также выясним, как работают модели машинного обучения, когда не задана целевая переменная.

Модели машинного обучения, в которых отсутствуют целевые переменные, называются моделями машинного обучения без учителя. Эти модели учатся, например, предположим, что у нас есть шарики разных цветов, смешанные в чашке, и нам дают это, и мы спрашиваем, как могут быть шарики каждого цвета, и что мы будем делать? мы будем классифицировать шарики по разным цветам один за другим, подсчитывать и сообщать результат, поэтому аналогичным образом в машинном обучении фундаментальный подход, когда ничего не задано (целевая переменная), мы классифицируем кортежи в разные группы на основе определенных нами критериев, критерием может быть среднее значение для некоторых функций или максимальное или минимальное значение для некоторых функций. Мы также можем использовать расстояние объектов от некоторого значения, и в зависимости от близости мы решаем, к какой группе он принадлежит. Это K-Means Clustering, K- указывает количество кластеров, которые необходимо создать, т. е. количество групп, которые у нас будут. Здесь, чтобы измерить эффективность количества кластеров для заданных параметров, у нас есть нечто, называемое инерцией, и оно используется для измерения расстояния каждой точки данных от центроида, а затем для получения суммы квадратов этого расстояния. Чем ниже инерция, тем лучше модель и точнее кластеры.

Код :

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

# The following is the game plan that will be followed 
# Performing EDA
# Visualising the Dataset
# KMeans
# Elbow Method
# Visualising the Clusters
  1. Получение размеров набора данных

2. Проверка размерности набора данных

df.shape

(200, 5)

3. Проверка различных типов данных переменных признаков

df.dtypes
CustomerID                 int64
Gender                    object
Age                        int64
Annual Income (k$)         int64
Spending Score (1-100)     int64
dtype: object

4. Проверка нулевых значений в заданных столбцах

df.isnull().sum()
CustomerID                0
Gender                    0
Age                       0
Annual Income (k$)        0
Spending Score (1-100)    0
dtype: int64

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

df.set_index('CustomerID',inplace=True)

6. Получение общего количества мужчин и женщин в данном наборе данных

df['Gender'].value_counts() 
Female    112
Male       88
Name: Gender, dtype: int64

7. Чтобы получить общее представление о наборе данных, числовые значения

df.describe()

8. Задавайте разные вопросы набору данных и получайте представление о нем как для мужчин, так и для женщин.

#Grouping Based on Gender List so that to the Age, Income and Spending Score Based on Gender Min, Max and average
df1 = df.groupby(['Gender'],sort=True)
GenderList = list(df['Gender'].unique())
GenderList
for i in GenderList:
    df2 = df1.get_group(i)
    print("\n")
    print("Average Income for ",i," is ",df2['Annual Income (k$)'].mean()," , Max is ",df2['Annual Income (k$)'].max(), " , Min is ",df2['Annual Income (k$)'].min())
    print("Average Spending Score for ",i," is ",df2['Spending Score (1-100)'].mean()," , Max is ",df2['Spending Score (1-100)'].max(), " , Min is ",df2['Spending Score (1-100)'].min())
    print("Average Age for ",i," is ",df2['Age'].mean()," , Max is ",df2['Age'].max(), " , Min is ",df2['Age'].min())

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

d = {'Male':[],'Female':[]}
d2 = {'Male':[],'Female':[]}
d3 = {'Male':[],'Female':[]}
for i in GenderList:
    df2 = df1.get_group(i)
    d[i] = df2['Spending Score (1-100)']
    d2[i] = df2['Age']
    d3[i] = df2['Annual Income (k$)']
#Scatter Plot for Age vs Spending Score
#The Points plotted seperately for Male and Female
plt.scatter(d2['Male'],d['Male'],label='Male',color='red')
plt.scatter(d2['Female'],d['Female'],label='Female',color= 'blue')
plt.title('Color Change')
plt.xlabel('Age')
plt.ylabel('Spending Score')
plt.legend()
plt.show()

10. График доходов и расходов

#Scatter Plot for Income vs Spending Score
#The Points plotted seperately for Male and Female
plt.scatter(d3['Male'],d['Male'],label='Male',color='red')
plt.scatter(d3['Female'],d['Female'],label='Female',color= 'blue')
plt.title('Color Change')
plt.xlabel('Income')
plt.ylabel('Spending Score')
plt.legend()
plt.show()

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

#Scatter Plot for Age vs Income 
#The Points plotted seperately for Male and Female
plt.scatter(d2['Male'],d3['Male'],label='Male',color='red')
plt.scatter(d2['Female'],d3['Female'],label='Female',color= 'blue')
plt.title('Color Change')
plt.xlabel('Age')
plt.ylabel('Income')
plt.legend()
plt.show()

Здесь нет видимых кластеров с использованием этих параметров.

12. Визуализация количества мужчин и женщин из набора данных

sns.countplot(x='Gender',data=df)

13. Вместо вышеописанного мы можем использовать sns.pairplot

#Pair Plot to find the Distinct Clusters 
sns.pairplot(df,hue='Gender')

Мы завершили EDA и теперь знаем два параметра, по которым есть пять кластеров.

Кластеризация K-средних для всех трех значений и поиск оптимального значения K с использованием метода локтя и инерции.

#KMeans for all the Three Parameters Age, Income, Spending Score
SSE = [] #This will be used to decide the value for Optimum number of clusters
K = range(1,15) #Checking k values from 1 to 15

#Using Elbow Method to Decide the value of K 
for num_clusters in K :
 kmeans = KMeans(n_clusters=num_clusters)
 kmeans.fit(df.drop('Gender',axis=1))
 SSE.append(kmeans.inertia_)

plt.plot(K,SSE,'bx-')
plt.xlabel('Values of K') 
plt.ylabel('Sum of squared distances/Inertia') 
plt.title('Elbow Method For Optimal k on all Parameters')
plt.show()

K-Means для оценки расходов по сравнению с доходом и поиск оптимального значения K

#KMeans for Spending Score and Income

SSE = []
K = range(1,15)

for num_clusters in K :
 kmeans = KMeans(n_clusters=num_clusters)
 kmeans.fit(df.drop(['Gender','Age'],axis=1))
 SSE.append(kmeans.inertia_)

plt.plot(K,SSE,'bx-')
plt.xlabel('Values of K') 
plt.ylabel('Sum of squared distances/Inertia') 
plt.title('Elbow Method For Optimal k for Spending Score and Income')
plt.show()

K-кластеризация средних значений по возрасту и показателю расходов и поиск оптимального значения K

#KMeans for Age and Spending Score
Sum_of_squared_distances = []
K = range(1,15)

for num_clusters in K :
 kmeans = KMeans(n_clusters=num_clusters)
 kmeans.fit(df.drop(['Gender','Annual Income (k$)'],axis=1))
 Sum_of_squared_distances.append(kmeans.inertia_)

plt.plot(K,Sum_of_squared_distances,'bx-')
plt.xlabel('Values of K') 
plt.ylabel('Sum of squared distances/Inertia') 
plt.title('Elbow Method For Optimal k for Age and Spending Score')
plt.show()

Кластеризация K-средних для возраста и дохода и поиск оптимального значения K

#KMeans for Age and Income
Sum_of_squared_distances = []
K = range(1,15)
for num_clusters in K :
 kmeans = KMeans(n_clusters=num_clusters)
 kmeans.fit(df.drop(['Gender','Spending Score (1-100)'],axis=1))
 Sum_of_squared_distances.append(kmeans.inertia_)
plt.plot(K,Sum_of_squared_distances,'bx-')
plt.xlabel('Values of K') 
plt.ylabel('Sum of squared distances/Inertia') 
plt.title('Elbow Method For Optimal k for Age and Income')
plt.show()

Некоторые идеи из приведенных выше графиков K-средних

# For KMeans on All the 3 Parameters Inertia > 50000 at K = 6
# For KMeans on Income and Spending Score Inertia > 50000 for K = 5
# For KMeans on Age and Spending Score Ineratia 25000 for K = 4
# For KMeans on Age and Income Ineratia > 25000 for K  = 4
# Making the model upon Spending Score vs Income
# From the Elbow Curve we are getting 5 Clusters

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

km = KMeans(n_clusters=5)
y = km.predict(df.drop(['Gender','Age'],axis=1)) #Predicting the Clusters
df['Predicted_Cluster'] = y #Appending it to the Datset

#Doing a scatter Plot for the Different Clusters

df1 = df[df['Predicted_Cluster']==0]
df2 = df[df['Predicted_Cluster']==1]
df3 = df[df['Predicted_Cluster']==2]
df4 = df[df['Predicted_Cluster']==3]
df5 = df[df['Predicted_Cluster']==4]

plt.scatter(df1['Spending Score (1-100)'],df1['Annual Income (k$)'],color='r',label='Cluster 1')
plt.scatter(df2['Spending Score (1-100)'],df2['Annual Income (k$)'],color='b',label='Cluster 2')
plt.scatter(df3['Spending Score (1-100)'],df3['Annual Income (k$)'],color='g',label='Cluster 3')
plt.scatter(df4['Spending Score (1-100)'],df4['Annual Income (k$)'],color='y',label='Cluster 4')
plt.scatter(df5['Spending Score (1-100)'],df5['Annual Income (k$)'],color='c',label='Cluster 5')


plt.xlabel('Spending Score (1-100)')
plt.ylabel('Annual Income (k$)')
plt.legend()
plt.show()

# Getting the Centroids 
cc = km.cluster_centers_
cc
array([[26.30434783, 20.91304348],
       [55.2962963 , 49.51851852],
       [88.2       , 17.11428571],
       [86.53846154, 82.12820513],
       [25.72727273, 79.36363636]]) 
df1 = df[df['Predicted_Cluster']==0]
df2 = df[df['Predicted_Cluster']==1]
df3 = df[df['Predicted_Cluster']==2]
df4 = df[df['Predicted_Cluster']==3]
df5 = df[df['Predicted_Cluster']==4]

plt.scatter(df1['Spending Score (1-100)'],df1['Annual Income (k$)'],color='r',label='Cluster 1')
plt.scatter(df2['Spending Score (1-100)'],df2['Annual Income (k$)'],color='b',label='Cluster 2')
plt.scatter(df3['Spending Score (1-100)'],df3['Annual Income (k$)'],color='g',label='Cluster 3')
plt.scatter(df4['Spending Score (1-100)'],df4['Annual Income (k$)'],color='y',label='Cluster 4')
plt.scatter(df5['Spending Score (1-100)'],df5['Annual Income (k$)'],color='c',label='Cluster 5')

#Appending the Centroid of Each of the clusters
plt.scatter(cc[:,0],cc[:,1],marker ='*',color='black')


plt.xlabel('Spending Score (1-100)')
plt.ylabel('Annual Income (k$)')
plt.legend()
plt.show()

На этом все. Далее мы узнаем о KNN, о том, как он используется и почему его не обучают.