Как найти минимальное число компонент (M) в PCA для дисперсии > 0.9 и получить координаты спроецированных данных?
Есть классический датасет MNIST (60000 train, 10000 test samples). Каждая запись — 784 пикселя + метка (0-9).
Мне нужно:
Отфильтровать данные, оставив только цифры 0 и 1.
Обучить PCA (svd_solver='full') на тренировочных данных и найти минимальное количество компонент M, при котором объясненная дисперсия строго больше 0.9.
Получить scores (координаты спроецированных данных) для train и test наборов, используя найденное M.
Обучить GradientBoostingClassifier с параметрами (n_estimators=500, learning_rate=0.8, random_state=23, max_depth=2) на этих новых данных и посчитать accuracy.
Конкретные вопросы, по которым нужна помощь или проверка:
Главный вопрос: Как корректно определить именно минимальное M, при котором дисперсия > 0.9? Нужно ли для этого смотреть на кумулятивную сумму explained_variance_ratio_ и найти индекс, где она превышает порог?
Правильно ли я понимаю, что после pca.fit_transform(train_data) координата первого изображения относительно первой главной компоненты — это просто первый элемент первого массива в матрице счетов?
Для финальной точности (accuracy) модели на тесте — это значение accuracy из classification_report, верно?
Код, который у меня уже есть (набросок):
from sklearn.decomposition import PCA
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report, confusion_matrix
# ... (загрузка и фильтрация данных, только 0 и 1)
# PCA для поиска M
pca = PCA(svd_solver='full')
pca.fit(X_train)
cumsum_variance = np.cumsum(pca.explained_variance_ratio_)
M = np.argmax(cumsum_variance > 0.9) + 1 # Это верный способ?
# Получение scores для M компонент
pca = PCA(n_components=M, svd_solver='full')
X_train_reduced = pca.fit_transform(X_train)
X_test_reduced = pca.transform(X_test)
# Координата 1-го изображения относительно 1й компоненты
first_image_first_component = X_train_reduced[0, 0]
# Обучение бустинга и оценка
model = GradientBoostingClassifier(n_estimators=500, learning_rate=0.8, random_state=23, max_depth=2)
model.fit(X_train_reduced, y_train)
y_pred = model.predict(X_test_reduced)
print(classification_report(y_test, y_pred))
# Accuracy для ввода - это значение метрики 'accuracy' из отчета, да?
Буду благодарен за подсказки, особенно по правильному определению M и интерпретации результатов PCA. Спасибо!
import pandas as pd
from sklearn.decomposition import PCA
train = pd.read_csv("MNIST_train.csv")
test = pd.read_csv("MNIST_train.csv")
train = train[train.label.isin([0, 1])]
test = test[test.label.isin([0, 1])]
X_train = train.drop(["label"], axis=1)
X_test = test.drop(["label"], axis=1)
Y_train = train["label"]
Y_test = test["label"]
pca = PCA(svd_solver='full').fit(X_train)
M = (pca.explained_variance_ratio_.cumsum() > 0.9).argmax() + 1 # указать дисперсию
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)
print(M)
print(round(X_train[0, 0], 3)) # указать компоненту и изображение (данный номер - 1)
import pandas as pd
from sklearn.decomposition import PCA
train = pd.read_csv("MNIST_train.csv")
test = pd.read_csv("MNIST_train.csv")
train = train[train.label.isin([0, 1])]
test = test[test.label.isin([0, 1])]
X_train = train.drop(["label"], axis=1)
X_test = test.drop(["label"], axis=1)
Y_train = train["label"]
Y_test = test["label"]
pca = PCA(svd_solver='full').fit(X_train)
M = (pca.explained_variance_ratio_.cumsum() > 0.9).argmax() + 1 # указать дисперсию
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)
print(M)
print(round(X_train[0, 0], 3)) # указать компоненту и изображение (данный номер - 1)