С внедрением кода проекта…
Вступление
Размерность - это количество входных переменных или функций для набора данных, а уменьшение размерности - это процесс, посредством которого мы сокращаем количество входных переменных в наборе данных. Множество функций ввода делают прогнозное моделирование более сложной задачей.
При работе с данными большой размерности часто бывает полезно уменьшить размерность, проецируя данные в подпространство меньшей размерности, которое фиксирует «сущность» данных. Это называется уменьшением размерности.
~ Машинное обучение: вероятностная перспектива, 2012.
Существуют различные методы уменьшения размерности -
- Методы выбора функций
- Факторизация матрицы
- Методы автоэнкодера
- Многообразное обучение
«уменьшение размерности дает более компактное, более легко интерпретируемое представление целевой концепции, фокусируя внимание пользователя на наиболее релевантных переменных».
~ 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
Продолжайте учиться и писать код;)