Closed Tulmot closed 6 years ago
Después de hacer los subgrupos, estaba haciendo PCA, los pasos que he ido haciendo son:
Llamo a la función que me divide el conjunto X en subgrupos:
self._split_group=self.split(X)
Instancio pca:
pca = decomposition.PCA(n_components=self.n_groups)
Los siguientes paso ya es llamar a la función pca_fit_transform que recibe cada uno de los grupos y hace el fit y el transform
Según el ejemplo que vimos el otro dia de Iris entiendo que sería algo asi pero no me funciona
def fit(self, X, y):
def pca_fit_transform(subX):
pca.fit([subX])
return pca.transform([subX])
self.random_state = check_random_state(self.random_state)
self._split_group=self.split(X)
pca = decomposition.PCA(n_components=self.n_groups)
pcas=list(map(pca_fit_transform,self._split_group))
print(pcas)
Me da el siguiente error:
C:\Users\Tubi\Anaconda3\lib\site-packages\sklearn\decomposition\pca.py:398: RuntimeWarning: invalid value encountered in true_divide explained_varianceratio = explainedvariance / total_var
Probablemente no tenga que ver con el error que te da, pero veo que solo tienes un objeto PCA y entiendo que tienes que tener varios, uno por grupo.
El argumento n_components parece que si no se indica, toma todas las componentes, que es lo que queremos. Así que no lo pondría.
Imprime el subX con el que estás haciendo el fit de pca. Si la división da un error puede que sea porque el divisor sea 0, si la varianza total es 0 podría ser porque la matriz sea constante.
entonces tendria que tener una lista de pca? que la lista tendria tantos pca como grupos haya
El subX que hago en el fit me imprime: Por lo que entiendo que no deberia dar problema ya que todos los subgrupos son de tamaño 3
Hay que tener una lista (u otra estructura) de PCAs.
Si pones imágenes no podemos copiar y pegar como texto.
¿Esa salida que estás mostrando, es la impresión de un subX o de varios?
¿Cuál es el valor de X?
Este es el código que tengo hasta el momento:
def __init__(self,
base_estimator=DecisionTreeClassifier(),
n_groups=3,
random_state=None):
self.base_estimator = base_estimator
self.n_groups = n_groups
self.random_state = random_state
def split(self,X):
tam = X.shape[0]
list_instances=np.arange(tam)
self.random_state.shuffle(list_instances)
list_instances=list(list_instances)
while(len(list_instances)%self.n_groups!=0):
list_instances.append(self.random_state.randint(0,tam))
list_instances=np.asarray(list_instances)
return np.split(list_instances, list_instances.shape[0]/self.n_groups)
def fit(self, X, y):
"""Build a Bagging ensemble of estimators from the training set (X, y).
Parameters
----------
X : It's a matrix of form = [n_instances, n_features]
The training input samples. Sparse matrices are accepted only if
they are supported by the base estimator.
y : It's a matrix of form = [n_class]
The target values (class labels in classification, real numbers in
regression).
Returns
-------
self : object
Returns self.
"""
def pca_fit_transform(subX):
print([subX])
pca.fit([subX])
return pca.transform([subX])
self.random_state = check_random_state(self.random_state)
self._split_group=self.split(X)
pca = decomposition.PCA()
pcas=list(map(pca_fit_transform,self._split_group))
print(pcas)
#a=self.random_state.choice(tam, self.n_groups, replace=False)
print(self._split_group)
en la foto son los subX en los que he dividido X
X es:
Ahora que lo veo subX esta mal porque tengo la posición de la instancia pero no la instancia, ahora lo corrijo
Pues cuando tengas otro error, ya sabes qué hacer. Muestra resultados intermedios y comprueba si coinciden con los valores que esperabas que tuvieran.
De momento solo uso un pca, aunque no me falla entiendo que esta no es la salida que debería devolver no?(hay 9 arrays porque como X tiene 25 instancias me crea 9 subgrupos):
No se si esto es porque uso el mismo pca o sale esto por otra cosa.
La nueva X tiene que tener el mismo formato que la antigua X. Tienes que concatenar las columnas, pero sin anidamientos adicionales.
vale entonces ahora lo que tengo lo concateno como has dicho y luego ya sobre esa nueva X es sobre la que hago el fit
Es que no sabia si los valores que me devolvia cada grupo despues de hacer el fit y transform estaban bien.
Una ultima cosa si así me funciona si que es necesario hacer una estructura de PCAs, o así valdría?
Y claro otro problema es que yo ahora por ejemplo mi "X" inicial tiene 25 instancias pero para que pudiera ser multiplo de 3 he cogido dos aleatorias por lo tanto tengo al final 27 instancias, entonces cuando voy hacer el fit de mi "X" nueva con la "y" inicial, me falla porque mi nueva "X" tiene 27 y la "y" tiene 25
Repasa el pseudocódigo del algoritmo que hay en el artículo original y entiéndelo (igual un diagrama de flujo puede ayudarte). De este modo no te surgirán tantas preguntas Eduardo.
Cuando ya tenemos los grupos, usaremos PCA sobre cada uno de los grupos, en los que haremos primero fit y luego transform.