С внедрением кода проекта…

Вступление

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

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

~ Машинное обучение: вероятностная перспектива, 2012.

Существуют различные методы уменьшения размерности -

  1. Методы выбора функций
  2. Факторизация матрицы
  3. Методы автоэнкодера
  4. Многообразное обучение

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

~ Data Mining: практические инструменты и методы машинного обучения

Автоэнкодер -

Автокодировщик - это разновидность неконтролируемой нейронной сети, которая используется для уменьшения размерности и обнаружения функций. Точнее, автокодировщик - это нейронная сеть с прямой связью, которая обучена предсказывать сами входные данные.

~ Машинное обучение: вероятностная перспектива

В этом проекте мы рассмотрим уменьшение размерности с помощью методов автоэнкодера.

Импорт библиотек

import matplotlib
import numpy as np
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
import matplotlib.pyplot as plt
plt.style.use('ggplot')
from sklearn.neural_network import MLPRegressor
from sklearn.decomposition import PCA
from sklearn.metrics import mean_squared_error, silhouette_score
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

cols = ['#1FC17B', '#78FECF', '#555B6E', '#CC998D', '#429EA6',
        '#153B50', '#8367C7', '#EE6352', '#C287E8', '#F0A6CA', 
        '#521945', '#361F27', '#828489', '#9AD2CB', '#EBD494', 
        '#53599A', '#80DED9', '#EF2D56', '#446DF6', '#AF929D']

Создание и предварительная обработка набора данных

X,y= make_blobs(n_features=50,centers = 20,n_samples=25000,
               cluster_std=0.2,center_box=[-1,1],random_state=17)

X_train, X_test, y_train,y_test = train_test_split(X,y,test_size=0.1,random_state = 17)
scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

Базовая модель - анализ основных компонентов

pca = PCA(n_components=2)
pca.fit(X_train)
res_pca = pca.transform(X_test)
unique_labels = np.unique(y_test)
for index,unique_label in enumerate(unique_labels):
    X_data = res_pca[y_test == unique_label]
    plt.scatter(X_data[:,0], X_data[:,1],alpha=0.3,c=cols[index])
    
plt.xlabel("PC 1")
plt.ylabel("PC 2")
plt.title("PCA Results")

Выход -

Обучение автоэнкодеру

autoencoder = MLPRegressor(alpha = 1e-15,hidden_layer_sizes=(50,100,50,2,50,100,50)
                          , random_state=1,max_iter=20000)
autoencoder.fit(X_train,X_train)

Выход -

MLPRegressor(activation='relu', alpha=1e-15, batch_size='auto', beta_1=0.9,beta_2=0.999, early_stopping=False, epsilon=1e-08,
hidden_layer_sizes=(50, 100, 50, 2, 50, 100, 50),learning_rate='constant', learning_rate_init=0.001, max_fun=15000,max_iter=20000, momentum=0.9, n_iter_no_change=10,
nesterovs_momentum=True, power_t=0.5, random_state=1, shuffle=True,
solver='adam', tol=0.0001, validation_fraction=0.1, verbose=False,
warm_start=False)

Одна из лучших статей, которые я прочитал - 11 методов уменьшения размерности, которые вы должны знать в 2021 году от Рукшана Прамодитхи

Уменьшение размерности с помощью автоэнкодера

L= autoencoder.coefs_
biases = autoencoder.intercepts_
for l in L:
    print(l.shape)

Выход -

(50, 50)
(50, 100)
(100, 50)
(50, 2)
(2, 50)
(50, 100)
(100, 50)
(50, 50)
encoder_weights = W[0:4]
encoder_biases = biases[0:4]
def encode(encoder_weights,encoder_biases,data):
    res_ae=data
    for index, (w,b) in enumerate(zip(encoder_weights,encoder_biases)):
        if index+1 == len(encoder_weights):
            res_ae = res_ae@w+b
        else: 
            res_ae = np.maximum(0,res_ae@w+b)
    return res_ae
res_ae = encode(encoder_weights,encoder_biases,X_test)
unique_labels =np.unique(y_test)
for index, unique_label in enumerate(unique_labels):
    latent_space = res_ae[y_test==unique_label]
    plt.scatter(latent_space[:,0], latent_space[:,1],alpha=0.3,c=cols[index])
    
plt.xlabel("Latent X")
plt.ylabel("Latent Y")
plt.title("Autoencoder Results")

Выход -

silhouette_score(X_test,y_test)

Выход -

0.6100948647899368
silhouette_score(res_pca,y_test)

Выход -

0.36785459047361985
silhouette_score(res_ae,y_test)

Выход -

0.8074659602056433

Продолжайте учиться и писать код;)

Хотите прочитать юмор программистов?









Рекомендуемые статьи -