
Aprendizaje automático y Data Science (Parte 29): Consejos esenciales para seleccionar los mejores datos de divisas para el entrenamiento de IA
Contenido
- Introducción
- ¿Qué es la selección de características?
- ¿Por qué la selección de características es necesaria para los modelos de IA??
- Métodos de filtrado
Matriz de correlación
Pruebas estadísticas
—Prueba de chi-cuadrado
—Prueba ANOVA - Métodos de envoltura
Eliminación recursiva de características (Recursive Feature Elimination, RFE)
Selección de características secuenciales (Sequential Features Selection, SFS) - Métodos integrados
Regresión de Lasso
Métodos basados en árboles de decisión - Técnicas de reducción de dimensionalidad
- Conclusión
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.
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.
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 Pythonfrom 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
- 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.
- 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.
- 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.
- 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:
- Entrenamiento de un modelo de aprendizaje automático
- Derivación de la importancia de las características
- Selección de las variables predictoras de mayor rango
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.
- 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.
- 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))
- 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.
- 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
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
- Método de selección de características basado en la estadística chi-cuadrado para la clasificación de textos (https://www.researchgate.net/publication/331850396_A_Chi-Square_Statistics_Based_Feature_Selection_Method_in_Text_Classification)
- Selección de variable (Wikipedia)
- Métodos integrados (https://www.blog.trainindata.com/feature-selection-with-embedded-methods/)
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/articles/15482
Advertencia: todos los derechos de estos materiales pertenecen a MetaQuotes Ltd. Queda totalmente prohibido el copiado total o parcial.
Este artículo ha sido escrito por un usuario del sitio web y refleja su punto de vista personal. MetaQuotes Ltd. no se responsabiliza de la exactitud de la información ofrecida, ni de las posibles consecuencias del uso de las soluciones, estrategias o recomendaciones descritas.






- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso