<jupyter_start><jupyter_text>Modelos de Regresión Lineal  Modelo con datos simulados* y = a + b * x* X : 100 valores con distribución N(1.5, 2.5)* Ye = 3 + 1.5 * x + e * e estará distribuida de forma N(0,0.8)<jupyter_code>import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
x = 1.5 + 2.5 * np.random.rand(100)
error = 0 + 0.4 * np.random.randn(100)
y_esperada = 3 + 1.5 * x
y_actual = 3 + 1.5 * x + error
x_list = x.tolist()
y_esp_list = y_esperada.tolist()
y_actual_list = y_actual.tolist()
data = pd.DataFrame(
    {
        "x": x_list, 
        "y_actual": y_actual_list, 
        "y_esperada": y_esp_list
    }

)
data.head()
# podemos hallar la media también para dibujarla de la siguiente manera: 
y_mean = [np.mean(y_actual) for i in range(1, len(x_list)+1)]
%matplotlib inline
plt.plot(data["x"], data["y_esperada"])
plt.plot(data["x"], data["y_actual"], "ro")
plt.plot(data["x"], y_mean, "g")
plt.title("Valor actual versus esperado")<jupyter_output><empty_output><jupyter_text>¿Cómo es la predicción de buena?* SST = SSD + SSR* SST : Variabilidad de los datos con respecto a su media* SSD : Diferencia entre los datos originales y las predicciones que el modelo no es capaz de explicar (errores que deberían seguir una distribución normal)* SSR : Diferencia entre la regresión y el valor medio que el modelo busca explicar. * R²= SSR / SST : Coeficiente de determinación, entre 0 y 1. Entre más cerca al 1, mejor!<jupyter_code># vamos a realizar los calculos de SSR, SST, y SSD que son las sumas de los cuadrados para validar el error:
data["SSR"] = (data["y_esperada"]-np.mean(y_actual))**2
data["SSD"] = (data["y_esperada"] - data["y_actual"])**2
data["SST"] = (data["y_actual"]-np.mean(y_actual))**2
data.head()
SSR = sum(data["SSR"])
SSD = sum(data["SSD"])
SST = sum(data["SST"])
SSR
SSD
SST
## Hacemos uno de los criterios de validación del modelo que es R2. 
R2 = SSR/SST
R2
plt.hist((data["y_esperada"] - data["y_actual"]))<jupyter_output><empty_output><jupyter_text>Obteniendo la recta de la regresión* y = a + b * x_m* b = sum((xi-x_m)*(yi-y_m)/(xi-x_m)²)* a = y_m - b * x_m<jupyter_code>x_mean = np.mean(data["x"])
y_mean = np.mean(data["y_actual"])
x_mean, y_mean
data["beta_num"] = (data["x"]-x_mean)*(data["y_actual"]-y_mean)
data["beta_den"] = (data["x"]-x_mean)**2
beta =  sum(data["beta_num"])/sum(data["beta_den"])
alpha = y_mean - beta * x_mean
alpha, beta<jupyter_output><empty_output><jupyter_text>El modelo lineal obtenido por regresión es:     Y = 2.8411335095712067 + 1.5480944165530774 * X<jupyter_code>data["y_model"] = alpha + beta*data["x"]
data.head()
# vamos a realizar los calculos de SSR, SST, y SSD que son las sumas de los cuadrados para validar el error:SSR_mode =  (data["y_esperada"]-np.mean(y_actual))**2
SSR_m = sum((data["y_model"]-y_mean)**2)
SSD_m = sum((data["y_model"] - data["y_actual"])**2)
SST_m = sum((data["y_actual"]-np.mean(y_actual))**2)
SSR_m, SSD_m, SST_m
## Hacemos uno de los criterios de validación del modelo que es R2. 
R2 = SSR_m/SST_m
R2
y_mean = [np.mean(y_actual) for i in range(1, len(x_list)+1)]
%matplotlib inline
plt.plot(data["x"], data["y_esperada"])
plt.plot(data["x"], data["y_actual"], "ro")
plt.plot(data["x"], y_mean, "g")
plt.plot(data["x"], data["y_model"], "y")
plt.title("Valor actual versus esperado")<jupyter_output><empty_output><jupyter_text>Error estándar de los residuos (RSE) Entre menor sea este valor, mucho mejor es el modelo.* Se compara este valor con el promedio de los valores actuales, es la mejor forma.     * si decidimos hacerlo así, para calcular el error en porcentaje se dividie RSE/promedio_modelo<jupyter_code>RSE = np.sqrt((SSD_m)/(len(data)-2))
RSE
media_modelo = np.mean(data["y_actual"])
RSE/media_modelo   # lo que da un 5,87 % de error<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15416995527492766, 'fraction_numerical': 0.02394106813996317, 'mean_word_length': 5.222585924713584, 'pattern_counts': {'":': 3, '<': 21, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '339607', 'license': 'MIT', 'n_tokens_mistral': 1610, 'n_tokens_neox': 1539, 'n_words': 403, 'path': 'notebooks/T4 - 1 - Linear Regression - Datos ficticios.ipynb', 'repo_name': 'Andhurt/Machine_Learning_Py', 'size': '3801'}