!pip install regressors
import pandas as pd
import seaborn as sns
sns.set(style='darkgrid', context='notebook')
df = pd.read_csv('/work/dataset/insurance.csv')
df
df.shape
df.charges.hist(bins=40);
df[df.charges>5E4]
df = df[df.charges<5E4]
# Eliminamos los cargos mayores, el maestro nos aclaro que esto no es
# siempre recomendable sin antes consultar un experto pero por fines didacticos lo hicimos. """
df
df.bmi.hist(bins=40);
df.age.hist(bins=30);
df[df.age<=20]
df.smoker.hist();
df.region.hist();
df.sex.hist();
df.children.hist();
import matplotlib.pyplot as plt
sns.pairplot(df, height=2.5)
plt.show()
import numpy as np
numeric_cols = ['age', 'bmi', 'children', 'charges']
cc = np.corrcoef(df[numeric_cols].values.T)
sns.set(font_scale=1.5)
sns.heatmap(cc, annot=True, yticklabels=numeric_cols, xticklabels=numeric_cols)
df = pd.get_dummies(df, columns=['sex', 'smoker', 'region'], drop_first=True)
df.head()
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split # Esto va a crear un dataset de prueba y otro de modelo
# Definimos las columnas que seran nuestras x y cuales van a ser nuestras variables predictorias.
X_cols = list(set(df.columns)-set(['charges']))
# Quitamos la columnas de charges, una ventaja
# de usar 'set()' es que eliminamos columnas duplicadas
y_col = ['charges']
X = df[X_cols].values
y = df[y_col].values
X_train, X_test, y_train, y_test = train_test_split(X, y)
# Aqui estamos definiendo los valores que van
# a servir para entrenar el modelo y posteriormente, los valores que se usaran para probarlo.
sc_x = StandardScaler().fit(X)
sc_y = StandardScaler().fit(y)
# Normalizamos
X_train = sc_x.transform(X_train)
X_test = sc_x.transform(X_test)
y_train = sc_y.transform(y_train)
y_test = sc_y.transform(y_test)
# Definimos el modelo
model = LinearRegression()
model.fit(X_train, y_train)
# Hacemos una predicción
y_pred = model.predict(X_test)
y_pred.shape # Predijo 333 datos y solo tiene una preddicon sobre ellos por que solo tenemos una avarible predictoria
# Importamos las metricas que necesitamos
import sklearn.metrics as metrics
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
print('r2: ', r2.round(4))
print('mse: ', mse.round(4))
from regressors import stats
# Limpiamos los datos del modelo
# Se necesita que los datos de la pendiente y el intercepto tenga un tipo de forma especifica,
# para que sea mas facil a la libreria analizar los resultados
model.intercept_ = model.intercept_[0] # Solo en el valor
model.coef_ = model.coef_.reshape(-1) # Va permitir que la libreria de stast cuando aplique cuando aplique la funcion que
# necesita aplicar utilice estos coeficientes de la manera en que los necesita
y_test = y_test.reshape(-1) # Hacemos un reshape para que la librería lo pueda leer de la manera adecuada
print(10*"=",'Sumary',10*'=')
stats.summary(model, X_test, y_test, X_cols)
residuals = np.subtract(y_test, y_pred.reshape(-1)) # Al momento de crear esta substraccion numpy esta creando un nuevo,
# arreglo con una dimension diferente, generalmente se arregla haciendo un reshape de una de las variables a -1.
# Ya se habia hecho reshape a y_test, por eso solo lo hacemos sobre y_pred.
plt.scatter(y_pred, residuals)
plt.axhline(y=0, color='r', linestyle='-')
plt.show()
df2 = df.copy()
df2['age^2'] = df2.age**2
df2['sobrepeso'] = (df2.bmi >= 30).astype(int)
df2['sobrepeso*fumador'] = df2.sobrepeso * df2.smoker_yes
# Definimos las columnas que seran nuestras x y cuales van a ser nuestras variables predictorias.
X_cols = list(set(df2.columns)-set(['charges']))
# Quitamos la columnas de charges, una ventaja
# de usar 'set()' es que eliminamos columnas duplicadas
y_col = ['charges']
X = df2[X_cols].values
y = df2[y_col].values
X_train, X_test, y_train, y_test = train_test_split(X, y)
# Aqui estamos definiendo los valores que van
# a servir para entrenar el modelo y posteriormente, los valores que se usaran para probarlo.
sc_x = StandardScaler().fit(X)
sc_y = StandardScaler().fit(y)
# Normalizamos
X_train = sc_x.transform(X_train)
X_test = sc_x.transform(X_test)
y_train = sc_y.transform(y_train)
y_test = sc_y.transform(y_test)
# Definimos el modelo
model = LinearRegression()
model.fit(X_train, y_train)
# Hacemos una predicción
y_pred = model.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
print('r2: ', r2.round(4))
print('mse: ', mse.round(4))
model.intercept_ = model.intercept_[0]
model.coef_ = model.coef_.reshape(-1)
y_test = y_test.reshape(-1)
print(10*"=",'Sumary',10*'=')
stats.summary(model, X_test, y_test, X_cols)
residuals = np.subtract(y_test, y_pred.reshape(-1))
plt.scatter(y_pred, residuals)
plt.axhline(y=0, color='r', linestyle='-')
plt.show()
# Definimos las columnas que seran nuestras x y cuales van a ser nuestras variables predictorias.
X_cols = ['children', 'smoker_yes', 'age^2', 'sobrepeso*fumador']
# Quitamos la columnas de charges, una ventaja
# de usar 'set()' es que eliminamos columnas duplicadas
y_col = ['charges']
X = df2[X_cols].values
y = df2[y_col].values
X_train, X_test, y_train, y_test = train_test_split(X, y)
# Aqui estamos definiendo los valores que van
# a servir para entrenar el modelo y posteriormente, los valores que se usaran para probarlo.
sc_x = StandardScaler().fit(X)
sc_y = StandardScaler().fit(y)
# Normalizamos
X_train = sc_x.transform(X_train)
X_test = sc_x.transform(X_test)
y_train = sc_y.transform(y_train)
y_test = sc_y.transform(y_test)
# Definimos el modelo
model = LinearRegression()
model.fit(X_train, y_train)
# Hacemos una predicción
y_pred = model.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
print('r2: ', r2.round(4))
print('mse: ', mse.round(4))
model.intercept_ = model.intercept_[0]
model.coef_ = model.coef_.reshape(-1)
y_test = y_test.reshape(-1)
print(10*"=",'Sumary',10*'=')
stats.summary(model, X_test, y_test, X_cols)
residuals = np.subtract(y_test, y_pred.reshape(-1))
plt.scatter(y_pred, residuals)
plt.axhline(y=0, color='r', linestyle='-')
plt.show()
# Definimos las columnas que seran nuestras x y cuales van a ser nuestras variables predictorias.
X_cols = ['children', 'smoker_yes', 'age^2', 'sobrepeso*fumador']
# Quitamos la columnas de charges, una ventaja
# de usar 'set()' es que eliminamos columnas duplicadas
y_col = ['charges']
X = df2[X_cols].values
y = df2[y_col].values
X_train, X_test, y_train, y_test = train_test_split(X, y)
# Aqui estamos definiendo los valores que van
# a servir para entrenar el modelo y posteriormente, los valores que se usaran para probarlo.
sc_x = StandardScaler().fit(X)
sc_y = StandardScaler().fit(y)
# Normalizamos
X_train = sc_x.transform(X_train)
X_test = sc_x.transform(X_test)
y_train = sc_y.transform(y_train)
y_test = sc_y.transform(y_test)
# Definimos el modelo
model = LinearRegression(fit_intercept=False)
model.fit(X_train, y_train)
# Hacemos una predicción
y_pred = model.predict(X_test)
mse = metrics.mean_squared_error(y_test, y_pred)
r2 = metrics.r2_score(y_test, y_pred)
print('r2: ', r2.round(4))
print('mse: ', mse.round(4))
model.coef_ = model.coef_.reshape(-1)
y_test = y_test.reshape(-1)
print(10*"=",'Sumary',10*'=')
stats.summary(model, X_test, y_test, X_cols)
residuals = np.subtract(y_test, y_pred.reshape(-1))
plt.scatter(y_pred, residuals)
plt.axhline(y=0, color='r', linestyle='-')
plt.show()