Python, correlação e regressão: parte 4

Veja a postagem anterior aqui .





Predição

Finalmente, chegamos a uma das aplicações mais importantes da regressão linear: previsão . Treinamos um modelo para prever o peso de nadadores olímpicos de acordo com sua altura, sexo e ano de nascimento.





O nove vezes campeão olímpico de natação, Mark Spitz, ganhou 7 medalhas de ouro nas Olimpíadas de 1972. Ele nasceu em 1950 e, de acordo com o site da Wikipedia, tem 183 cm de altura e pesa 73 kg. Vamos ver o que nosso modelo prevê em termos de peso.





Nosso modelo de regressão múltipla requer que esses valores sejam fornecidos em forma de matriz. Cada parâmetro deve ser passado na ordem em que o modelo aprendeu os recursos para aplicar o coeficiente correto. Após o viés, o vetor de característica deve conter altura, sexo e ano de nascimento nas mesmas unidades em que o modelo foi treinado:





A matriz β  contém coeficientes para cada um desses recursos:





A previsão do modelo será a soma dos produtos dos coeficientes β  e características x  em cada linha:





, β  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