2.7.2
Boruta
- Boruta compara la importancia de cada variable real con variables sombra aleatorias para decidir si una característica aporta señal real.
- El método envuelve un modelo base (normalmente Random Forest) y repite pruebas hasta confirmar, rechazar o mantener variables tentativas.
- Es útil cuando se prioriza no perder variables relevantes, aunque el costo computacional aumenta frente a filtros simples.
- Conviene validar el subconjunto resultante con métricas del modelo final para comprobar que la selección mejora generalización.
Intuicion #
La idea central de Boruta es preguntarse: “¿esta variable es mejor que ruido aleatorio?”. Para ello crea copias permutadas (shadow features), entrena un bosque y compara importancias. Si una variable real no supera de forma consistente a las sombras, no aporta información estable y puede descartarse.
Explicacion Detallada #
Boruta #
Vamos a seleccionar características utilizando Boruta. El código en este bloque es un ejemplo directo del uso de Boruta.
Referencia:Kursa, Miron B., and Witold R. Rudnicki. "Feature selection with the Boruta package." Journal of statistical software 36 (2010): 1-13.
| |
| |
Iteration: 1 / 100
Confirmed: 0
Tentative: 10
Rejected: 0
Iteration: 2 / 100
Confirmed: 0
Tentative: 10
Rejected: 0
Iteration: 3 / 100
Confirmed: 0
Tentative: 10
BorutaPy finished running.
Iteration: 9 / 100
Confirmed: 5
Tentative: 0
Rejected: 5
Experimentos con Datos Artificiales #
| |
No se elimina ninguna característica si todas son necesarias #
| |
Iteration: 1 / 100
Confirmed: 0
Tentative: 10
Rejected: 0
Iteration: 2 / 100
Confirmed: 0
Tentative: 10
Rejected: 0
Iteration: 3 / 100
Confirmed: 0
Tentative: 10
Rejected: 0
Iteration: 4 / 100
Confirmed: 0
Tentative: 10
Rejected: 0
Iteration: 5 / 100
Confirmed: 0
Tentative: 10
Rejected: 0
Iteration: 6 / 100
Confirmed: 0
Tentative: 10
Rejected: 0
Iteration: 7 / 100
Confirmed: 0
Tentative: 10
Rejected: 0
Iteration: 8 / 100
Confirmed: 10
Tentative: 0
Rejected: 0
BorutaPy finished running.
Iteration: 9 / 100
Confirmed: 10
Tentative: 0
Rejected: 0
不用な特徴は見つかりませんでした
array([[ 0.38760058, -0.4398061 , 1.0103586 , ..., -2.11674403,
-3.59368321, -0.43265007],
[-2.18745511, -2.45701675, 1.99758878, ..., 1.16128752,
-1.92766999, 3.18705784],
[ 3.98304273, 0.06250274, -1.31136045, ..., 1.45498409,
-4.17178063, -2.21695578],
...,
[-0.44293666, 3.25707522, -0.50633794, ..., -0.72410483,
-1.5420989 , 0.75991518],
[-1.12641706, -0.48636924, 0.92918889, ..., -1.01001779,
-2.69280573, -3.47050681],
[-2.3936814 , 1.44048113, 1.95832126, ..., -5.15104933,
-1.02766442, 1.4853396 ]])
Se eliminan las características innecesarias #
Crearemos un conjunto de datos con 100 características, de las cuales solo 10 son útiles, para observar cuántas características innecesarias pueden ser eliminadas.
La documentación de sklearn.datasets.make_classification especifica:
Sin mezclar, las características en
Xse apilan horizontalmente en el siguiente orden: lasn_informativecaracterísticas principales, seguidas porn_redundantcombinaciones lineales de las características informativas, seguidas porn_repeatedduplicados, seleccionados al azar con reemplazo de las características informativas y redundantes. Las características restantes se rellenan con ruido aleatorio. Por lo tanto, sin mezclar, todas las características útiles están contenidas en las columnasX[:, :n_informative + n_redundant + n_repeated].
Por lo tanto, verificaremos que las primeras 10 columnas, que corresponden a las características útiles, no sean eliminadas durante el proceso.
| |
Iteration: 1 / 100
Confirmed: 0
Tentative: 100
Rejected: 0
Iteration: 2 / 100
…
BorutaPy finished running.
Iteration: 100 / 100
Confirmed: 10
Tentative: 1
Rejected: 88
不用な特徴を削除しました
100 --> 10
Verificar que las características útiles permanecen en los datos después del filtrado #
Si el filtrado funciona como se espera, las primeras 10 columnas, que corresponden a características útiles, deberían permanecer intactas en los datos procesados.
| |
array([[ True, True, True, ..., True, True, True],
[ True, True, True, ..., True, True, True],
[ True, True, True, ..., True, True, True],
...,
[ True, True, True, ..., True, True, True],
[ True, True, True, ..., True, True, True],
[ True, True, True, ..., True, True, True]])