问题描述
我正在用梯度下降算法手写一个线性回归,但是我的模型显示出惊人的好结果,即使它应该过拟合。我找不到它不过度拟合的原因,sklearn 的标准线性回归正是这样做的,另外,在我正在做的练习中,由于这个过度拟合问题,您应该使用 L2 正则化。
我的函数计算梯度(MSE):
def calc_grad(X: np.ndarray,y: np.ndarray,w: np.ndarray) -> np.ndarray:
return (2/y.size)*X.T@(X@w - y)
我的梯度下降函数:
def gradient_descent(w_init: np.ndarray,X: np.ndarray,lr: float,n_iterations: int = 100000) -> List[np.ndarray]:
w_init_copy = w_init.copy()
weights = [w_init_copy]
for j in range(n_iterations):
w_init_copy = w_init_copy - lr*calc_grad(X,y,w_init_copy)
weights.append(w_init_copy)
return weights
我的线性回归:
class MyLinearRegression:
def __init__(self,lr: float = 0.1) -> None:
self.lr = lr
def fit(self,y: np.ndarray) -> 'MyLinearRegression':
X = np.asarray(X)
y = np.asarray(y)
# adding an intercept
X = np.hstack([X,np.ones([X.shape[0],1])])
w_init = np.random.uniform(size=X.shape[-1])
weights = gradient_descent(w_init,X,self.lr,1000)
self.w = weights[-1]
return self
def predict(self,X: np.ndarray) -> np.ndarray:
# adding an intercept
X = np.hstack([X,1])])
return X@self.w
我的模型在测试中显示 R2 得分为 0.91,而标准 sklearn 线性回归显示为 e+23
linear_regression = MyLinearRegression(lr=0.0655)
linear_regression.fit(X_train_final,y_train);
print('train',r2_score(y_train,linear_regression.predict(X_train_final)))
print('test',r2_score(y_test,linear_regression.predict(X_test_final)))
train 0.9610922676932577
test 0.9191438907060603
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(X_train_final,y_train)
print('train',reg.predict(X_train_final)))
print('test',reg.predict(X_test_final)))
train 0.9742523818249926
test -1.5652221878961235e+23
有人可以暗示为什么它不会过度拟合吗? 我知道这段代码在很多方面都不是最优的,我只是想了解过度拟合的问题。
谢谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)