弹性网络正则化(Elastic Net Rerularization)是一种降低回归分析的过拟合风险的方法。弹性网络正则化实际上是LASSO(The Least Shrinkage and Selection)算法和岭回归算法的现象组合。LASSO可以有效约束L1范数或曼哈顿距离。L1范数是指对于两点来说,他们坐标值之差的绝对值之和。岭回归算法用L1范数的平方作为惩罚项。
定义一个ElasticNetCV对象
clf=ElasticNetCV(max_iter=200,cv=10,l1_ratio=.1)
以上代码中的ElasticNetCV类使用了一个l1_ratio的参数,其取值为0-1,若是0,则只是用岭回归算法,若是1,则只使用LASSO算法。这个参数可以是一个单个数值,也可以是以个数值列表。
下面分别使用之前预处理的降雨数据和加利福利亚州的房价数据进行预测分析。
对于降雨数据,其得分为
Scores 0.05276796268304984
发现拟合效果不好,产生了欠拟合现象。从图中也可看出
而对于房价数据有
Scores 0.5606109126805701
完整代码如下
"XU YONG KANG"
from sklearn.linear_model import ElasticNetCV
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
def regress(x,y,title):
clf=ElasticNetCV(max_iter=200,cv=10,l1_ratio=.1)
clf.fit(x,y)
print('Scores',clf.score(x,y))
pred=clf.predict(x)
plt.title('Scatter plot of prediction and '+title)
plt.xlabel('Prediction')
plt.ylabel('Target')
plt.scatter(y,pred,color='red')
plt.plot(y,y,label='Fit')
plt.legend()
plt.grid(True)
plt.show()
rain=.1*np.load('rain.npy')
rain[rain<0]=0.05/2
dates=np.load('doy.npy')
x=np.vstack((dates[:-1],rain[:-1]))
y=rain[1:]
regress(x.T,y,'rain data')
housing = fetch_california_housing()
x=housing.data
y=housing.target
regress(x,y,'California house prices')