[机器学习-5]岭回归[L2正则化]及python实现(Ridge Regression)【L2】
前言
!!实现直接跳转实现
这章本来是为了接前面的过拟合(overfit)的,结果到现在过拟合还没水出来,所以就先写这一篇啦。
首先简单地提一下过拟合,所谓过拟合,可以理解为过度地取悦我们所用的数据,结果就是训练出来的模型,在我们的训练集(training set)上表现完美,结果在泛化上直接拉跨。原因是我们训练集内部可能有一些结构性的特点,而我们在训练的时候把它们考虑进来了。
下面的几个例子都可以很清楚地看到过拟合的现象出现
题目
今天我在做老师的题目的时候,遇到了这道题
简单来说,就是我们要训练一个模型来预测一个城市的犯罪率,我们先看老师给的README文件
我们的训练集中的第一列为犯罪率,后面为各种因素(比如失业率等等)也就是所谓的feature,使用训练集中的数据后,我们要在测试集上测试我们所训练出来的模型
岭回归(Ridge Regression)
众所周知,L1(LASSO)和L2(Ridge)都是我们用来防止出现过拟合的方法.
对于下面这么一个问题,我们怎么解决呢?我们知道我们的目标函数与限制即参数矩阵的二范数,结合起来,我们要求满足条件的最小参数矩阵。
我们可以通过添加惩罚来讲两者联系起来,这样一来,显然参数矩阵的二范数就不能过大了,因为它越大,惩罚越重。参数lambda与C显然存在具体关系(虽然我们不知道),这样我们就将选C,改变成了选lambda了
不同的L2正则化
k-fold validation
既然题目要求,那么我就来提一嘴吧
所谓k-fold validation就是将数据分成K份,分别将第i(i=1,…,K)份作为验证集(validation set),其余作为训练集,训练出来后在验证机上测试performance
最终通过测试选取一个拥有最小MSE的模型。需要注意与测试集的区别
sklearn ridge
这里我用到了sklearn自带的岭回归函数,它有一些自带的属性与方法
(1)实现(realization)
import pandas as pd
import numpy as np
from matplotlib import pyplot
from sklearn import linear_model
import matplotlib.pyplot as plt
import math
from sklearn.metrics import mean_squared_error
from sklearn.base import clone
def E_in(theta,phi,y):
result = 0.5*np.linalg.norm(np.dot(theta,phi)-y)
return result
def E_aug(lambda_1, y, X, w):
result = 0.5*np.linalg.norm(np.dot(w,X)-y)+lambda_1*np.linalg.norm(X)
return result
if __name__ == '__main__':
df_train = pd.read_table("crime-train.txt")
df_test = pd.read_table("crime-test.txt")
column = df_train.shape[1] #96
row = df_train.shape[0] #1595
MSE_SET =[]
C_SET = []
MSE_min = 0
Y_train = df_train['ViolentCrimesPerPop'] # Y (2)
buffer_train = df_train.copy