<jupyter_start><jupyter_text>Intercambio sesgo-varianza (bias-variance tradeoff) SesgoCuando generamos conclusiones a partir de un modelo ajustado a cierto conjunto de datos podemos encontrarnos en una de dos situaciones. La primera involucra que tratemos de medir o evaluar qué tan bien se ajustan los datos a un modelo teórico previo, este "ajuste de los datos" concretamente se vuelve en qué tan bien los parámetros muestrales que estemos proponiendo se ajustan al parámetro poblacional real. Esta desviación es conocida como sesgo y su definición es la siguiente:$$Sesgo~de~un~estimador~\hat\theta_n: E[\hat\theta_n]-\theta$$en ésta, se tiene que estamos tratando de estimar el valor de un parámetro poblacional $\theta$ a partir de la esperanza de varios parámetros muestrales $\hat\theta$ correspondientes cada una a una muestra particular de tamaño $n$. Esta cantidad surge dentro del enfoque de la estadística inferencial clásica o paramétrica, en donde se tiene una distribución teórica de referencia para los datos y se busca evaluar qué tanto los parámetros estimados se desvían de "los que deberían ser" los valores de los parámetros reales.En un caso ideal lo que pretenderíamos es que el estimador que estamos utilizando tenga un sesgo pequeño o tendiente a cero. Ya que si podemos probar esto teóricamente entonces podemos confiar en que si nuestros datos sí se distribuyen de la manera en que estamos suponiendo encontraremos un buen valor para el estimador del valor real del parámetro poblacional. Riesgo (riesgo cuadrático)Sin embargo, en la práctica el elegir un estimador insesgado (*i.e.* con sesgo 0) no suele garantizar una buena estimación. Por ejemplo, podríamos elegir un valor constante como estimador. Éste ejercicio aunque trivial acarrea como consecuencia que nuestro estimador tenga una varianza de cero, sin embargo su sesgo es tanto como la diferencia entre su valor y el parámetro real $\theta$. Por otra parte podemos elegir a la esperanza del conjunto de datos como estimador y aunque su sesgo tiende a cero, si el tamaño de muestra no es "lo suficientemente grande" o el muestreo no fue "representativo", nos arriesgamos a tener valores de varianza grandes. Es entonces que podemos considerar el riesgo o riesgo cuadrático de un estimador $\hat\theta_n$, como una medida que nos permita cuantificar ambos escenarios.El riesgo cuadrático se define de la siguiente manera:$$Riesgo^2~de~un~estimador~\hat\theta_n: E[(\hat\theta_n-\theta)^2]$$Haciendo un poco de álgebra:$$Riesgo^2=E[(\hat\theta_n-\theta)^2]=E[\hat\theta_n^2]+\theta^2-2E[\hat\theta_n]\theta$$ $$Sesgo^2=(E[\hat\theta_n]-\theta)^2=E[\hat\theta_n]^2+\theta^2-2E[\hat\theta_n]\theta$$$$Varianza=E[\hat\theta_n^2]-E[\hat\theta_n]^2$$$$Riesgo^2=Sesgo^2+Varianza$$**OBSERVACIÓN:** El  $Riesgo^2$  es equivalente a definir el $Error~Cuadrático~Promedio$ $(MSE)$ de un estimador $\hat\theta_n$.Los posibles escenarios pueden ser:![](bias_variance.jpeg)<jupyter_code>import pandas as pd
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import MinMaxScaler
from mlxtend.evaluate import bias_variance_decomp
from sklearn import neighbors
from sklearn.metrics import mean_squared_error 
from math import sqrt
import matplotlib.pyplot as plt
%matplotlib inline
# load dataset
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv'
dataframe = read_csv(url, header=None)
dataframe<jupyter_output><empty_output><jupyter_text>Attribute Information:    1. CRIM      per capita crime rate by town    2. ZN        proportion of residential land zoned for lots over                  25,000 sq.ft.    3. INDUS     proportion of non-retail business acres per town    4. CHAS      Charles River dummy variable (= 1 if tract bounds                  river; 0 otherwise)    5. NOX       nitric oxides concentration (parts per 10 million)    6. RM        average number of rooms per dwelling    7. AGE       proportion of owner-occupied units built prior to 1940    8. DIS       weighted distances to five Boston employment centres    9. RAD       index of accessibility to radial highways    10. TAX      full-value property-tax rate per $10,000    11. PTRATIO  pupil-teacher ratio by town    12. B        1000(Bk - 0.63)^2 where Bk is the proportion of blacks                  by town    13. LSTAT    % lower status of the population    14. MEDV     Median value of owner-occupied homes in $1000's<jupyter_code>### Adjusting linear model
# separate into inputs and outputs
data = dataframe.values
X, y = data[:, :-1], data[:, -1]
# split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
# define the model
model = LinearRegression()
# estimate bias and variance
mse, bias, var = bias_variance_decomp(model, X_train, y_train, X_test, y_test, loss='mse', num_rounds=200, random_seed=1)
# summarize results
print('MSE: %.3f' % mse)
print('Bias: %.3f' % bias)
print('Variance: %.3f' % var)
bias/var
# Adjusting linear model over scaled data
# scaling data
scaler = MinMaxScaler(feature_range=(0, 1))
data_scaled = scaler.fit_transform(dataframe)
data = data_scaled
# separate into inputs and outputs
X, y = data[:, :-1], data[:, -1]
# split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)
# define the model
model = LinearRegression()
# estimate bias and variance
mse, bias, var = bias_variance_decomp(model, X_train, y_train, X_test, y_test, loss='mse', num_rounds=200, random_seed=1)
# summarize results
print('MSE: %.3f' % mse)
print('Bias: %.3f' % bias)
print('Variance: %.3f' % var)
bias/var
# Adjusting k nearest neighbors
rmse_val = [] #to store rmse values for different k
for K in range(20):
    K = K+1
    model = neighbors.KNeighborsRegressor(n_neighbors = K)

    model.fit(X_train, y_train)  #fit the model
    pred=model.predict(X_test) #make prediction on test set
    error = sqrt(mean_squared_error(y_test,pred)) #calculate rmse
    rmse_val.append(error) #store rmse values
    print('RMSE value for k= ' , K , 'is:', error)
# small values, such as k=1, result in a low bias and a high variance, 
# whereas large k values, such as k=21, result in a high bias and a low variance.
model = neighbors.KNeighborsRegressor(n_neighbors = 2)
# estimate bias and variance
mse, bias, var = bias_variance_decomp(model, X_train, y_train, X_test, y_test, loss='mse', num_rounds=200, random_seed=1)
# summarize results
print('MSE: %.3f' % mse)
print('Bias: %.3f' % bias)
print('Variance: %.3f' % var)
bias/var<jupyter_output>MSE: 0.013
Bias: 0.008
Variance: 0.005
{'fraction_non_alphanumeric': 0.0859796285200719, 'fraction_numerical': 0.01812462552426603, 'mean_word_length': 4.6062132661628885, 'pattern_counts': {'":': 0, '<': 8, '<?xml version=': 0, '>': 8, 'https://': 1, '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': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '293279', 'license': 'MIT', 'n_tokens_mistral': 2279, 'n_tokens_neox': 2189, 'n_words': 804, 'path': 'estadistica/bias_variance.ipynb', 'repo_name': 'mentesniker/Notebooks-Ciencia-de-Datos', 'size': '6676'}