(深度好文)欠拟合与过拟合解释实例--多项式拟合

欠拟合与过拟合解释实例–多项式拟合

目录:

1.导入必要的模块

2.生成数据

2.1构建数据生成函数
2.2生成训练集
2.3生成测试集

3.多项式模型拟合

3.1构建多项式特征模型训练函数
3.2一阶多线性拟合
3.3三阶多项式模型拟合
3.4十阶多项式模型拟合
3.5三十阶多项式模型拟合
3.6指标对比

4.测试集检验

4.1多项式特征模型预测函数
4.2一阶线性模型预测
4.3三阶多项式模型预测
4.4十阶多项式模型预测
4.5三十阶多项式模型预测
4.6指标对比

5.欠拟合和过拟合总结

正文内容:

1.导入必要的模块

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

2.生成数据

2.1构建数据生成函数
def data_generator(samples,random_seed=0):
	np.random.seed(random_seed)# 设置随机种子
	X=np.random.uniform(-5,5,size=samples)# 从-5到5中随机抽取100个实数
	y_real=0.5*X**3+X**2+2*X+1 #生成y的真实值
	err=np.random.normal(0,5,size=samples) #生成正态分布(均值为0,标准差为5的误差值)
	y=y_real+err #y真实值加上误差值,得到样本的y值
	return X,y,y_real
2.2生成训练集
X_train,y_train,y_train_real=data_generator(
	samples=100,random_seed=34)
# 画出训练集数据的散点图
plt.scatter(
	X_train,y_train,maker='o',
	color='g',label='train dataset')
# 画出实际函数曲线
plt.plot(np.sort(X_train),y_train_real[np.argsort(X_train)],color='b',label='real_curve')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

训练集数据散点图和实际曲线

2.3生成测试集
X_test,y_test,y_test_real=data_generator(
	samples=100,random_seed=12)
# 画出测试集数据的散点图
plt.scatter(
	X_test,y_test,color='c',label='test dataset')
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.show()

测试集数据散点图

3.多项式模型拟合

  • 创建多项式特征 sklearn.preprocessing.PolynomialFeatures
  • 用到的参数:
    —degree:设置多项式特征的阶数,默认2。
    —include_bias:是否包含偏置项,默认true。
  • 使用fit_transform函数对数据做处理。
  • 特征标准化 sklearn.preprocessing.StandarScaler(减去均值再除以标准差)
  • 使用fit_transform函数对数据做处理。
3.1构建多项式特征模型训练函数
from sklearn.preprocessing import StandarScaler
from sklearn.preprocessind import PolynomialFeatures
from sklearn.linear_model import LinearRegression
def poly_fit_train(degree,X,y,y_real,model=None):
	# 如果degree不是整数就报错
	if not isinstance(degree,int):
		raise ValueError('degree should be interger.')
	# 如果degree不大于0就报错
	if degree <=0:
		raise Valuation('gegree should be greater than 	0.')
	# 为了满足model.fit函数的输入要求,将特征数据从一维变成二维,即从(samples,)变成(samples,1)
	X_2D=X.reshape(-1,1)
	# 如果degree大于1,生成多项式数据
	if degree >1:
		poly=PolynomialFeatures(degree,include_bias=False)
		X_2D=poly.fit_transform(X_2D)
		# 数据标准化(减均值除标准差)
		scaler=StandarScaler()
		X_2D=scaler.fit_transform(X_2D)
	if model==None:
		model=LinearRegression()
	#创建并训练线性回归模型
	model.fit(X_2D,y)
	# 模型预测
	y_pred=model.predict(X_2D)
	# 画出样本的散点图
	plt.scatter(X,y,marker='o',color='g',label='train dataset')
	# 画出实际函数曲线
	plt.plot(np.sort(X),y_real[np.argsort(X)],color='b',label='real curve')
	# 画出预测函数曲线
	plt.plot(np.sort(X),y_pred[np.argsort(X)],color='r',label='predict curve')
	plt.legend()
	plt.xlabel('x')
	plt.ylabel('y')
	plt.show()
	return y_pred,model
3.2一阶线性模型拟合
y_train_pred1,reg1=poly_fit_train(degree=1,X=X_train,y=y_train,y_real=y_train_real)

一阶线性拟合

3.3三阶多项式模型拟合
y_train_pred3,reg3=poly_fit_train(
	degree=3,X=X_train,y=y_train,y_real=y_train_real)

三阶模型拟合

3.4十阶多项式模型拟合
y_train_pred10,reg10=poly_fit_train(
	degree=10,X=X_train,y=y_train,y_real=y_train_real)

十阶模型拟合

3.5三十阶多项式模型拟合
y_train_pred30,reg30=poly_fit_train(
	degree=30,X=X_train,y=y_train,y_real=y_train_real)

在这里插入图片描述

3.6指标对比
from sklearn.metrics import mean_squared.error
# 计算MSE
mse_train1=mean_squared.error(y_train_pred1,y_train)
mse_train3=mean_squared.error(y_train_pred3,y_train)
mse_train10=mean_squared.error(y_train_pred10,y_train)
mse_train30=mean_squared.error(y_train_pred30,y_train)
# 打印结果
print('MSE:')
print('1 order polynomial:{:.2f}'.format(mse_train1))
print('3 order polynomial:{:.2f}'.format(mse_train3))
print('10 order polynomial:{:.2f}'.format(mse_train10))
print('30 order polynomial:{:.2f}'.format(mse_train30))
# 输出结果
MSE:
1 order polynomial:149.92
3 order polynomial:24.32
10 order polynomial:23.64
30 order polynomial:15.05
  • 指标说明:
  • 训练集MSE指标从好到坏的模型是:30阶多项式、10阶多项式、3阶多项式、1阶多项式

4.测试集检验

4.1多项式特征模型预测函数
def poly_fit_predict(degree,X,y,model):
	#如果degree不是整数就报错
	if not isinstance(degree,int):
		raise ValueError('degree should be interger.')
	#如果degree不大于0就报错
	if degree <=0:
	raise Valuation('degree should be greater than 0.')
	# 为了满足model.fit函数的输入要求,将特征函数数据从一维变成二维,即从(samples,)变为(samples,1)
	X_2D=X.reshape(-1,1)
	# 如果degree大于1,生成多项式数据
	if degree>1:
		poly=PolynomialFeatures(degree=degree,include_bias=False)
		X_2D=poly.fit_transform(X_2D)
	#数据标准化(减均值除标准差)
	scaler=StandarScaler()
	X_2D=scaler.fit_transform(X_2D)
	#模型预测
	y_pred=model.predict(X_2D)
	# 画出样本的散点图
	plt.scatter(X,y,maker='o',
	color='c',label='test dataset')
	# 画出预测函数曲线
	plt.plot(np.sort(X),y_pred[np.argsort(X)],
	color='r',label=str(degree)+'order fitting')
	plt.legend()
	plt.xlabel('x')
	plt.ylabel('y')
	plt.show()
	return y_pred
4.2一阶线性模型预测
y_test_pred1=poly_fit_predict(
	degree=1,X=X_test,y=y_test,model=reg1)

一阶模型预测

4.3三阶线性模型预测
y_test_pred3=poly_fit_predict(
	degree=3,X=X_test,y=y_test,model=reg3)

三阶模型预测

4.4十阶线性模型预测
y_test_pred10=poly_fit_predict(
	degree=10,X=X_test,y=y_test,model=reg10)

十阶模型预测

4.5三十阶线性模型预测
y_test_pred30=poly_fit_predict(
	degree=30,X=X_test,y=y_test,model=reg30)

三十阶模型预测

4.6指标对比
# 计算MSE
mse_test1=mean_squared.error(y_test_pred1,y_test)
mse_test3=mean_squared.error(y_test_pred3,y_test)
mse_test10=mean_squared.error(y_test_pred10,y_test)
mse_test30=mean_squared.error(y_test_pred30,y_test)
# 打印结果
print('MSE:')
print('1 order polynomial:{:.2f}'.format(mse_test1))
print('3 order polynomial:{:.2f}'.format(mse_test3))
print('10 order polynomial:{:.2f}'.format(mse_test10))
print('30 order polynomial:{:.2f}'.format(mse_test30))
# 输出结果
MSE:
1 order polynomial:659.95
3 order polynomial:39.71
10 order polynomial:41.00
30 order polynomial:85.45
  • 测试集MSE指标从好到坏的模型:
  • 3阶多项式、10阶多项式、30阶多项式、1阶多项式

5.欠拟合和过拟合定义

  • 欠拟合:选择的模型过于简单,以至于模型对训练集和未知数据的预测都很差的现象。
  • 过拟合:选择的模型过于复杂,以至于对训练集的预测很好,但对未知数据预测很差的现象(泛化能力差)。
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值