code:
import numpy as np
from sklearn.linear_model import LinearRegression, RidgeCV, LassoCV, ElasticNetCV
from sklearn.preprocessing import PolynomialFeatures
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
import matplotlib as mpl
import warnings
# 计算统计参数TSS RSS R
def xss(y, y_hat):
# y转置
y = y.ravel()
y_hat = y_hat.ravel()
# 都是利用差平方和公式计算
tss = ((y - np.average(y)) ** 2).sum()
rss = ((y_hat - y) ** 2).sum()
ess = ((y_hat - np.average(y)) ** 2).sum()
# 统计学中R参数计算公式
r2 = 1 - rss/tss
print('Rss:', rss)
print('Ess:', ess)
print('Rss + Ess:', rss + ess)
tss_list.append(tss)
rss_list.append(rss)
ess_list.append(ess)
ess_rss_list.append(rss + ess)
# 得到y和y_hat的相关系数
corr_coef = np.corrcoef(y, y_hat)[0, 1]
return r2, corr_coef
if __name__ =='__main__':
warnings.filterwarnings("ignore")
np.random.seed(0)
np.set_printoptions(linewidth=1000)
N = 9
x = np.linspace(0, 6, N) + np.random.randn(N)
x = np.sort(x)
y = x**2 - 4*x - 3 + np.random.randn(N)
x.shape = -1, 1
y.shape = -1, 1
# 构建几个相关的线性模型回归,Ridge,LassoCV以及ElasticNetCV
models = [Pipeline([('poly', PolynomialFeatures()), ('linear', LinearRegression(fit_intercept=False))]),
Pipeline([('poly', PolynomialFeatures()), ('linear', RidgeCV(alphas=np.logspace(-3, 2, 50), fit_intercept=False))]),
Pipeline([('poly', PolynomialFeatures()), ('linear', LassoCV(alphas=np.logspace(-3, 2, 50), fit_intercept=False))]),
Pipeline([('poly', PolynomialFeatures()), ('linear', ElasticNetCV(alphas=np.logspace(-3, 2, 50), l1_ratio=[.1, .5, .7, .9, .95, .99, 1], fit_intercept=False))])
]
np.set_printoptions(suppress=True)
plt.figure(figsize=(15, 15), facecolor='w')
d_pool = np.arange(1, N, 1)
m = d_pool.size
# 存颜色的list
clrs = []
for c in np.linspace(16711680, 255, m):
clrs.append('#%06x' % int(c))
line_width = np.linspace(5, 2, m)
titles = 'linear regression', 'Ridge regression', 'Lasso', 'ElasticNet'
tss_list = []
rss_list = []
ess_list = []
ess_rss_list = []
for t in range(4):
model = models[t]
plt.subplot(2, 2, t+1)
plt.plot(x, y, 'ro', ms=10, zorder=N)
for i, d in enumerate(d_pool):
model.set_params(poly__degree=d)
model.fit(x, y.ravel())
lin = model.get_params('linear')['linear']
output = '%s:%d level, parameters:'%(titles[t], d)
if hasattr(lin, 'alpha_'):
idx = output.find('parameters')
output = output[:idx] + ('alpha = %.6f, ' % lin.alpha_) + output[idx:]
# 这里使用交叉验证,从输入的l1_ratio(list)中选择一个最优的l1_ratio(float)值
if hasattr(lin, 'l1_ratio_'):
idx = output.find('parameters')
output = output[:idx] + ('l1_ratio = %.6f, ' % lin.l1_ratio_) + output[idx:]
print("output:\n", output)
print("lin.coef_.ravel():\n", lin.coef_.ravel())
x_hat = np.linspace(x.min(), x.max(), num=100)
x_hat.shape = -1, 1
y_hat = model.predict(x_hat)
s= model.score(x, y)
r2, corr_coef = xss(y, model.predict(x))
print("R2 and corrlated params:", r2, corr_coef)
print('R2:', s, '\n')
z = N - 1 if (d == 2) else 0
label = '%d level, $R^2 $=%.3f' %(d, s)
if hasattr(lin, 'l1_ratio_'):
label += ', L1 ration=%.2f' % lin.l1_ratio_
plt.plot(x_hat, y_hat, color=clrs[i], lw=line_width[i], alpha=0.75, label=label, zorder=z)
plt.legend(loc='upper left')
plt.grid(True)
plt.title(titles[t], fontsize=18)
plt.xlabel("X", fontsize=15)
plt.ylabel("Y", fontsize=15)
plt.tight_layout(pad=2.5, w_pad=0.5, rect=(0, 0, 1, 0.95))
# plt.tight_layout()
plt.suptitle('multiply curve fitness compare', fontsize=22)
plt.show()
y_max = max(max(tss_list), max(ess_rss_list)) * 1.05
plt.figure(figsize=(15,15), facecolor='w')
t = np.arange(len(tss_list))
plt.plot(t, tss_list, 'ro-', lw=2, label='Tss(Total Sum of Squares)')
plt.plot(t, ess_list, 'mo-', lw=1, label='Ess(Explained Sum of Squares)')
plt.plot(t, rss_list, 'bo-', lw=1, label='Ess(Residual Sum of Squares)')
plt.plot(t, ess_rss_list, 'go-', lw=2, label='ESS + RSS')
plt.ylim((0, y_max))
plt.legend(loc='center right')
plt.xlabel('trial:linear regression/RIdge?Lasso?ElasticNet', fontsize=15)
plt.ylabel('XSS value', fontsize=15)
plt.title('Total Sum Of Tss = ?', fontsize=18)
plt.grid(True)
plt.show()
import numpy as np
from sklearn.linear_