Python, correlación y regresión: parte 4

Vea la publicación anterior aquí .





Predicción

Finalmente, llegamos a una de las aplicaciones más importantes de la regresión lineal: la predicción . Entrenamos un modelo para predecir el peso de los nadadores olímpicos dada su altura, sexo y año de nacimiento.





El nueve veces campeón olímpico de natación Mark Spitz ganó 7 medallas de oro en los Juegos Olímpicos de 1972. Nació en 1950 y, según el sitio web de Wikipedia, mide 183 cm de altura y pesa 73 kg. Veamos qué predice nuestro modelo en términos de su peso.





Nuestro modelo de regresión múltiple requiere que estos valores se proporcionen en forma de matriz. Cada parámetro debe pasarse en el orden en que el modelo aprendió las características para aplicar el coeficiente correcto. Después del sesgo, el vector de características debe contener la altura, el sexo y el año de nacimiento en las mismas unidades en las que se entrenó el modelo:





La matriz β  contiene coeficientes para cada una de estas características:





La predicción del modelo será la suma de los productos de los coeficientes β  y las características x  en cada fila:





, β  xspitz.





, :





βTx — 1 × n  n × 1. 1 × 1:





 





:





def predict(coefs, x): 
    ''' '''
    return np.matmul(coefs, x.values) 
      
      



def ex_3_29():
    '''   '''
    df = swimmer_data()
    df['_'] = df[''].map({'': 1, '': 0}).astype(int) 
    df[' '] = df[' '].map(str_to_year)
    X = df[[', ', '_', ' ']] 
    X.insert(0, '', 1.0)
    y = df[''].apply(np.log) 
    beta = linear_model(X, y)
    xspitz = pd.Series([1.0, 183, 1, 1950]) #   
    return np.exp( predict(beta, xspitz) )  
      
      



84.20713139038605
      
      



84.21, 84.21 . 73 . , , .





. , , . , , .   , , μ. , , y  .





, , , . 95%- – , 95% . , 95%- – , 95%- .





. , :





p — , . t-, n - p, .. . , F-. , , , , , 95%- .





def prediction_interval(x, y, xp):
    '''  '''
    xtx    = np.matmul(x.T, np.asarray(x))
    xtxi   = np.linalg.inv(xtx)  
    xty    = np.matmul(x.T, np.asarray(y)) 
    coefs  = linear_model(x, y) 
    fitted = np.matmul(x, coefs)
    resid  = y - fitted
    rss    = resid.dot(resid)  
    n      = y.shape[0]  # 
    p      = x.shape[1]  # 
    dfe    = n - p 
    mse    = rss / dfe
    se_y   = np.matmul(np.matmul(xp.T, xtxi), xp)
    t_stat = np.sqrt(mse * (1 + se_y))         # t-
    intl   = stats.t.ppf(0.975, dfe) * t_stat   
    yp     = np.matmul(coefs.T, xp)
    return np.array([yp - intl, yp + intl])
      
      



t- , .





, se_y



t- t_stat



.





, , :





5 , 95%- . , :





def ex_3_30():
    ''' 
            '''
    df = swimmer_data()
    df['_'] = df[''].map({'': 1, '': 0}).astype(int) 
    df[' '] = df[' '].map(str_to_year)
    X = df[[', ', '_', ' ']] 
    X.insert(0, '', 1.0)
    y = df[''].apply(np.log) 
    xspitz = pd.Series([1.0, 183, 1, 1950])  #  .
    return np.exp( prediction_interval(X, y, xspitz) )
      
      



array([72.74964444, 97.46908087])
      
      



72.7 97.4 ., 73 ., 95%- . .





1950 ., 2012 . , , , . .





, . , , . , , . 1979 ., .





, 1972 . 22- 185 . 79 .





— .





, , .





R2, , . , .. , , , - .





β  :





1972 . :





:





def ex_3_32():
    '''    
        '''
    df = swimmer_data()
    df['_'] = df[''].map({'': 1, '': 0}).astype(int) 
    X = df[[', ', '_', '']] 
    X.insert(0, '', 1.0)
    y = df[''].apply(np.log) 

    beta = linear_model(X, y)
    #    
    xspitz = pd.Series([1.0, 185, 1, 22]) 
    return np.exp( predict(beta, xspitz) )
      
      



78.46882772630318
      
      



78.47, .. 78.47 . , 79 .





   Github.    . 





, . , R2  2. , ρ .





, Python. , pandas numpy . β, , . , .








All Articles