«Se ajusta el modelo sobre
Xey, conXde forma(n, p)eyde forma(n,).»
Traducción íntegra: se entrena el modelo sobre una tabla de variables explicativas de n filas y p columnas, y sobre una columna de n respuestas, correspondiendo la i-ésima respuesta a la i-ésima fila. Esta convención no es estilística: está tipada, y la caja aporta una información sobre la naturaleza matemática del objeto.
| Objeto matemático | Tipografía convencional | Ejemplo | Número de dimensiones |
|---|---|---|---|
| Escalar | Minúscula cursiva, o letra griega | n, p, α | 0 |
| Vector | Minúscula, a menudo negrita | y, x, β | 1 |
| Matriz | Mayúscula | X, A, Σ | 2 |
Esta disciplina de notación, anterior en varias décadas al Machine Learning, se atribuye a Alston Householder (Principles of Numerical Analysis, 1953) y luego fue adoptada por la literatura de álgebra lineal numérica.
Consecuencia directa: X es mayúscula porque es una matriz
(observaciones y variables); y es minúscula porque es un vector
(un valor por observación).
La segunda fuente de la convención es la formulación matricial del modelo lineal, estándar en estadística:
y = X β + ε , con estimador de mínimos cuadrados β̂ = (Xᵀ X)⁻¹ Xᵀ y
Argumento de coherencia dimensional: Xᵀ X solo tiene sentido si X es una
matriz, y Xᵀ y solo si y es un vector de longitud igual al número de filas
de X. La notación condiciona la legibilidad de las fórmulas del dominio.
Definición rigurosa
Sea un conjunto de datos de n observaciones descritas por p variables explicativas. La matriz de las variables explicativas X es el elemento de cuyo término es el valor tomado por la j-ésima variable explicativa en la i-ésima observación. La i-ésima fila de X, denotada , es el vector de características (feature vector) de la observación i. Sinónimos: matriz de diseño (design matrix), matriz de predictores, feature matrix.
Traducción al lenguaje corriente: la tabla de las informaciones proporcionadas al modelo, despojada de la columna a predecir y de las columnas sin rol explicativo.
Punto de vigilancia: X no contiene ni el objetivo, ni los identificadores, ni las columnas de trazabilidad; toda columna conservada será utilizada por el algoritmo, incluido un identificador correlacionado por accidente con el objetivo (capítulos 005 y 028).
Definición rigurosa
El vector objetivo y es el elemento de en regresión, o de en clasificación donde 𝒞 es el conjunto finito de las clases, cuya i-ésima componente es el valor de la variable objetivo observado para la i-ésima observación. La correspondencia es posicional: es la respuesta asociada a la fila de X. Sinónimos: vector respuesta, variable dependiente, target, labels.
Traducción al lenguaje corriente: la columna de las respuestas correctas, en el orden de las filas de la tabla.
Punto de vigilancia: y es un objeto de una dimensión, de forma (n,) y
no (n, 1) — distinción sin efecto en matemáticas, pero real en código
(apartado 2.3).
df = pd.read_csv("transactions.csv")
CIBLE, HORS_MODELE = "statut", ["transaction_id", "date_operation"]
X = df.drop(columns=[CIBLE] + HORS_MODELE)
y = df[CIBLE]Interpretación: X se construye por sustracción, nunca por enumeración de las columnas conservadas; una columna añadida previamente entra por tanto automáticamente en el modelo, lo que impone una revisión explícita del esquema.
Variantes y notación incorrecta: Y mayúscula está justificada para un objetivo
multisalida, de forma (n, t), e incorrecta para un objetivo único. Una parte
de la literatura de redes neuronales sitúa las observaciones en columnas,
con X de forma (p, n): variante coherente internamente, pero incompatible
con la interfaz de scikit-learn, que exige las observaciones en filas.
| Símbolo | Nombre | Equivalente scikit-learn | Lo que cuenta |
|---|---|---|---|
| n | Número de observaciones | n_samples | Las filas de X, la longitud de y |
| p | Número de variables explicativas | n_features | Las columnas de X |
| k | Número de clases | n_classes | Las modalidades distintas de y |
Algunas referencias denotan d el número de variables y m el de observaciones: la letra importa poco, la posición importa, siendo el primer eje el de las observaciones.
La igualdad de las longitudes la verifica automáticamente scikit-learn. La correspondencia fila a fila no es verificable por ninguna biblioteca: es una propiedad del código que produjo X e y.
Recordatorio de vocabulario: la forma (shape) es la tupla de los tamaños de los
ejes. (n,) y (n, 1) contienen el mismo número de valores pero no el mismo
rango — vector por un lado, matriz de una columna por el otro.
print("X :", X.shape)
print("y :", y.shape)
print("y ndim :", y.ndim)
print("longitudes iguales :", X.shape[0] == y.shape[0])X : (120000, 14)
y : (120000,)
y ndim : 1
longitudes iguales : TrueInterpretación: 120 000 observaciones descritas por 14 variables y 120 000
valores objetivo; el rango 1 de y confirma que se trata de un vector. De coste
nulo, la verificación se repite tras cada filtrado.
y_correct = df["statut"] # Series pandas -> forma (120000,) ndim 1
y_faux = df[["statut"]] # DataFrame -> forma (120000, 1) ndim 2Pasado a un estimador, el segundo dispara la advertencia siguiente, que no interrumpe la ejecución y se repite en cada iteración de validación:
DataConversionWarning: A column-vector y was passed when a 1d array was
expected. Please change the shape of y to (n_samples,), for example using
ravel().Corrección: df["statut"] o df[["statut"]].to_numpy().ravel().
El escenario más extendido consiste en filtrar X después de haber extraído y.
X = df.drop(columns=["transaction_id", "date_operation", "statut"])
y = df["statut"]
X = X.dropna() # 2 570 filas retiradas de X, ninguna de y
RandomForestClassifier().fit(X, y)ValueError: Found input variables with inconsistent numbers of samples:
[117430, 120000]Interpretación: el error es benigno porque es ruidoso — el control de coherencia interrumpe la ejecución antes de todo aprendizaje. La forma correcta filtra la tabla fuente antes de la separación.
El caso peligroso es el desalineamiento silencioso: las longitudes se preservan, pero el orden de las filas diverge.
X = df.drop(columns=["transaction_id", "date_operation", "statut"])
X = X.sort_values("montant") # reordenamiento de X solamente
y = df["statut"]
print(X.shape[0] == y.shape[0])
print(cross_val_score(RandomForestClassifier(), X, y, cv=5,
scoring="roc_auc").mean().round(3))True
0.501Interpretación: no se lanza ninguna excepción. Los estimadores convierten los objetos pandas en arrays NumPy e ignoran el índice: la correspondencia se pierde sin señal, y el modelo aprende una asociación entre transacciones y las etiquetas de otras transacciones. Un ROC-AUC de 0,501 en un problema reputado predecible es la firma de un desalineamiento, no la de un mal algoritmo.
Salvaguarda: el índice es entonces el único testigo de la correspondencia —
assert X.index.equals(y.index). Un filtrado lanza una excepción, por lo que sigue siendo
benigno; sort_values(), sample(frac=1) y un reset_index(drop=True)
unilateral son silenciosos, y por tanto críticos.
Label se traduce por etiqueta; los dos términos son equivalentes y coexisten en los medios hispanohablantes, al igual que etiquetar, anotar y el anglicismo labelizar.
Definición rigurosa
Valor de la variable objetivo asociado a una observación en un conjunto de datos de aprendizaje supervisado, tenido por la respuesta de referencia de esa observación. El conjunto ordenado de las etiquetas constituye el vector objetivo y.
Traducción al lenguaje corriente: la respuesta correcta, ya conocida, asociada a una fila de la tabla.
Alcance del término: en sentido estricto, una etiqueta es un valor categórico que nombra la categoría de pertenencia de la observación. En clasificación, una etiqueta es una clase; en regresión, el valor asociado es un valor objetivo numérico y no una etiqueta en sentido estricto, aunque el uso profesional extienda la palabra a ambas situaciones.
Punto de vigilancia: una etiqueta no es una verdad absoluta sino un valor registrado, que puede ser erróneo o reflejar la decisión de un operador falible. La verdad de campo (ground truth), conjunto de los valores de referencia que sirven para juzgar el modelo, no es por tanto la realidad sino su medida disponible: un conjunto de fraude contiene los fraudes detectados, llevando los demás la etiqueta «Normal».
| Criterio | Clasificación | Regresión |
|---|---|---|
| Naturaleza de | Categoría | Número real |
| Término riguroso | Etiqueta de clase (class label) | Valor objetivo, valor respuesta |
| Conjunto de llegada | Conjunto finito 𝒞, de cardinal k | ℝ o un intervalo de ℝ |
| Diferencia entre dos valores | No definida | Definida e interpretable |
| Ejemplo | statut ∈ {Fraude, Normal} | montant_sinistre = 4 380,50 $ |
Punto de vigilancia: la distinción no se lee en el tipo informático
de la columna — un objetivo codificado 0 y 1 es numérico en el sentido de pandas y
categórico en el sentido estadístico. El criterio es la naturaleza del fenómeno
medido (capítulo 010).
Calidad del etiquetado: entre el fenómeno y el valor inscrito en y se interponen una detección y un registro, ambos falibles. Cuando varios operadores anotan las mismas observaciones, su tasa de desacuerdo limita el rendimiento alcanzable; el kappa (Cohen, 1960) mide este acuerdo corrigiendo el efecto del azar.
Definición rigurosa
Modalidad de la variable objetivo de un problema de clasificación. El conjunto de las k clases forma una partición del espacio de las observaciones: toda observación pertenece a una clase y a una sola; las clases son por tanto mutuamente excluyentes y colectivamente exhaustivas.
Traducción al lenguaje corriente: una de las categorías posibles de la respuesta, y una sola por fila.
Cardinal: k = 2 en clasificación binaria, k > 2 en multiclase; la clasificación multietiqueta levanta la hipótesis de exclusividad (capítulo 011).
Punto de vigilancia: una clase es una modalidad del objetivo; las modalidades de una variable explicativa son categorías (capítulo 022).
La mayoría de los estimadores manipulan etiquetas numéricas. La conversión es mecánica, pero conlleva una decisión implícita: qué clase recibe 1.
from sklearn.preprocessing import LabelEncoder
encodeur = LabelEncoder().fit(df["statut"])
print(dict(zip(encodeur.classes_, encodeur.transform(encodeur.classes_)))){'Fraude': 0, 'Normal': 1}Interpretación: LabelEncoder ordena las modalidades por orden
lexicográfico. Al preceder «Fraude» a «Normal» en el alfabeto, el fraude
recibe el código 0 y el comportamiento normal el código 1; al retener las métricas
pos_label=1 por defecto, la clase positiva se convierte en «Normal» — lo contrario de
la intención de negocio, sin ninguna advertencia.
Forma recomendada: explicitar la codificación en lugar de sufrirla.
y = (df["statut"] == "Fraude").astype(int)
print(y.value_counts())statut
0 119652
1 348
Name: count, dtype: int64Interpretación: el código 1 designa el fraude por construcción y no por accidente alfabético, y una línea de código documenta la decisión.
| Convención | Contenido | Contexto |
|---|---|---|
| 0 / 1 | 0 = ausencia del fenómeno, 1 = presencia | Estándar en clasificación binaria |
| Orden lexicográfico | Las modalidades se ordenan y luego se numeran | Comportamiento por defecto de scikit-learn |
classes_ | Atributo que expone el orden retenido por el estimador | A consultar sistemáticamente |
Punto de vigilancia sobre predict_proba: la matriz devuelta comprende una
columna por clase, ordenadas según estimateur.classes_. Con classes_ igual
a [0 1] y 1 designando el fraude, predict_proba(X_test)[:, 1] lleva efectivamente la
probabilidad de fraude; con etiquetas textuales no recodificadas,
llevaría la de ser normal, produciendo un ROC-AUC inferior a 0,5 sin
que se lance ningún error.
Definición rigurosa
En un problema de clasificación binaria, la clase positiva es la modalidad de la variable objetivo designada como evento de interés; sirve de referencia para el cálculo de las cantidades TP, FP, FN y TN y de todas las métricas asimétricas que de ellas derivan, siendo la clase negativa la modalidad complementaria. El vocabulario se toma prestado del diagnóstico médico, donde un test «positivo» señala la presencia de la condición buscada.
Traducción al lenguaje corriente: la clase positiva es lo que se busca detectar.
Punto de vigilancia: «positivo» no es «favorable». En un modelo de cribado, la clase positiva es «afectado»; en un modelo de abandono, «cancela». El término es descriptivo, no evaluativo.
Un paciente cuyo test resulta positivo no ha recibido una buena noticia. El laboratorio no ha expresado un juicio de valor: ha señalado que la sustancia buscada ha sido detectada.
Un test diseñado para detectar una enfermedad está calibrado sobre la enfermedad: nadie pregunta «¿cuál es la sensibilidad de este test para la buena salud?». La clase positiva de un modelo obedece a la misma lógica — es la sustancia buscada.
Los tres criterios convergen casi siempre: lo que la organización busca detectar es también lo que es raro y aquello cuyo olvido cuesta caro. En caso de divergencia, el primero prima, por ser de negocio.
| Caso de uso | Clase positiva | Clase negativa | Acción desencadenada |
|---|---|---|---|
| Detección de fraude | Fraude | Normal | Bloqueo o revisión manual |
| Cribado médico | Afectado | Sano | Examen complementario |
| Abandono de cliente | Cancela | Se queda | Oferta de retención |
| Mantenimiento predictivo | Avería a 30 días | Funcionamiento nominal | Intervención preventiva |
Sea un modelo evaluado sobre 24 000 transacciones de las cuales 70 fraudes, con fraude designado positivo:
| Predicho Normal | Predicho Fraude | |
|---|---|---|
| Real Normal | TN = 23 620 | FP = 310 |
| Real Fraude | FN = 28 | TP = 42 |
for nom, val in [("Accuracy", accuracy_score(y_test, y_pred)),
("Precision fraude", precision_score(y_test, y_pred, pos_label=1)),
("Recall fraude", recall_score(y_test, y_pred, pos_label=1)),
("F1 fraude", f1_score(y_test, y_pred, pos_label=1)),
("F1 normal", f1_score(y_test, y_pred, pos_label=0))]:
print(f"{nom:<17}: {val:.4f}")Accuracy : 0.9859
Precision fraude : 0.1193
Recall fraude : 0.6000
F1 fraude : 0.1990
F1 normal : 0.9929Interpretación: el mismo modelo, sobre las mismas predicciones, muestra un F1-score de 0,199 o de 0,993 según la clase designada positiva: detector mediocre por un lado, sistema excelente en apariencia que deja pasar el 40 % de los fraudes por el otro.
| Métrica | Comportamiento al invertir la clase positiva |
|---|---|
| Accuracy, Balanced Accuracy, Log Loss, coeficiente de Matthews | Invariantes |
| Precision, Recall | Se convierten respectivamente en el valor predictivo negativo y la especificidad de la antigua designación |
| F1-score, PR-AUC | Cambian, radicalmente en caso de desequilibrio |
| ROC-AUC | Sin cambios si la puntuación empleada es la de la nueva clase positiva; se convierte en 1 − AUC en caso contrario |
Estas métricas se definen una a una en los capítulos 052 a 065; lo que debe
adquirirse aquí es su dependencia de la clase de referencia. La designación
gobierna también la lectura de la matriz de confusión, donde el intercambio de roles
transforma un falso negativo en falso positivo (capítulo 052), el sentido de
desplazamiento del umbral (capítulo 062) y la clase que refuerzan class_weight
y el sobremuestreo (capítulo 051).
| Error clásico | Manifestación | Corrección |
|---|---|---|
| Dejar que el orden alfabético decida | «Fraude» codificado 0 por LabelEncoder | Codificar explícitamente la clase de interés en 1 |
| Confundir positivo y favorable | «Cliente fiel» designado positivo en un modelo de abandono | Positivo = evento buscado |
| Designar la clase mayoritaria | Métricas halagadoras e inexplotables | Designar el evento raro a detectar |
Omitir pos_label con etiquetas textuales | ValueError: pos_label=1 is not a valid label | Pasar pos_label="Fraude" o recodificar en 0/1 |
Leer confusion_matrix().ravel() sin verificar el orden | TN, FP, FN, TP intercambiados | Fijar labels= y controlar classes_ |
Recomendación: la designación pertenece al encuadre del problema, al igual que la unidad de análisis: acordada con el negocio, escrita con claridad, materializada por una sola expresión explícita.
Definición rigurosa
La clase mayoritaria es aquella cuya frecuencia es la más alta en el conjunto considerado, la clase minoritaria aquella cuya frecuencia es la más baja; en multiclase, la calificación se extiende por orden decreciente de frecuencias. La prevalencia de la clase positiva es la proporción de observaciones de esa clase, π = n₁ / n; la razón de desequilibrio (imbalance ratio) es el cociente IR = / .
Traducción al lenguaje corriente: la clase más frecuente y la más rara; el porcentaje de casos positivos y el número de negativos por cada positivo.
Punto de vigilancia: estas calificaciones son empíricas; describen la composición de una muestra, no una propiedad del fenómeno. Un conjunto remuestreado puede presentar frecuencias iguales mientras el fenómeno sigue siendo raro en la población, razón por la cual el conjunto de test no debe nunca reequilibrarse (capítulo 051).
Segundo punto de vigilancia: lo que limita el aprendizaje no es solo la razón sino la frecuencia absoluta de la clase minoritaria. Una razón de 100:1 con 5 000 positivos es explotable; la misma razón con 30 positivos no lo es, sea cual sea la técnica empleada.
effectifs = df["statut"].value_counts()
print(effectifs)
print("Prevalencia :", round(effectifs["Fraude"] / effectifs.sum(), 5))
print("Razón de desequilibrio :", round(effectifs.max() / effectifs.min(), 1), ": 1")statut
Normal 119652
Fraude 348
Name: count, dtype: int64
Prevalencia : 0.0029
Razón de desequilibrio : 343.8 : 1Interpretación: la mayoritaria es «Normal» con el 99,71 % de las observaciones, la minoritaria «Fraude» con el 0,29 %, es decir cerca de 344 transacciones normales por cada transacción fraudulenta. La frecuencia absoluta de 348 fraudes es baja: tras una partición 80/20, el test solo contendrá aproximadamente 70, lo que hace inestable toda métrica calculada sobre esta clase e impone una partición estratificada (capítulo 027).
Recomendación: value_counts() sobre el objetivo es el primer comando
ejecutado tras la carga de un conjunto de clasificación; condiciona la
elección de las métricas, la estrategia de partición y el tratamiento del desequilibrio.
Las prevalencias van del 15 % al 30 % en abandono en telecomunicaciones a menos del 0,1 % en
detección de intrusiones: el desequilibrio es la situación normal.
La configuración dominante asocia positiva y minoritaria, pero un control de calidad donde el 92 % de las piezas son conformes y donde se certifica la conformidad designa legítimamente la mayoritaria como positiva. Tras el reequilibrado, la positiva ya no es minoritaria en el train, pero lo sigue siendo en el test.
modele_nul = DummyClassifier(strategy="most_frequent").fit(X_train, y_train)
y_nul = modele_nul.predict(X_test)
print("Accuracy :", round(accuracy_score(y_test, y_nul), 4))
print("Recall fraude :", round(recall_score(y_test, y_nul, pos_label=1), 4))Accuracy : 0.9971
Recall fraude : 0.0Interpretación: un modelo que predice sistemáticamente «Normal» alcanza el 99,71 % de accuracy y no detecta ningún fraude — perfectamente inútil y perfectamente bien puntuado. Es la razón por la cual la accuracy se descarta en cuanto el desequilibrio es marcado. Tal modelo constituye la baseline obligatoria del proyecto: un modelo que no la supera no ha aprendido nada (capítulos 050 y 051).
X.shape[0] == y.shape[0] es una condición necesaria, nunca suficiente: una
ordenación, una mezcla o una reindexación aplicadas a uno solo de los dos objetos
preservan las longitudes y destruyen la correspondencia, en silencio.
Formulación correcta: «El invariante a preservar es la correspondencia posicional: la fila i de X y el valor describen la misma observación. Todo filtrado u ordenación se aplica a la tabla fuente, antes de la separación.»
LabelEncoder ordena las modalidades por orden lexicográfico: con «Fraude» y
«Normal», el fraude recibe el código 0 y las métricas, que retienen
pos_label=1 por defecto, miden entonces la clase «Normal».
Formulación correcta: «La clase positiva se declara explícitamente, por
ejemplo y = (df["statut"] == "Fraude").astype(int), y se verifica leyendo
classes_ tras el ajuste.»
«Positivo» significa «presencia de la condición buscada»: el término es descriptivo y no evaluativo. La clase positiva de un modelo de cribado es «afectado», la de un modelo de abandono «cancela».
Formulación correcta: «La clase positiva es el evento que el modelo tiene por misión detectar, independientemente de su carácter deseable.»
Precision, recall, F1-score y PR-AUC son asimétricas: sobre el mismo modelo, el F1-score vale 0,199 para el fraude y 0,993 para el comportamiento normal.
Formulación correcta: «El F1-score sobre la clase Fraude es de 0,199», y nunca «el F1-score del modelo es de 0,199».
La clase positiva resulta de una decisión metodológica, la clase minoritaria de un conteo; su coincidencia es un hecho empírico. Tras el reequilibrado, la clase positiva ya no es minoritaria en el train pero lo sigue siendo en el test.
Formulación correcta: «La clase positiva se designa, la clase minoritaria se constata.»
NOTACIÓN
X matriz de las variables explicativas forma (n, p) MAYÚSCULA
y vector objetivo forma (n,) minúscula
Origen: tipografía del álgebra lineal
matriz = mayúscula, vector = minúscula, escalar = cursiva
INVARIANTE DE ALINEAMIENTO
Necesario : X.shape[0] == y.shape[0]
Suficiente : la fila i de X e y_i describen la MISMA observación
El desalineamiento silencioso no lanza ninguna excepción.
ETIQUETA Y CLASE
Etiqueta: valor de la variable objetivo para una observación.
clasificación = etiqueta de clase, categórica
regresión = valor objetivo, numérico
Clase: modalidad del objetivo; las clases forman una partición,
excluyentes y exhaustivas.
La verdad de campo es una medida, no la realidad.
CLASE POSITIVA
DESIGNADA, no constatada.
Criterio: el evento que se busca detectar
y que desencadena una acción.
Positivo = presencia del fenómeno, nunca «favorable».
Determina precision, recall, F1, PR-AUC
y la lectura de la matriz de confusión.
CLASE MAYORITARIA / MINORITARIA
CONSTATADAS por conteo: value_counts()
Prevalencia = n_positivos / n Razón = n_maj / n_min
La frecuencia ABSOLUTA de la minoritaria cuenta tanto como la razón.Enunciado de síntesis
Xes mayúscula porque es una matriz de forma (n, p) eyminúscula porque es un vector de forma (n,), siendo su correspondencia posicional y no garantizada por la sola igualdad de sus longitudes; una etiqueta es el valor de la variable objetivo registrado para una observación, una clase es una modalidad de esa variable, y la clase positiva es aquella que la organización busca detectar — designación metodológica, distinta de la constatación de minoría, de la que dependen la matriz de confusión y todas las métricas asimétricas.
Quiz asociados
007.1-quiz-notation-x-y.md007.2-quiz-dimensions-alignement.md007.3-quiz-etiquette-label.md007.4-quiz-classe-encodage.md007.5-quiz-classe-positive.md007.6-quiz-classes-majoritaire-minoritaire.mdCapítulo siguiente: 008-algorithme-vs-modele.md