por el Prof. Logístico – 30 años haciendo que los datos hablen
$$P(Y=1) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots)}}$$
$$P(Y=k) = \frac{e^{z_k}}{\sum_{j=1}^{K} e^{z_j}}, \quad \text{donde } z_j = \beta_{0j} + \beta_{1j}X_1 + \cdots$$
Odds ratio para interpretar coeficientes: \(OR = e^{\beta_i}\) – “por cada unidad que aumenta \(X_i\), las posibilidades se multiplican por \(e^{\beta_i}\)”.
Ajusta las características de un pasajero y observa la probabilidad de sobrevivir según un modelo logístico entrenado.
Coeficientes ficticios basados en un modelo típico. Solo con fines educativos.
Dataset clásico. Predecimos si un pasajero sobrevivió según clase, sexo, edad...
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns
url = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv'
df = pd.read_csv(url)
df.dropna(subset=['age','embarked'], inplace=True)
df = df[['survived','pclass','sex','age','fare','embarked']]
df = pd.get_dummies(df, columns=['sex','embarked'], drop_first=True)
X = df.drop('survived', axis=1)
y = df['survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
sns.heatmap(confusion_matrix(y_test, y_pred), annot=True, fmt='d')
¿Será admitido un estudiante de posgrado? Basado en su GRE, expediente y rango de la universidad de origen.
url = 'https://stats.idre.ucla.edu/stat/data/binary.csv'
adm = pd.read_csv(url)
adm.rename(columns={'rank':'prestige'}, inplace=True)
adm = pd.get_dummies(adm, columns=['prestige'], drop_first=True)
X = adm.drop('admit', axis=1)
y = adm['admit']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
¿Se irá el cliente de la compañía telefónica? Variables como duración del contrato, cargos mensuales...
url = 'https://raw.githubusercontent.com/IBM/telco-customer-churn-on-icp4d/master/data/Telco-Customer-Churn.csv'
churn = pd.read_csv(url)
churn['TotalCharges'] = pd.to_numeric(churn['TotalCharges'], errors='coerce')
churn.dropna(inplace=True)
churn['Churn'] = churn['Churn'].map({'Yes':1, 'No':0})
features = ['tenure','MonthlyCharges','TotalCharges','Contract','PaymentMethod','InternetService']
churn = pd.get_dummies(churn[features + ['Churn']], drop_first=True)
X = churn.drop('Churn', axis=1)
y = churn['Churn']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
Clasificamos pingüinos Adelie, Chinstrap y Gentoo por tamaño de pico y aletas.
from sklearn.linear_model import LogisticRegression
import seaborn as sns
penguins = sns.load_dataset('penguins').dropna()
X = penguins[['bill_length_mm','bill_depth_mm','flipper_length_mm','body_mass_g']]
y = penguins['species']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
model = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=200)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
# Odds ratios (respecto a Adelie)
import numpy as np
import pandas as pd
odds = np.exp(model.coef_)
pd.DataFrame(odds, columns=X.columns, index=model.classes_)
Dataset UCI: clasifica coches en inaceptable, aceptable, bueno, muy bueno según precio, seguridad...
columnas = ['buying','maint','doors','persons','lug_boot','safety','class']
car = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data',
header=None, names=columnas)
car_dummies = pd.get_dummies(car.drop('class', axis=1), drop_first=True)
y = car['class']
X_train, X_test, y_train, y_test = train_test_split(car_dummies, y, test_size=0.2, stratify=y, random_state=1)
model = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=500)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))