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

Методы уменьшения размерности

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

Анализ основных компонентов (PCA)

PCA — это линейный подход к уменьшению размерности. Он просто включает в себя взятие исходных данных и их творческое линейное объединение, что может помочь выделить менее очевидные закономерности в данных. Подход ядра PCA был создан для решения проблемы нелинейности данных. Версия ядра позволяет работать с более сложными шаблонами данных, которые не были бы очевидны при одних только линейных преобразованиях, хотя она, несомненно, более сложна, чем старый добрый PCA.

Ядро PCA (KPCA)

Чтобы помочь в категоризации данных, границы решений которых представлены нелинейной функцией, был создан PCA ядра. Цель состоит в том, чтобы перейти в пространство с большей размерностью, где граница решения является линейной. Поэтому такой подход к ДР более эффективен в случаях, когда граница задачи нелинейна.

t-распределенное стохастическое встраивание соседей (t-SNE)

Отображение многомерных наборов данных особенно хорошо подходит для подхода уменьшения размерности, известного как t-распределенное стохастическое встраивание соседей (t-SNE). Этот метод можно применять к большим наборам данных реального мира, поскольку для его реализации можно использовать приближения Барнса-Хата. У этого есть ограничение: он не очень хорошо работает с наборами данных с несколькими тысячами экземпляров.

Разложение по сингулярным значениям (SVD)

Разложение по сингулярным числам помогает сократить наборы данных со многими значениями. Кроме того, этот подход помогает получить содержательные ответы для меньшего количества значений. Тем не менее, эти меньшие числа представляют собой значительную часть огромного разнообразия исходных данных. Данные геофизических и атмосферных наук показывают значительные пространственные отношения. Более сжатая иллюстрация этих ассоциаций поддерживается и дает результаты исследования декомпозиции единичных значений. Вы можете получить представление о временных и географических изменениях, используя многомерные наборы данных. После обработки отображаются данные по этим отклонениям.

Линейный дискриминантный анализ (LDA)

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

Метод

Проект взял 8 наборов данных классификации и 8 наборов данных регрессии из репозитория машинного обучения UCI. PCA, Kernel PCA, t-SNE, SVD и LDA использовались для задач классификации. PCA, Kernel PCA, t-SNE и SVD использовались для задач регрессии.

PCA применялся с доверительным интервалом 90%, что позволяло библиотеке PCA автоматически находить оптимальное количество компонентов для каждого случая.

Затем оптимальное количество компонентов, найденных с помощью PCA, также использовалось для Kernel PCA и SVD.

Код Python

Следующий код можно использовать для импорта набора данных в блокнот Jupyter:

# Importing dataset
data1 = pd.read_csv(r"C:\\Shill Bidding Dataset.csv")

Далее данные определяются и разделяются для обучения и тестирования.

#Defining X and Y and Splitting data to test and train sets

X = data1.drop(['Record_ID','Auction_ID','Bidder_ID','Class'], axis=1)
y = data1['Class']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
X_train.shape, X_test.shape, y_train.shape, y_test.shape

Набор данных следует масштабировать перед применением подходов уменьшения размерности.

# Scaling the data using standard scaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
X_train.shape, X_test.shape

После завершения масштабирования для применения PCA, Kernel PCA, t-SNE, SVD и LDA используются следующие коды.

# PCA with 90% variance benchmark
pca = PCA(n_components=0.9)
X_train_pca = pca.fit_transform(X_train)
X_test_pca = pca.transform(X_test)
X_train_pca
# Kernel PCA
kpca = KernelPCA(n_components=6,kernel='rbf', gamma=15, random_state=42)
X_train_kpca = kpca.fit_transform(X_train)
X_test_kpca = kpca.transform(X_test)
X_train_kpca
# t_SNE
tsne = TSNE()
X_train_tsne = tsne.fit_transform(X_train_pca)
X_test_tsne = tsne.fit_transform(X_test_pca)
X_train_tsne
# SVD
svd = TruncatedSVD(n_components=6, algorithm='randomized')
X_train_svd = svd.fit_transform(X_train)
X_test_svd = svd.fit_transform(X_test)
X_train_svd
# LDA

lda = LDA()
X_train_lda = lda.fit_transform(X_train, y_train)
X_test_lda = lda.transform(X_test)
X_train_lda

Следующий код применяется для классификации моделей машинного обучения:

# Classification ML Pipeline

def train_test_cl(X_train, y_train, X_test, y_test):
    temp_df = pd.DataFrame(columns=['Dimensions', 'Model', 'Accuracy', 'F1 Score', 'Recall', 'Precision', 'Time Taken'])
    for i in [LogisticRegression, SVC, KNeighborsClassifier, DecisionTreeClassifier, RandomForestClassifier, GradientBoostingClassifier]:
        start_time = time.time()
        reg = i().fit(X_train, y_train)
        y_pred = reg.predict(X_test)
        accuracy = np.round(accuracy_score(y_test, y_pred), 2)
        f1 = np.round(f1_score(y_test, y_pred, average='weighted'), 2)
        recall = np.round(recall_score(y_test, y_pred, average='weighted'), 2)
        precision = np.round(precision_score(y_test, y_pred, average='weighted'), 2)
        end_time = time.time()
        time_taken = np.round((end_time - start_time), 2)
        temp_df.loc[len(temp_df)] = [X_train.shape[1], str(i).split('.')[-1][:-2], accuracy, f1, recall, precision, time_taken]
    return temp_df

Для регрессии используется следующий код:

#Regression ML Pipeline

def train_test_rg(X_train, y_train, X_test, y_test):
    temp_df = pd.DataFrame(columns=['Dimensions', 'Model', 'R2 Score', 'RMSE', 'Time Taken'])
    for i in [LinearRegression, KNeighborsRegressor, SVR, DecisionTreeRegressor, RandomForestRegressor, GradientBoostingRegressor]:
        start_time = time.time()
        reg = i().fit(X_train, y_train)
        y_pred = reg.predict(X_test)
        r2 = np.round(r2_score(y_test, y_pred), 2)
        rmse = np.round(np.sqrt(mean_squared_error(y_test, y_pred)), 2)
        end_time = time.time()
        time_taken = np.round((end_time - start_time), 2)
        temp_df.loc[len(temp_df)] = [X_train.shape[1], str(i).split('.')[-1][:-2], r2, rmse, time_taken]
    return temp_df

Результаты получены для каждого из подходов DR с использованием следующего:

#PCA
results2 = train_test_cl(X_train_pca, y_train, X_test_pca, y_test)
results2

#Kernel PCA
results3 = train_test_cl(X_train_kpca, y_train, X_test_kpca, y_test)
results3

#t-SNE
results4 = train_test_cl(X_train_tsne, y_train, X_test_tsne, y_test)
results4

#SVD
results5 = train_test_cl(X_train_svd, y_train, X_test_svd, y_test)
results5

#LDA results
results6 = train_test_cl(X_train_lda, y_train, X_test_lda, y_test)
results6

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

Анализ

Классификация

Что касается задач классификации, было отмечено, что LDA работает лучше всего и достаточно быстро, чтобы уменьшить размеры. После этого PCA также был очень эффективным алгоритмом уменьшения размерности, который использовался в этом проекте. В целом было отмечено, что подходы к уменьшению размерности в задаче классификации упрощают понимание данных за счет уменьшения количества измерений. Кроме того, они ускорили процесс машинного обучения, поскольку обучение стало более эффективным. Однако производительность ядер PCA и t-SNE была неудовлетворительной, так как они требовали больше времени, а также давали низкие результаты точности. Одной из основных причин этого может быть то, что ядро ​​PCA и t-SNE требуют большого набора данных с большим количеством измерений для получения более точных результатов. LDA — наш лучший подход к классификации.

Регрессия

Было отмечено, что для задач регрессии производительность PCA была более эффективной и точной. С другой стороны, остальные подходы показали, что в среднем есть две отрицательные оценки. так как мы работали лучше, и некоторые проблемы, когда данные были очень сложными. Поэтому было отмечено, что SVD неэффективен для использования в более простых наборах данных. Ядро PCA не показало хороших результатов в этой области, потому что ядро ​​PCA более эффективно для задач классификации. Точно так же t-SNE также требует более сложных и больших наборов данных для получения эффективных результатов. Поэтому, основываясь на анализе наборов данных регрессии, наша модель-победитель — PCA.

Нижняя граница

На основании этого сравнительного анализа можно утверждать, что PCA лучше всего подходит для регрессии, а LDA — для классификации.