def rmse(y_true, y_pred):
return float(np.sqrt(mean_squared_error(y_true, y_pred)))
def ficha(y_true, y_pred, etiqueta):
return {
"conjunto": etiqueta,
"RMSE": round(rmse(y_true, y_pred), 3),
"R2": round(float(r2_score(y_true, y_pred)), 3),
}
def graficar_hist_y(y, titulo):
fig, ax = plt.subplots(figsize=(7.6, 3.8))
ax.hist(y, bins=18, color="C0", alpha=0.85)
ax.axvline(np.mean(y), color="C3", linestyle="--", label=f"media = {np.mean(y):.1f}")
ax.axvline(np.median(y), color="C1", linestyle=":", label=f"mediana = {np.median(y):.1f}")
ax.set_xlabel("puntuación")
ax.set_ylabel("frecuencia")
ax.set_title(titulo)
ax.legend(fontsize=8)
plt.tight_layout()
plt.show()
def graficar_corr(df, titulo):
cols = list(df.columns)
R = df.corr()
fig, ax = plt.subplots(figsize=(6.4, 5.2))
im = ax.imshow(R, vmin=-1, vmax=1, cmap="coolwarm")
ax.set_xticks(range(len(cols)), cols, rotation=35, ha="right", fontsize=8)
ax.set_yticks(range(len(cols)), cols, fontsize=8)
for i in range(len(cols)):
for j in range(len(cols)):
ax.text(j, i, f"{R.iloc[i, j]:.2f}", ha="center", va="center", fontsize=7)
fig.colorbar(im, ax=ax, fraction=0.046)
ax.set_title(titulo)
plt.tight_layout()
plt.show()
def graficar_residuos(yhat, e, titulo):
fig, axes = plt.subplots(1, 2, figsize=(9.0, 3.7))
axes[0].scatter(yhat, e, s=16, alpha=0.7)
axes[0].axhline(0, color="C3", linestyle="--")
axes[0].set_xlabel("ŷ prueba")
axes[0].set_ylabel("residuo")
axes[0].set_title("Residuos vs ajustados (TEST)")
axes[1].scatter(yhat + e, yhat, s=16, alpha=0.7)
lo, hi = (yhat + e).min(), (yhat + e).max()
axes[1].plot([lo, hi], [lo, hi], color="C3", linestyle="--")
axes[1].set_xlabel("y prueba")
axes[1].set_ylabel("ŷ")
axes[1].set_title("Calibración grosera (TEST)")
fig.suptitle(titulo, y=1.02)
plt.tight_layout()
plt.show()