Discusión sobre el artículo "Remuestreo avanzado y selección de modelos CatBoost con el método de fuerza bruta" - página 14

[Eliminado]  
mytarmailS:

Karoch no se, igual me he equivocado de gmm ))) Pero no veo la diferencia entre con ella y sin ella, en mi opinión todo lo decide el objetivo y nada más....


Tengo 60k datos en total.

Tomo los primeros 10k y selecciono al azar 500 puntos.

Entreno el modelo con ellos inmediatamente o entreno el gmm y luego entreno el modelo.

Pruebo con los 50.000 restantes.

E incluso de la forma habitual se pueden encontrar modelos como con gmm , y con la misma frecuencia están genetizados.

por ejemplo

modelo sin gmm se entrena en 500 puntos, prueba en 50k.


=================================================================================================

Vi algo interesante en lo que pensar.....

Hay un punto de vista tal que el mercado debe ser dividido en estados y el comercio en cada estado una estrategia diferente, pero todos los intentos conocidos para mí no tuvieron éxito, o bien el estado no ve o el modelo de comercio mal incluso en "una especie de" estado.

Pero en este enfoque, se puede ver muy claramente qué mercado el modelo "le gusta". y cuáles no.

Probablemente debido a los retornos de la mashka como señales, el modelo funciona mejor en plano.

Es posible dividir manualmente en estados y añadir estos periodos a la pista. Necesitas equilibrar los ejemplos por 'estados', o hacer unos artificiales via gmm. Cómo así, nunca conseguí tales resultados en un modelo desnudo. Tal vez algunas Mashas puedan hacerlo.
 
Maxim Dmitrievsky:
Puedes dividir manualmente en estados y deslizar esos periodos en el traine. Es necesario equilibrar los ejemplos por "estados", o crear ejemplos artificiales mediante gmm.

Sí, puedes hacer HMM por estado, pero todo será reconocido por una ventana deslizante, así que con un retraso en el tamaño de la ventana, así que ...... )

Acabo de ver que hay una visión muy clara de los estados , me pareció interesante .

[Eliminado]  
mytarmailS:

Sí, se puede hacer HMM por estados , pero todo será reconocido por una ventana deslizante , y por lo tanto con un retraso en el tamaño de la ventana , y por lo tanto ...... )

Acabo de ver que aquí se ven los estados muy claramente, me ha parecido interesante.

Las tendencias suelen ser menos que planas, por lo que me parece que siempre será así, hay que muestrearlas. La misma agrupación se puede utilizar para dividirlos en estados.
 
Maxim Dmitrievsky:
. Cómo es posible, nunca obtuve resultados así en un modelo desnudo. Tal vez algunos Mashkas pueden hacerlo.

Ha sido con la gmm, he estado probando diferentes cosas, esto y lo otro.

 
Maxim Dmitrievsky:

Tengo la obsesión de crear una muestra de entrenamiento optimizando distribuciones o funciones.

Sin utilizar ninguna muestra, simplemente generar "algo" y probarlo con datos reales.

Pero aún no sé cómo realizarlo

=====================================================

También tengo una idea para mejorar la calidad eliminando los árboles malos del modelo, esto también puede ayudar.

[Eliminado]  
mytarmailS:

Tengo una obsesión por crear una muestra de entrenamiento optimizando distribuciones o funciones.

Luego, sin partir de ninguna muestra, simplemente generar "algo" y probarlo con datos reales.

Pero aún no sé cómo realizarlo.

=====================================================

También tengo una idea para mejorar la calidad eliminando los árboles malos del modelo, eso también podría ayudar.

Tú eres el que quiere meterse de lleno en la modelización estocástica
 
Maxim Dmitrievsky:

Es un enfoque curioso. Para equilibrar las clases. Podría ser jugado para nuestros propósitos. Se me acaba de ocurrir.

https://towardsdatascience.com/augmenting-categorical-datasets-with-synthetic-data-for-machine-learning-a25095d6d7c8

Intenté integrar este enfoque en el clusterizador del artículo, pero no como método de equilibrado de clases, sino como generador de un nuevo conjunto de datos equilibrado.

Hay un gran método allí para calcular la distancia de Mahalanobis entre dos matrices unidimensionales. El artículo dice que es una generalización multivariante de cuántas desviaciones estándar hay entre una muestra y la media de la distribución.

Aún no he experimentado a fondo esta métrica, pero el autor sugiere utilizarla para evaluar si las características generadas pertenecen a una clase determinada .

https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.mahalanobis.html

Para calcular este indicador, necesitamos 2 matrices univariantes y una matriz de covarianzas.

En nuestro caso, la primera matriz es la característica generada, la segunda es la distribución media de las características del GMM. La matriz de covarianzas también se extrae del MMG. GMM se prepara para cada clase por separado. También se generan la media, las desviaciones estándar de cada rasgo y las etiquetas. Estos son necesarios para generar nuevos datos.

import numpy.linalg as lnalg
from scipy.spatial.distance import mahalanobis

#initialization 
gmms = dict()
desc_df = list()
inv_sig = dict()
arr_classes = np.sort(X.labels.unique())
cols = X.columns.tolist()
pr_c = add_labels(pr.copy(), min=60, max=120, add_noize=0.0)
X = pr_c[pr_c.columns[2:]]
x_train = X.copy()

#create descriptive statistics, train gmm, extract means and covariances for each classes
for ind, cls in enumerate(arr_classes):

    desc_df.append(x_train[x_train['labels'] == cls].describe())

    x_trainGMM = x_train[x_train['labels'] == cls].values[:, :-1]
    gmm = mixture.GaussianMixture(n_components=1, covariance_type='full').fit(x_trainGMM)
    gmms[cls] = (gmm.means_, gmm.covariances_)

    # invert the matrix for mahalanobis calc
    mu, sig = gmms[cls]
    isig = lnalg.inv(sig)
    inv_sig[cls] = mu, isig

Todo está listo para generar y seleccionar nuevos datos. A continuación al azar sobre la base de la media y la desviación, las características generadas para cada clase en el número de más de 60 veces de lo especificado. Esto es necesario para tener algo para elegir. Y las etiquetas se llevan al estado 0 -1.

 def brute_force(samples=5000):
    import numpy.linalg as lnalg
    gen = []

    for index_cl, cls in enumerate(arr_classes):

        dlt = samples * 60
        sub_arr = np.zeros((dlt, len(cols), 1))
        
        #generate samples ahd lables for cls class
        col_counter = 0
        for col in cols:
            sub_arr[:, col_counter] = np.random.normal(loc=desc_df[index_cl][col]['mean'],
                                                       scale=desc_df[index_cl][col]['std'],
                                                       size=(dlt, 1)
                                                       )
            col_counter += 1
        sub_arr = sub_arr.reshape((sub_arr.shape[:-1]))

        #normalization lables
        sub_arr[-1] = np.where(sub_arr[-1] >= 0.5, 1, 0)

        mh = np.zeros((arr_classes.shape[0]))
        counter = 0

        #selection of the most successful samples
        for index, i in enumerate(sub_arr):
            for m_index, m_cls in enumerate(arr_classes):
                mu, isig = inv_sig[m_cls]
                mh[m_index] = mahalanobis(i[:-1], mu, isig)
            
            #if gmm assignment the same as the original label add in gen
            if np.argmin(mh) == i[-1]:
                gen = np.append(gen, i)
                counter += 1
            if counter == int(samples / 2):
                break


...

Después para cada muestra se calcula el índice de distancia Mahalanobis, con respecto a las matrices de distribuciones medias de GMM para ambas clases. obtenemos una matriz de 2 valores que muestran la proximidad de la muestra generada a ambas clases. el valor mínimo mostrará cual. Si la etiqueta coincide con él, lo añadimos a la muestra de entrenamiento. Y cuando la muestra se llena hasta el valor establecido, pasamos a la siguiente clase. De esta forma obtenemos una muestra perfectamente equilibrada.

Pero no anula el baile de pandereta y las complicadas relaciones con el azar. Pero si te esfuerzas lo suficiente, puedes obtener un resultado normal:

Si tengo tiempo y energía, intentaré sembrar las distribuciones de características de 25 a 75 cuantiles en el generador, quizás dé algo.

También intenté utilizar el indicador de distancia para evaluar la elección de las características objetivo. La idea era que con etiquetas y objetivos correctamente seleccionados, el valor medio de este indicador disminuirá.

results = np.zeros(x_train.shape[0])
mh = np.zeros((arr_classes.shape[0]))
for index, i in enumerate(x_train.to_numpy()):
    for m_ind, m_cls in enumerate(arr_classes):
        mu, isig = inv_sig[m_ind]
        mh[m_ind] = mahalanobis(i[:-1], mu, isig)

    if np.argmin(mh) == i[-1]:
        results[index] = mh[np.argmin(mh)]

acc = results.sum() / results.shape[0]

print('Accuracy:', acc)

Ejecuté todas las combinaciones "acertadas" disponibles de objetivo y características y también reproduje las combinaciones "fallidas". Con un análisis tan superficial, el indicador disminuye para las variantes acertadas y aumenta para las fallidas. Puede haber alguna correlación, pero hay que comprobarlo. Si tienes alguna versión del escáner de cuadrículas o GA, puedes comprobarlo

[Eliminado]  
welimorn:

No está mal, así que me llamó la atención. Intenté integrar este enfoque en el motor de clustering del artículo, sólo que no como método de equilibrado de clases, sino como generador de un nuevo conjunto de datos equilibrado.

Ejecuté todas las combinaciones "exitosas" de objetivo y atributos y reproduje las combinaciones "no exitosas". En este análisis superficial, el índice disminuye para las variantes con éxito y aumenta para las variantes sin éxito. Puede haber alguna correlación, pero hay que comprobarlo. Si tienes alguna versión de grid scanner o GA, puedes comprobarlo

Aún no hay escáner. Genial, tendré que echarle un vistazo. Hasta ahora he estado recopilando información sobre enfoques adicionales que pueden mejorar el modelo (además de los codificadores). Probablemente formalizaré un artículo pronto.

 
Maxim Dmitrievsky:

Todavía no hay escáner. Genial, habrá que echarle un vistazo. Mientras tanto, he estado recopilando información sobre otros enfoques que pueden mejorar el modelo (además de los codificadores). Probablemente formalizaré un artículo pronto.

En cuanto a tu mencionada combinación de modelos exitosos en el proceso de búsqueda, he probado a combinar modelos exitosos con diferentes atributos. Esta técnica iguala la caída en algunas partes del historial. También se ha observado que añadir modelos con R^2 a partir de 0,65 mejora los resultados, aunque haya modelos con R^2 0,85-0,95.

[Eliminado]  
welimorn:

Además de la mencionada combinación de patrones exitosos en el proceso de búsqueda, probé a combinar patrones exitosos con diferentes atributos. Esta técnica iguala la reducción en algunas partes del historial. También se observó que añadir modelos con R^2 a partir de 0,65 mejora los resultados, aunque haya modelos con R^2 de 0,85-0,95.

Sí, pero a menudo a costa de reducir el número de operaciones en un 10-20%.