手写线性回归不会过拟合,即使它应该

问题描述

我正在用梯度下降算法手写一个线性回归,但是我的模型显示出惊人的好结果,即使它应该过拟合。我找不到它不过度拟合的原因,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 (将#修改为@)