Python, korelasi dan regresi: bagian 4

Lihat postingan sebelumnya di sini .





Ramalan

Akhirnya, kita sampai pada salah satu aplikasi terpenting dari regresi linier: prediksi . Kami melatih model untuk memprediksi berat badan perenang Olimpiade berdasarkan tinggi badan, jenis kelamin, dan tahun lahir.





Juara renang Olimpiade 9 kali Mark Spitz memenangkan 7 medali emas di Olimpiade 1972. Ia lahir pada tahun 1950 dan, menurut situs Wikipedia, memiliki tinggi 183 cm dan berat 73 kg. Mari kita lihat apa yang model kita prediksi dalam hal bobotnya.





Model regresi berganda kami mengharuskan nilai-nilai ini disediakan dalam bentuk matriks. Setiap parameter harus diteruskan dalam urutan model mempelajari fitur untuk menerapkan koefisien yang benar. Setelah bias, vektor fitur harus berisi tinggi, jenis kelamin, dan tahun lahir dalam unit yang sama tempat model dilatih:





Matriks β  berisi koefisien untuk masing-masing fitur berikut:





Prediksi model akan menjadi penjumlahan produk dari koefisien β  dan fitur x  di setiap baris:





, β  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Ė‚  , , Îŧ. , , y  .





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





. , :





yĖ‚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  RĖ…2. , ΁ .





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








All Articles