过拟合的现象
下边两张图片分别显示了在linear regression 与 logisctic regression中过拟合的表现
图一: 拟合不够好
图二:刚刚好
图三:过拟合,表现为对已有数据贴合得很好,但是预测能力不好


出现过拟合的原因
1:由于实际应用中变量很多,数据维度大,实际上利用拟合函数可视化来判断过拟合是比较困难的;
2:当模型的数据维度过多,而训练集的数据量很少时,可能就会出现过拟合这个问题。
如何解决过拟合
1: 减少选取变量的数量——选取最重要的参数—缺点:可能丢失一些比较重要的feature
2: 正则化——一种减小参数大小的办法
正则化

代码
依据 下面公式生成数据,并对结果施加一个噪声以模拟真实情况

# 导入相关包
import matplotlib.pyplot as plt
import numpy as np
import sklearn.pipeline as pl
import sklearn.preprocessing as sp
import sklearn.linear_model as lm
# 生成模拟数据
x = np.arange(0,6,0.2).reshape(-1,1)
y = -5*x**2 + x*10 + 1 + (np.random.randn(len(x))*10).reshape(-1,1) # 这里我们使用一个二次函数加上一个噪声模拟训练目标
x = np.delete(x, [2,3,5,8], axis = 0) # 删除其中三个点
y = np.delete(y, [2,3,5,8], axis = 0)
plt.scatter(x, y)
plt.show()


研究feature数(即多项式的最高次方)对上面两种回归器的影响:
1: 设置feature数为2,从下图结果中看出此时linear未正则化与使用正则化差异不大

2:设置feature数为10,可以发现图1出现明显的过拟合化,
但是图二因为使用正则化(一种减小参数大小的办法),减少了过拟合化的现象,



feature数为10, lambda = 1.0

feature数为10, lambda = 100.0,增大lambda的值来提高目标2(避免过拟合)的效果

from ipywidgets import interact, interactive, fixed, interact_manual
import ipywidgets as widgets
# 可以互动的版本,最高次数可调
def get_fited_model(n):
# 岭回归器
lmr = lm.Ridge(alpha=1)
# lmr.set_params(alpha=100.0) #惩罚因子设置越大,则模型的权重向量越接近于零。
lmr.set_params(alpha=1.0) #可以对比惩罚因子1.0 VS 100.0的区别,
# #惩罚因子100.0 在 feature =100时,当前数据中更能够避免过拟合
# #因为惩罚因子100.0 使得模型的权重向量越接近于零。
#线性回归器
lml = lm.LinearRegression()
model_lmr = pl.make_pipeline(
sp.PolynomialFeatures(n), # 多项式特征扩展器
lmr) # 岭回归器
model_lmr.fit(x, y)
model_lml = pl.make_pipeline(
sp.PolynomialFeatures(n), # 多项式特征扩展器
lml) # 线性回归器
model_lml.fit(x, y)
return model_lmr, model_lml
def plot_result(n):
n = int(n)
model_lmr, model_lml = get_fited_model(n)
px = np.arange(0,5.9,0.1).reshape(-1,1)
pred_py_lmr = model_lmr.predict(px)
pred_py_lml = model_lml.predict(px)
# 图1,Linear未正则化结果
plt.subplot(1,2,1)
plt.plot(px, pred_py_lml, c='orangered', label='PolyFit Line')
plt.scatter(x, y)
plt.title("Linear未正则化结果")
# 图2,正则化结果
plt.subplot(1,2,2)
plt.plot(px, pred_py_lmr, c='orangered', label='PolyFit Line')
plt.scatter(x, y)
plt.title("使用正则化")
plot_result(10)
3019



被折叠的 条评论
为什么被折叠?



