Я пытаюсь реализовать регрессию OLS с нуля и оцениваю эту модель, используя R2, построенный с нуля.
#Initialize dictionary, append 1's, compute betas.
params = {}
ones = np.ones(shape=y.shape)[..., None]
X = np.concatenate((ones, X), 1)
betas = inv(X.transpose().dot(X)).dot(X.transpose()).dot(y)
#store betas and intercept in a dictionary
params["betas"] = betas[:-1]
params["intercept"] = betas[-1]
#remove intercept from X2 matrix, compute yhat.
X2 = np.delete(X,0, axis=1)
y_hat = X2.dot(betas[:-1])
#Compute R2
errors = y - y_hat
sse = (errors ** 2).sum()
tss = ((y - y.mean()) ** 2).sum()
r2 = 1 - sse / tss
print("r2" , r2)
#output
r2 -2346.8284726742468
Выход R2 не имеет смысла.Вот как это должно выглядеть:
# Using LinearRegression() to compute the regression
reg = LinearRegression()
# Fitting training data
reg = reg.fit(X2, y)
# Calculating RMSER2 Score
r2_score = reg.score(X2, y)
print("r2_Score", r2_score)
#output
r2_Score 0.7406077428649428
Я подозреваю, что моя ошибка может быть в умножении матриц, но я смотрел на это часами и не заметил свою ошибку.Форма выглядит следующим образом:
print("X2",X2.shape)
print("betas",betas[:-1].shape)
print("y_hat",y_hat.shape)
#output
X2 (506, 13)
betas (13,)
y_hat (506,)
Любой совет действительно ценится!