Python3入门机器学习 - 模型泛化

模型正则化


在多项式回归中如果degree过大,会造成过拟合的情况,导致模型预测方差极大,因此,我们可以使用模型正则化的方式来减小过拟合导致的预测方差极大的问题


Python3入门机器学习 - 模型泛化
Python3入门机器学习 - 模型泛化

即在我们训练模型时,不仅仅需要将预测的y和训练集的y的均方误差达到最小,还要使参数向量最小。(即上图公式。)

使用岭回归达到最小方差


from sklearn.linear_model import Ridge

def RidgeRegression(degree,alpha):
    return Pipeline([
        ("poly",PolynomialFeatures(degree=degree)),
        ("scaler",StandardScaler()),
        ("ridge",Ridge(alpha=alpha))
    ])

ridge_reg = RidgeRegression(20,0.01)

ridge_reg.fit(X_train,y_train)
mean_squared_error(ridge_reg.predict(X_test),y_test)   #在degree=20的过拟合情况下,本来达到170的方差在模型正则化之后仅有一点几。

模型正则化的参数alpha即为公式中的α,即α越大,就代表训练过程中模型系数影响程度越大

使用Lasso回归达到最小方差


from sklearn.linear_model import Lasso

def RidgeRegression(degree,alpha):
    return Pipeline([
        ("poly",PolynomialFeatures(degree=degree)),
        ("scaler",StandardScaler()),
        ("ridge",Lasso(alpha=alpha))
    ])

ridge_reg = RidgeRegression(20,0.1)

ridge_reg.fit(X_train,y_train)
mean_squared_error(ridge_reg.predict(X_test),y_test) 
Python3入门机器学习 - 模型泛化
image.png

Python3入门机器学习 - 模型泛化




Lasso与Ridge对比

如上图可见,Ridge在a很大时,所得预测曲线依然是曲线,但Lasso在a较大时,更倾向于变为一条直线,如果用梯度下降法的思想来考虑,这是因为在计算更优解时,Ridge的theta的斜率向量会让theta一直以一个比较平缓的梯度下降,然而Lasso的斜率向量则不然。而Lasso的这种特性会让更多的特征值的系数theta变为0,因此我们可以使用Lasso来进行特征值的过滤,即变为0的特征值是对模型影响较小的特征值。

上一篇:单因子探索分析


下一篇:多因子探索分析