English Русский 中文 Deutsch 日本語 Português
preview
Aprendizaje automático y Data Science (Parte 29): Consejos esenciales para seleccionar los mejores datos de divisas para el entrenamiento de IA

Aprendizaje automático y Data Science (Parte 29): Consejos esenciales para seleccionar los mejores datos de divisas para el entrenamiento de IA

MetaTrader 5Estadística y análisis |
434 1
Omega J Msigwa
Omega J Msigwa

Contenido


Introducción

Con todos los datos e información comercial como indicadores (hay más de 36 indicadores incorporados en MetaTrader 5), pares de símbolos (hay más de 100 símbolos) que también se pueden utilizar como datos para estrategias de correlación, también hay noticias que son datos valiosos para los traders, etc. El punto que intento plantear es que existe abundante información que los traders pueden utilizar en el trading manual o cuando intentan construir modelos de Inteligencia Artificial para ayudarnos a tomar decisiones comerciales inteligentes en nuestros robots comerciales.

De toda la información que tenemos a mano, tiene que haber alguna mala (eso es de sentido común). No todos los indicadores, datos, estrategia, etc. son útiles para un determinado símbolo de trading, estrategia o situación. ¿Cómo determinamos la información correcta para los modelos comerciales y de aprendizaje automático para lograr la máxima eficiencia y rentabilidad? Aquí es donde la selección de características entra en juego.


¿Qué es la selección de características?

La selección de características es un proceso de identificación y selección de un subconjunto de características relevantes del conjunto de datos original que se utilizarán en la construcción del modelo. Se trata de determinar la información más útil para alimentar un modelo de aprendizaje automático y desechar la basura (características/información menos importantes).

La selección de características es uno de los pasos críticos en la construcción de un modelo de aprendizaje automático eficaz, a continuación se presentan las razones.


¿Por qué es necesaria la selección de características en los modelos de IA?

  • Reduce la dimensionalidad

    Al eliminar características irrelevantes o redundantes, la selección de características simplifica el modelo y reduce los costes computacionales.

  • Mejora el rendimiento

    Centrarse en las características más informativas puede mejorar la precisión y el poder predictivo del modelo.

  • Mejora la interpretabilidad

    Los modelos con menos características suelen ser más fáciles de entender y explicar.

  • Maneja el ruido eliminando los datos ruidosos o irrelevantes

    Al eliminar las características menos importantes, la selección de características puede ayudar a evitar el sobreajuste que suele producirse por tener demasiados datos irrelevantes.   

Ahora que sabemos lo importante que es la selección de características, vamos a explorar diferentes técnicas que suelen utilizar los científicos de datos y los expertos en aprendizaje automático para encontrar las mejores características para sus modelos de IA.

Utilizando el mismo conjunto de datos que usamos en este artículo (de lectura obligada). El conjunto de datos tiene 28 variables.

Datos de series temporales de divisas

De las 28 variables, queremos encontrar las variables más relevantes para las columnas "TARGET_OPEN" (que contiene los valores del precio de apertura de la siguiente vela) y "TARGET_CLOSE" (que contiene los valores del precio de cierre de la siguiente vela) y dejar atrás los datos menos irrelevantes.

Las técnicas y métodos de selección de características pueden clasificarse en tres tipos principales: métodos de filtro, métodos de envoltura y métodos integrados. Analicemos un método tras otro para ver en qué consisten.


Métodos de filtrado

Los métodos de filtrado evalúan las características independientemente del modelo o algoritmo de aprendizaje automático. Estos métodos incluyen el uso de la matriz de correlación y la realización de pruebas estadísticas.


Matriz de correlaciones

Una matriz de correlaciones es una tabla que muestra los coeficientes de correlación entre distintas variables.

Un coeficiente de correlación es una medida estadística que indica la fuerza y la dirección de la relación entre dos variables. Oscila entre -1 y 1.

Un valor de 1 indica una correlación positiva perfecta (a medida que aumenta una variable, la otra aumenta proporcionalmente).

Un valor de 0 indica que no existe correlación (no hay relación entre las dos variables).

Un valor de -1 indica una correlación negativa perfecta (a medida que una variable aumenta, la otra disminuye proporcionalmente).

Empecemos por calcular la matriz de correlaciones utilizando Python.


Cálculo de la matriz de correlaciones

# Compute the correlation matrix
corr_matrix = df.corr()

# We generate a mask for the upper triangle
mask = np.triu(np.ones_like(corr_matrix, dtype=bool))
cmap = sns.diverging_palette(220, 10, as_cmap=True) # Custom colormap


plt.figure(figsize=(28, 28)) # 28 columns to fit better 

# Draw the heatmap with the mask and correct aspect ratio
sns.heatmap(corr_matrix, mask=mask, cmap=cmap, vmax=1.0, center=0, annot=True,
            square=True, linewidths=1, cbar_kws={"shrink": .75})

plt.title('Correlation Matrix')
plt.savefig("correlation matrix.png")
plt.show()

Salidas

La matriz es demasiado grande para mostrarla, a continuación se muestran algunas de las partes más útiles.

Matriz de confusión recortada


Identificar y eliminar características altamente correlacionadas 

La alta multicolinealidad se produce cuando dos o más características están altamente correlacionadas entre sí, esto puede causar problemas en muchos algoritmos de aprendizaje automático, en particular modelos lineales, esta situación conduce a estimaciones inestables de los coeficientes.

Correlación entre las propias variables independientes

Al combinar o eliminar características altamente correlacionadas, puede simplificar su modelo sin perder mucha información. Por ejemplo, en la matriz de correlación de la imagen anterior, Open, High y Low están correlacionados al 100%. Están correlacionados en un 99 % (estos valores finales están redondeados). Podemos decidir eliminar estas variables y quedarnos con una sola variable, o utilizar técnicas para reducir la dimensión de los datos que vamos a discutir.

Correlación entre las variables independientes (características) y la variable objetivo

Las características que tienen una fuerte correlación con la variable objetivo suelen ser más informativas y pueden mejorar el rendimiento predictivo del modelo.

La matriz de confusión no es directamente aplicable a características categóricas en nuestro conjunto de datos como "DAYOFWEEK", "DAYOFYEAR" y "MONTH", ya que los coeficientes de correlación miden las relaciones lineales entre variables numéricas.


Pruebas estadísticas

Podemos ejecutar pruebas estadísticas para seleccionar características con relaciones significativas con la variable objetivo.


Prueba de chi-cuadrado

La prueba de Chi-cuadrado mide cómo los recuentos esperados se comparan con los recuentos observados en una tabla de contingencia. Ayuda a determinar si existe una asociación significativa entre dos variables categóricas.

Una tabla de contingencia es un tipo de tabla en formato matricial que muestra la distribución de frecuencias de las variables. Puede utilizarse para examinar la relación entre dos variables categóricas. En la prueba de Chi-cuadrado, se utiliza una tabla de contingencia para comparar las frecuencias observadas de las variables categóricas con las frecuencias esperadas.

La prueba de Chi-cuadrado solo se aplica a variables categóricas.

En nuestro conjunto de datos, tenemos un par de variables categóricas (DAYOFMONTH, DAYOFWEEK, DAYOFYEAR y MONTH). También tenemos que crear una variable objetivo para medir las relaciones entre ella y las características.

Código Python
from sklearn.feature_selection import chi2
from sklearn.feature_selection import SelectKBest

target = []

# Loop through each row in the DataFrame to create the target variable

for i in range(len(df)):
    if df.loc[i, 'TARGET_CLOSE'] > df.loc[i, 'TARGET_OPEN']:
        target.append(1)
    else:
        target.append(0)
        

X = pd.DataFrame({
    'DAYOFMONTH': df['DAYOFMONTH'],
    'DAYOFWEEK': df['DAYOFWEEK'],
    'DAYOFYEAR': df['DAYOFYEAR'],
    'MONTH': df['MONTH']
})


chi2_selector = SelectKBest(chi2, k='all')
chi2_selector.fit(X, target)
chi2_scores = chi2_selector.scores_

# Output scores for each feature

feature_scores = pd.DataFrame({'Feature': X.columns, 'Chi2 Score': chi2_scores})
print(feature_scores)

Salidas

      Feature  Chi2 Score
0  DAYOFMONTH    0.622628
1   DAYOFWEEK    0.047481
2   DAYOFYEAR   14.618057
3       MONTH    0.489713

De los resultados anteriores, vemos que DAYOFYEAR tiene la puntuación Chi2 más alta, lo que indica que es la variable más impactante en la variable objetivo en comparación con las demás. Esto tiene sentido, ya que los datos se recopilaron dentro de un período de tiempo diario y cada día corresponde de forma única a un día del año. La fuerte presencia de la variable DAYOFYEAR en el conjunto de datos probablemente aumenta su frecuencia y significancia, convirtiéndola en una característica clave para predecir la variable objetivo.


Prueba ANOVA (Análisis de varianza)

ANOVA es un método estadístico utilizado para comparar las medias de tres o más grupos para ver si al menos una de las medias del grupo es estadísticamente diferente de las demás. Ayuda a determinar la fuerza de la relación entre las características continuas y la variable objetivo categórica.

Funciona no sólo analizando la varianza dentro de cada grupo y entre los grupos, sino que también mide la variabilidad de la observación dentro de cada grupo y la variabilidad entre las medias de diferentes grupos.

Esta prueba calcula la estadística F, que es la relación entre la varianza entre grupos y la varianza dentro del grupo. Una estadística F más alta indica que los grupos tienen medias diferentes.

Utilicemos "f_classif" de Scikit-learn para realizar una prueba ANOVA para la selección de características.

Código Python

from sklearn.feature_selection import f_classif

# We start by dropping the categorical variables in the dataset

X = df.drop(columns=[
    "DAYOFMONTH",
    "DAYOFWEEK",
    "DAYOFYEAR",
    "MONTH",
    "TARGET_CLOSE",
    "TARGET_OPEN"
])


# Perform ANOVA test

selector = SelectKBest(score_func=f_classif, k='all')
selector.fit(X, target)

# Get the F-scores and p-values
anova_scores = selector.scores_
anova_pvalues = selector.pvalues_

# Create a DataFrame to display results
anova_results = pd.DataFrame({'Feature': X.columns, 'F-Score': anova_scores, 'p-Value': anova_pvalues})
print(anova_results)

Salidas

            Feature   F-Score   p-Value
0              OPEN  3.483736  0.062268
1              HIGH  3.627995  0.057103
2               LOW  3.400320  0.065480
3             CLOSE  3.666813  0.055792
4         OPEN_LAG1  3.160177  0.075759
5         HIGH_LAG1  3.363306  0.066962
6          LOW_LAG1  3.309483  0.069181
7        CLOSE_LAG1  3.529789  0.060567
8         OPEN_LAG2  3.015757  0.082767
9         HIGH_LAG2  3.034694  0.081810
10         LOW_LAG2  3.259887  0.071295
11       CLOSE_LAG2  3.206956  0.073629
12        OPEN_LAG3  3.236211  0.072329
13        HIGH_LAG3  3.022234  0.082439
14         LOW_LAG3  3.020219  0.082541
15       CLOSE_LAG3  3.075698  0.079777
16        30DAY_SMA  2.665990  0.102829
17      7DAY_STDDEV  0.639071  0.424238
18   DIFF_LAG1_OPEN  1.237127  0.266293
19   DIFF_LAG1_HIGH  0.991862  0.319529
20    DIFF_LAG1_LOW  0.131002  0.717472
21  DIFF_LAG1_CLOSE  0.198001  0.656435

Las puntuaciones F más altas indican que la característica tiene una fuerte relación con la variable objetivo.

Los valores P inferiores al nivel significativo (por ejemplo, 0.05) se consideran estadísticamente significativos.

También podemos seleccionar las características con las puntuaciones F más altas o los valores P más bajos que son las características más importantes y dejar atrás otras características. Seleccionemos las 10 características principales.

Código Python

selector = SelectKBest(score_func=f_classif, k=10)
X_selected = selector.fit_transform(X, target)


# print the selected feature names

selected_features = X.columns[selector.get_support()]
print("Selected Features:", selected_features)

Salidas

Selected Features: Index(['OPEN', 'HIGH', 'LOW', 'CLOSE', 'HIGH_LAG1', 'LOW_LAG1', 'CLOSE_LAG1',
       'LOW_LAG2', 'CLOSE_LAG2', 'OPEN_LAG3'],
      dtype='object')


Métodos de envoltura

Estos métodos implican evaluar el rendimiento de un modelo utilizando diferentes subconjuntos o características. En los métodos de envoltura, vamos a discutir la eliminación recursiva de características (RFE) y la selección secuencial de características (SFS).


Eliminación recursiva de características (Recursive Feature Elimination, RFE)

Se trata de una técnica de selección de características que tiene como objetivo seleccionar las características más relevantes considerando de forma recursiva conjuntos de características cada vez más pequeños. Funciona ajustando un modelo y eliminando las características menos importantes hasta alcanzar el número deseado de características.


Cómo funciona RFE

Comenzamos entrenando cualquier modelo de aprendizaje automático. En este ejemplo; utilicemos la regresión logística.

Código Python

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

# Prepare the target variable, again

y = []

# Loop through each row in the DataFrame to create the target variable
for i in range(len(df)):
    if df.loc[i, 'TARGET_CLOSE'] > df.loc[i, 'TARGET_OPEN']:
        y.append(1)
    else:
        y.append(0)

# Drop future variables from the feature set
X = df.drop(columns=["TARGET_CLOSE", "TARGET_OPEN"])

# Initialize the model
model = LogisticRegression(max_iter=10000)

Luego inicializamos la RFE con el modelo y la cantidad de características más impactantes que queremos seleccionar de los datos.

# Initialize RFE with the model and number of features to select
rfe = RFE(estimator=model, n_features_to_select=10)

# Fit RFE
rfe.fit(X, y)
selected_features_mask = rfe.support_

Por último, determinamos las características menos importantes y las eliminamos.

Código Python

# Getting the names of the selected features
feature_names = X.columns
selected_feature_names = feature_names[selected_features_mask]


selected_features = pd.DataFrame({
    "Name": feature_names,
    "Mask": selected_features_mask
})

selected_features.head(-1)

Salidas

        Name    Mask
0       OPEN    True
1       HIGH    True
2       LOW     True
3       CLOSE   True
4       OPEN_LAG1       False
5       HIGH_LAG1       True
6       LOW_LAG1        True
7       CLOSE_LAG1      True
8       OPEN_LAG2       False
9       HIGH_LAG2       False
10      LOW_LAG2        True
11      CLOSE_LAG2      True
12      OPEN_LAG3       True
13      HIGH_LAG3       False
14      LOW_LAG3        False
15      CLOSE_LAG3      False
16      30DAY_SMA       False
17      7DAY_STDDEV     False
18      DAYOFMONTH      False
19      DAYOFWEEK       False
20      DAYOFYEAR       False
21      MONTH   False
22      DIFF_LAG1_OPEN  False
23      DIFF_LAG1_HIGH  False
24      DIFF_LAG1_LOW   False

Todas las características a las que se asigna el valor True son los valores más importantes. Para obtenerlas, podemos trocearlas a partir de la matriz X original.

# Filter the dataset to keep only the selected features

X_selected = X.loc[:, selected_features_mask]

#for better readability, we convert this into pandas dataframe

X_selected_df = pd.DataFrame(X_selected, columns=selected_feature_names)

print("Selected Features")
X_selected_df.head()

Salidas

Características seleccionadas


Ventajas de RFE

  • RFE se puede utilizar con cualquier modelo que pueda clasificar características por importancia.
  • Al eliminar características irrelevantes, RFE puede mejorar el rendimiento del modelo.
  • Al eliminar características innecesarias, puede ayudar a reducir el sobreajuste.


Desventajas de RFE

  • Puede resultar computacionalmente costoso cuando se dan grandes conjuntos de datos y modelos complejos como redes neuronales, ya que requiere volver a entrenar el modelo varias veces.
  • RFE es un algoritmo codicioso y es posible que no siempre encuentre el subconjunto óptimo de características.


Selección secuencial de características (Sequential Feature Selection, SFS)

Se trata de un método de envoltura para la selección de características que construye de forma incremental un conjunto de características añadiendo o eliminando características en función de su contribución al rendimiento de un modelo. Existen dos tipos principales de selección secuencial de características: eliminación hacia delante y hacia atrás.

En la selección hacia delante, las características se añaden una a una empezando por un conjunto vacío hasta que se alcanza el número deseado de características, o añadir más características no mejora el rendimiento del modelo.

En la selección hacia atrás, esto funciona al contrario que en la selección hacia delante. Empezamos con todos los rasgos y los eliminamos uno a uno, cada vez eliminando el rasgo menos significativo hasta que quede el número deseado de rasgos.


Selección hacia delante

from sklearn.feature_selection import SequentialFeatureSelector

# Create a logistic regression model
model = LogisticRegression(max_iter=10000)

# Create a SequentialFeatureSelector object
sfs = SequentialFeatureSelector(model, n_features_to_select=10, direction='forward')

# Fit the SFS object to the training data
sfs.fit(X, target)

# Get the selected feature indices
selected_features = sfs.get_support(indices=True)
selected_features_names = X.columns[selected_features] # get the feature names

# Print the selected features
print("Selected feature indices:", selected_features)
print("Selected feature names:", selected_feature_names)

Salidas

Selected feature indices: [ 1  7  8 12 17 19 22 23 24 25]
Selected feature names: Index(['OPEN', 'HIGH', 'LOW', 'CLOSE', 'HIGH_LAG1', 'LOW_LAG1', 'CLOSE_LAG1',
       'LOW_LAG2', 'CLOSE_LAG2', 'OPEN_LAG3'],
      dtype='object')


Selección hacia atrás

# Create a logistic regression model
model = LogisticRegression(max_iter=10000)

# Create a SequentialFeatureSelector object
sfs = SequentialFeatureSelector(model, n_features_to_select=10, direction='backward')

# Fit the SFS object to the training data
sfs.fit(X, target)

# Get the selected feature indices
selected_features = sfs.get_support(indices=True)
selected_features_names = X.columns[selected_features] # get the feature names

# Print the selected features
print("Selected feature indices:", selected_features)
print("Selected feature names:", selected_feature_names)

Salidas

Selected feature indices: [ 2  3  7 10 11 12 13 14 15 16]
Selected feature names: Index(['OPEN', 'HIGH', 'LOW', 'CLOSE', 'HIGH_LAG1', 'LOW_LAG1', 'CLOSE_LAG1',
       'LOW_LAG2', 'CLOSE_LAG2', 'OPEN_LAG3'],
      dtype='object')

A pesar de adoptar enfoques diferentes, tanto el método hacia atrás como el hacia adelante convergieron a la misma solución. Produciendo el mismo número de características.


Ventajas de la selección secuencial de características

  • Fácil de entender e implementar.
  • Se puede utilizar con cualquier algoritmo de aprendizaje automático.
  • A menudo conduce a un mejor rendimiento del modelo al seleccionar las características más relevantes.


Desventajas de la selección secuencial de características

  • Este método es lento con conjuntos de datos grandes o muchas características.
  • Es posible que no encuentre el conjunto de características óptimo, ya que toma decisiones en función de mejoras locales.


Métodos integrados

Estos métodos implican la realización de la selección de características durante el proceso de entrenamiento del modelo. El flujo de trabajo de selección de características integradas implica:

  1. Entrenamiento de un modelo de aprendizaje automático
  2. Derivación de la importancia de las características
  3. Selección de las variables predictoras de mayor rango
Los métodos integrados más comunes incluyen la regresión Lasso y los métodos basados en árboles de decisión.


Regresión de Lasso

Los modelos de regresión lineal predicen el resultado basándose en una combinación lineal del espacio de características. Los coeficientes se determinan minimizando la diferencia al cuadrado entre el valor real y el valor previsto del objetivo. Existen tres procedimientos principales de regularización: Ridge, Lasso y Elastic Net, que combina los dos primeros. En la regresión Lasso, los coeficientes se reducen en una constante dada, utilizando la regularización L1. En la regresión Ridge, el cuadrado de los coeficientes se penaliza con una constante, utilizando la regularización L2. El objetivo de reducir los coeficientes es disminuir la varianza y evitar el sobreajuste. La mejor constante (parámetro de regularización) debe estimarse mediante la optimización de hiperparámetros.

La regularización Lasso puede hacer que algunos de los coeficientes sean exactamente cero. El resultado es una selección de características que nos permite eliminarlas de los datos de forma segura.

Código Python

from sklearn.model_selection import train_test_split
from sklearn.linear_model import Lasso
from sklearn.metrics import r2_score
from sklearn.preprocessing import MinMaxScaler

y = df["TARGET_CLOSE"]

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# A scaling technique
scaler = MinMaxScaler()

# Initialize and fit the lasso model
lasso = Lasso(alpha=0.001)  # You need tune for the best penalty value

# Train the scaler and transfrom data
X_train = scaler.fit_transform(X_train)

lasso.fit(X_train, y_train)

print(f'Coefficients: {lasso.coef_}') #print coefficients

# Predict on the test set
X_test = scaler.transform(X_test)
y_pred = lasso.predict(X_test)

# Calculate mean squared error
mse = r2_score(y_test, y_pred)
print(f'Lasso regression test accuracy = {mse}')


# select all features with coefficents not equal to zero
selected_features = X.columns[lasso.coef_ != 0]
print(f'Selected Features: {selected_features}')

Salidas

Coefficients: [ 0.          0.02575516  0.05720178  0.1453415   0.          0.
  0.          0.          0.          0.          0.          0.
  0.          0.          0.          0.          0.0228085  -0.
  0.         -0.          0.          0.          0.          0.
  0.          0.        ]
Lasso regression test accuracy = 0.9894539761500866
Selected Features: Index(['HIGH', 'LOW', 'CLOSE', '30DAY_SMA'], dtype='object')

El modelo tuvo una precisión del 98 %, ya que sólo seleccionó 4 características.


Ventajas de la regresión Lasso para la selección de características

  • Lasso selecciona automáticamente las características más importantes, lo que simplifica el modelo y mejora su interpretabilidad.
  • Al añadir un término de penalización, el lazo reduce el riesgo de sobreajuste.
  • Lasso puede producir modelos más fáciles de interpretar gracias a la eliminación de características irrelevantes.


Desventajas de la regresión Lasso para la selección de características

  • Cuando las características están muy correlacionadas, la técnica de regresión lasso puede dar lugar a estimaciones inestables de los coeficientes.
  • En los casos en los que el número de características supera el número de observaciones, es posible que el lazo no funcione bien.


Métodos basados en árboles de decisión

Los algoritmos de árboles de decisión predicen resultados particionando recursivamente los datos. En cada nodo, el algoritmo selecciona una característica y un valor para dividir los datos, con el objetivo de maximizar la disminución de impurezas.

La importancia de las características en los árboles de decisión está determinada por la reducción total de impurezas que cada característica logra en todo el árbol. Por ejemplo, si se utiliza una característica para dividir los datos en varios nodos, su importancia se calcula como la suma de la reducción de impurezas en todos esos nodos.

Los bosques aleatorios cultivan muchos árboles de decisión en paralelo. La predicción final es la media (o voto mayoritario) de las predicciones de los árboles individuales. La importancia de las características en los bosques aleatorios es la importancia media de cada característica en todos los árboles.

Máquinas de refuerzo de gradiente (GBM), como XGBoost, construyen árboles secuencialmente. Cada árbol pretende corregir los errores (residuos) del árbol anterior. En los GBM, la importancia de las características es la suma de la importancia de todos los árboles.

Analizando los valores de importancia de las características producidos por los árboles de decisión, podemos identificar y seleccionar las características más significativas para nuestro modelo.

from sklearn.ensemble import RandomForestClassifier

y = []

# Loop through each row in the DataFrame to create the target variable
for i in range(len(df)):
    if df.loc[i, 'TARGET_CLOSE'] > df.loc[i, 'TARGET_OPEN']:
        y.append(1)
    else:
        y.append(0)

# Split the data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = RandomForestClassifier(n_estimators=50, min_samples_split=10, max_depth=5, min_samples_leaf=5)
model.fit(X_train, y_train)

importances = model.feature_importances_

print(importances)

selected_features = importances > 0.04
selected_feature_names = X.columns[selected_features]

print("selected features\n",selected_feature_names)

Salidas

[0.02691807 0.05334113 0.03780997 0.0563491  0.03162462 0.03486413
 0.02652285 0.0237652  0.03398946 0.02822157 0.01794172 0.02818283
 0.04052433 0.02821834 0.0386661  0.03921218 0.04406372 0.06162133
 0.03103843 0.02206782 0.05104613 0.01700301 0.05191551 0.07251801
 0.0502405  0.05233394]
selected features
 Index(['HIGH', 'CLOSE', 'OPEN_LAG3', '30DAY_SMA', '7DAY_STDDEV', 'DAYOFYEAR',
       'DIFF_LAG1_OPEN', 'DIFF_LAG1_HIGH', 'DIFF_LAG1_LOW', 'DIFF_LAG1_CLOSE'],
      dtype='object')

Antes de apresurarnos a utilizar las características seleccionadas, tenemos que medir la precisión del clasificador Random forest que seleccionó estas características. Asegúrese de obtener las características seleccionadas por un modelo que funcionó bien en los datos de prueba.

from sklearn.metrics import accuracy_score

test_pred = model.predict(X_test)

print(f"Random forest test accuracy = ",accuracy_score(y_test, test_pred))


Ventajas del bosque aleatorio para la selección de características

  • Los bosques aleatorios crean un conjunto de árboles que reduce el riesgo de sobreajuste en comparación con los árboles de decisión individuales. Esta robustez hace que los puntajes de importancia de las características sean más confiables.
  • Pueden gestionar conjuntos de datos con numerosas características sin una degradación significativa del rendimiento, lo que los hace adecuados para la selección de características en espacios de alta dimensión.
  • Pueden capturar interacciones no lineales complejas entre características, proporcionando una comprensión más matizada de la importancia de las características.


Desventajas del bosque aleatorio para la selección de características

  • El entrenamiento de bosques aleatorios puede ser computacionalmente costoso con grandes conjuntos de datos y una gran cantidad de características. 
  • Los bosques aleatorios pueden asignar puntajes de importancia similares a características correlacionadas, lo que dificulta distinguir qué características son realmente importantes.
  • Los bosques aleatorios a veces pueden favorecer características continuas o con muchos niveles por sobre características categóricas con menos niveles, lo que potencialmente sesga los puntajes de importancia de las características.



Técnicas de reducción de dimensionalidad

También se pueden agregar técnicas de reducción de dimensionalidad a la combinación de técnicas para la selección de características. Las técnicas de reducción dimensional como Análisis de Componentes Principales (Principal Component Analysis, PCA), Análisis Discriminante Lineal (Linear Discriminant Analysis, LDA), Factorización de Matrices No Negativas (Non-negative Matrix Factorization, NMF), SVD Truncado, etc., tienen como objetivo transformar los datos a un espacio de menor dimensión.

Como puede observarse en la matriz de correlaciones, los rasgos OPEN, HIGH, LOW y CLOSE están muy correlacionados. Combinamos estas variables en una para simplificar las características de nuestros modelos y al mismo tiempo conservar la información necesaria en esta única variable producida por PCA. Utilizando el modelo de regresión lineal, vamos a medir qué tan efectivo ha sido el PCA en retener la precisión de los datos reducidos en dimensión en comparación con los datos originales.

from sklearn.decomposition import PCA
from sklearn.linear_model import LinearRegression

pca = PCA(n_components=1)

ohlc = pd.DataFrame({
    "OPEN": df["OPEN"],
    "HIGH": df["HIGH"],
    "LOW": df["LOW"],
    "CLOSE": df["CLOSE"]
})

y = df["TARGET_CLOSE"]

# let us use the linear regression model 
model = LinearRegression()

# for OHLC original data 

model.fit(ohlc, y)
preds = model.predict(ohlc)

print("ohlc_original data LR accuracy = ",r2_score(y, preds))

# For data reduced in dimension

ohlc_reduced = pca.fit_transform(ohlc)

print(ohlc_reduced[:10]) # print 10 rows of the reduced data 

model.fit(ohlc_reduced, y)
preds = model.predict(ohlc_reduced)

print("ohlc_reduced data LR accuracy = ",r2_score(y, preds))

Salidas

ohlc_original data LR accuracy =  0.9937597843724363
[[-0.14447016]
 [-0.14997874]
 [-0.14129409]
 [-0.1293209 ]
 [-0.12659902]
 [-0.12895961]
 [-0.13831287]
 [-0.14061213]
 [-0.14719862]
 [-0.15752861]]
ohlc_reduced data LR accuracy =  0.9921387699876517

Ambos modelos produjeron aproximadamente el mismo valor de precisión de 0.99. Uno utilizó los datos originales (con 4 características) y el otro utilizó datos reducidos en dimensión (con 1 característica).

Por último, podemos modificar los datos originales eliminando las características OPEN, HIGH, LOW y CLOSE y añadiendo una nueva característica denominada OHLC que combina las cuatro características anteriores.

new_df = df.drop(columns=["OPEN", "HIGH", "LOW", "CLOSE"]) #
new_df["OHLC"] = ohlc_reduced

# Reorder the columns to make "ohlc" the first column
cols = ["OHLC"] + [col for col in new_df.columns if col != "OHLC"]
new_df = new_df[cols]

new_df.head(10)

Salidas

OHLC nueva variable después del PCA


Ventajas de las técnicas de reducción de dimensionalidad en la selección de características

  • Reducir la cantidad de funciones puede mejorar el rendimiento de los modelos de aprendizaje automático al eliminar el ruido y la información redundante.
  • Al disminuir el espacio de características, las técnicas de reducción de dimensionalidad ayudan a mitigar el sobreajuste cuando se trabaja con datos de alta dimensión donde es más probable que se produzca un sobreajuste.
  • Estas técnicas pueden filtrar el ruido del conjunto de datos, lo que produce datos más limpios que pueden mejorar la precisión y la confiabilidad del modelo.
  • Los modelos con menos características son más simples y más interpretables. 

Desventajas de las técnicas de reducción de dimensionalidad en la selección de características

  • La reducción de la dimensionalidad a menudo resulta en la pérdida de información importante, lo que podría afectar negativamente el rendimiento del modelo.
  • Técnicas como PCA requieren la selección de la cantidad de componentes a conservar, lo que puede no ser sencillo y puede implicar prueba y error o validación cruzada.
  • Las nuevas características creadas mediante técnicas de reducción de dimensionalidad pueden ser difíciles de interpretar en comparación con las características originales.
  • Reducir la dimensión podría simplificar demasiado los datos, dando lugar a modelos que pasen por alto relaciones sutiles pero importantes entre las características.


Reflexiones finales

Saber cómo extraer la información más valiosa es crucial para optimizar los modelos de aprendizaje automático. Una selección de características eficaz puede reducir significativamente el tiempo de entrenamiento y mejorar la precisión del modelo, lo que genera robots comerciales impulsados por IA más eficientes en MetaTrader 5. Al seleccionar cuidadosamente las características más relevantes, puede mejorar el rendimiento tanto en el trading en vivo como durante las pruebas de estrategia, logrando en última instancia mejores resultados con sus algoritmos de trading.

Saludos cordiales.


Tabla de archivos adjuntos

Archivo Descripción y uso
feature_selection.ipynb 
 Todo el código Python analizado en este artículo se puede encontrar en este Jupyter Notebook
Timeseries OHLC.csv
 Un conjunto de datos utilizado en este artículo


Fuentes


Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/15482

Archivos adjuntos |
Timeseries_OHLC.csv (219.94 KB)
linfo2
linfo2 | 8 ago 2024 en 00:11
Gracias por su artículo claro y bien escrito, es exactamente lo que estaba tratando de entender y estaba trabajando para comprobar las correlaciones a mí mismo. Gracias también por el archivo de python, ya que hace una plantilla fácil para mí adaptar. Espero que después de algún análisis voy a decir gracias por abrir los ojos a lo que es posible
Creación de un asesor experto integrado de MQL5 y Telegram (Parte 1): Envío de mensajes desde MQL5 a Telegram Creación de un asesor experto integrado de MQL5 y Telegram (Parte 1): Envío de mensajes desde MQL5 a Telegram
En este artículo, creamos un Asesor Experto (EA) en MQL5 para enviar mensajes a Telegram usando un bot. Configuramos los parámetros necesarios, incluido el token de API del bot y el ID de chat, y luego realizamos una solicitud HTTP POST para entregar los mensajes. Posteriormente, gestionamos la respuesta para garantizar una entrega exitosa y solucionar cualquier problema que surja en caso de falla. Esto garantiza que enviemos mensajes desde MQL5 a Telegram a través del bot creado.
Implementación de Deus EA: Trading automatizado con RSI y promedios móviles en MQL5 Implementación de Deus EA: Trading automatizado con RSI y promedios móviles en MQL5
Este artículo describe los pasos para implementar Deus EA basado en los indicadores RSI y promedio móvil para guiar el trading automatizado.
Creación de un asesor experto integrado de MQL5 y Telegram (Parte 2): Envío de señales de MQL5 a Telegram Creación de un asesor experto integrado de MQL5 y Telegram (Parte 2): Envío de señales de MQL5 a Telegram
En este artículo, creamos un Asesor Experto integrado con MQL5 y Telegram que envía señales de cruce de medias móviles a Telegram. Detallamos el proceso de generación de señales de trading a partir de cruces de medias móviles, implementando el código necesario en MQL5, y asegurando que la integración funciona a la perfección. El resultado es un sistema que proporciona alertas comerciales en tiempo real directamente a su chat grupal de Telegram.
Características del Wizard MQL5 que debe conocer (Parte 30): Normalización por lotes en el aprendizaje automático Características del Wizard MQL5 que debe conocer (Parte 30): Normalización por lotes en el aprendizaje automático
La normalización por lotes es el preprocesamiento de datos antes de introducirlos en un algoritmo de aprendizaje automático, como una red neuronal. Esto siempre se hace teniendo en cuenta el tipo de activación que utilizará el algoritmo. Por lo tanto, exploramos los diferentes enfoques que se pueden adoptar para aprovechar los beneficios de esto, con la ayuda de un Asesor Experto ensamblado por un asistente.