过拟合是指模型能很好地拟合训练的样本,但是对新出现的数据预测的准确性不是很好。
欠拟合是指模型还不能很好的拟合训练当中的样本,当然对于新出现的数据预测的准确性也不好。
下面通过一段python代码对一个函数式子方程进行拟合以说明过拟合、适中、欠拟合的情况。
上图中蓝色部分是用一次函数拟合散点,对于欠拟合的情况;黄色三次函数得到的适当拟合情况;绿色为十次函数得到的过拟合曲线。
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
# 定义一次函数方程拟合
def f_1(x,A,B):
return A*x + B
#定义三次函数拟合
def f_3(x,A,B,C,D):
return A*pow(x,3)+B*pow(x,2)+C*x +D
#定义十次函数拟合
def f_10(x,A,B,C,D,E,F,G,H,I,J,K):
return A*pow(x,10)+B*pow(x,9)+C*pow(x,8) + D*pow(x,7)+E*pow(x,6)+F*pow(x,5)+G*pow(x,4)+H*pow(x,3) + I*pow(x,2)+J*x +K
# 定义生成函数值的方法
def get_prob_xy():
n_dots = 20
x = np.linspace(0,1,n_dots)
y = np.sqrt(x)+0.2*np.random.rand(n_dots) - 0.1
return x,y
# 定义绘图函数
def plot_figure():
plt.figure()
x ,y = get_prob_xy()
plt.scatter(x[:],y[:],s = 15,c = "red")
# 一次函数模拟
A , B = optimize.curve_fit(f_1,x,y)[0]
y_f1 = A*x + B
plt.plot(x,y_f1,"blue")
# 三次函数模拟
A, B, C, D = optimize.curve_fit(f_3,x,y)[0]
y_f3 = A*pow(x,3)+B*pow(x,2)+C*x +D
plt.plot(x, y_f3, "yellow")
# 十次函数模拟
A, B, C, D, E, F, G, H, I, J, K = optimize.curve_fit(f_10,x,y)[0]
y_f10 = A*pow(x,10)+B*pow(x,9)+C*pow(x,8) + D*pow(x,7)+E*pow(x,6)+F*pow(x,5)+G*pow(x,4)+H*pow(x,3) + I*pow(x,2)+J*x +K
plt.plot(x, y_f10, "green")
# 打印显示
plt.show()
plot_figure()
下面说一下,数据集的划分。通常好多地方会将数据集分为训练集和测试集,划分比率有73成,82成。但是也有些地方建议的是将数据集划分为三个部分,分成单位为622,为什么需要三个部分,因为相比于前面的训练集、测试集还多了一个验证集。
为什么需要验证集?这里给出了解释。。。