J'essaie d'optimiser un algorithme d'ACP à noyau non supervisé. Voici un peu de contexte :
Une autre approche, cette fois-ci entièrement non supervisée, consiste à sélectionner le noyau et h l'erreur de reconstruction la plus faible. Cependant, la reconstruction n'est pas aussi facile qu'avec l'ACP linéaire
....
Heureusement, il est possible de trouver un point dans l'espace original où se rapproche du point reconstruit. C'est ce qu'on appelle la pré-image de reconstruction. Une fois que vous avez cette pré-image, vous pouvez mesurer sa distance au carré par rapport à l'instance originale. Vous pouvez alors sélectionner le noyau et les hyperparamètres qui minimisent cette l'erreur de pré-image de reconstruction.
Une solution consiste à entraîner une régression supervisée. instances projetées comme l'ensemble d'apprentissage et cibles.
Vous pouvez désormais utiliser la recherche par grille avec des valeurs croisées. et les hyperparamètres qui minimisent l'erreur de reconstruction de la pré-image.
Le code fourni dans le livre pour effectuer la reconstruction sans validation croisée est le suivant :
rbf_pca = KernelPCA(n_components = 2, kernel="rbf", gamma=0.0433,fit_inverse_transform=True)
X_reduced = rbf_pca.fit_transform(X)
X_preimage = rbf_pca.inverse_transform(X_reduced)
>>> from sklearn.metrics import mean_squared_error
>>> mean_squared_error(X, X_preimage)
32.786308795766132
Ma question est la suivante : comment mettre en œuvre la validation croisée pour ajuster le noyau et les hyperparamètres afin de minimiser l'erreur de reconstruction de la pré-image ?
Voici ce que j'ai fait jusqu'à présent :
from sklearn.metrics import mean_squared_error
from sklearn.decomposition import KernelPCA
mean_squared_error(X, X_preimage)
kpca=KernelPCA(fit_inverse_transform=True, n_jobs=-1)
from sklearn.model_selection import GridSearchCV
param_grid = [{
"kpca__gamma": np.linspace(0.03, 0.05, 10),
"kpca__kernel": ["rbf", "sigmoid", "linear", "poly"]
}]
grid_search = GridSearchCV(clf, param_grid, cv=3, scoring='mean_squared_error')
X_reduced = kpca.fit_transform(X)
X_preimage = kpca.inverse_transform(X_reduced)
grid_search.fit(X,X_preimage)
Merci de votre attention.