Siehe den vorherigen Beitrag hier .
Prognose
Schließlich kommen wir zu einer der wichtigsten Anwendungen der linearen Regression: der Vorhersage . Wir haben ein Modell trainiert, um das Gewicht olympischer Schwimmer anhand ihrer Größe, ihres Geschlechts und ihres Geburtsjahres vorherzusagen.
Der 9-fache Schwimm-Olympiasieger Mark Spitz gewann bei den Olympischen Spielen 1972 7 Goldmedaillen. Er wurde 1950 geboren und ist laut Wikipedia-Website 183 cm groß und 73 kg schwer. Mal sehen, was unser Modell in Bezug auf sein Gewicht vorhersagt.
Unser multiples Regressionsmodell erfordert, dass diese Werte in Matrixform bereitgestellt werden. Jeder Parameter muss in der Reihenfolge übergeben werden, in der das Modell die Merkmale gelernt hat, um den richtigen Koeffizienten anzuwenden. Nach der Verzerrung sollte der Merkmalsvektor Größe, Geschlecht und Geburtsjahr in denselben Einheiten enthalten, in denen das Modell trainiert wurde:
Die β- Matrix enthält Koeffizienten für jedes dieser Merkmale:
Die Modellvorhersage ist die Summe der Produkte der Koeffizienten β und der Merkmale x in jeder Zeile:
, β 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 .
, . , r R2 R̅2. , ρ .
, Python. , pandas numpy . β, , . , .