under_over_fit.py

import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
#sklearn提供了Pipeline类来处理顺序的操作步骤
from sklearn.preprocessing import PolynomialFeatures
#sklearn.preprocessing.PolynomialFeatures 这个类可以进行特征的
# 构造,构造的方式就是特征与特征相乘(自己与自己,自己与其他人),
# 这种方式叫做使用多项式的方式。
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
#交叉验证
np.random.seed(0)
"""
设置seed()里的数字就相当于设置了一个盛有随机数的“聚宝盆”,
一个数字代表一个“聚宝盆”,当我们在seed()的括号里设置相同的
seed,“聚宝盆”就是一样的,那当然每次拿出的随机数就会相同
(不要觉得就是从里面随机取数字,只要设置的seed相同取出地随机数
就一样)。如果不设置seed,则每次会生成不同的随机数。
"""
n_samples=30
degrees=[1,2,3,4,15]

true_fun=lambda X:np.cos(1.5*np.pi*X)
X=np.sort(np.random.rand(n_samples))
#np.random.rand使用方法与np.random.randn()函数相同
#通过本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。
# 随机样本取值范围是[0,1),不包括1.
#np.sort()函数的作用是对给定的数组的元素进行排序
y=true_fun(X)+np.random.randn(n_samples)*0.1
plt.figure(figsize=(14,5))

for i in range(len(degrees)):
	ax=plt.subplot(1,len(degrees),i+1)
	plt.setp(ax,xticks=(),yticks=())
	#plt.setp() 修改线条性质
	polynomial_features=PolynomialFeatures(degree=degrees[i],include_bias=False)
#degree:控制多项式的次数;
#include_bias:默认为 True 。如果为 True 的话,那么结果中就会有 0 次幂项,即全为 1 这一列
	linear_regression=LinearRegression()
	pipeline=Pipeline([("polynomial_features",polynomial_features),
										("linear_regression",linear_regression)])
	pipeline.fit(X[:,np.newaxis],y)
	# Evaluate the models using crossvalidation
	scores=cross_val_score(pipeline,X[:,np.newaxis],y,
							scoring="neg_mean_squared_error",cv=10)
	#交叉验证cross_val_score的scoring参数
	#分类:accuracy(准确率)、f1、f1_micro、f1_macro(这两个用于多分类的f1_score)、precision(精确度)、recall(召回率)、roc_auc
	#回归:neg_mean_squared_error(MSE、均方误差)、r2
	#聚类:adjusted_rand_score、completeness_score等
	#soring:调用的方法
	#cv:交叉验证生成器或可迭代的次数 
	X_test=np.linspace(0,1,100)
	plt.plot(X_test,pipeline.predict(X_test[:,np.newaxis]),label="Model")
	plt.plot(X_test,true_fun(X_test),label="True function")
	plt.scatter(X,y,label="Samples")

	plt.xlabel("x")
	plt.ylabel("y")
	plt.xlim((0,1))
	plt.ylim((-2,2))
	plt.legend(loc="best")
	plt.title("Degree {}\nMSE={:.2e}(+/-{:.2e})".format(
		degrees[i],-scores.mean(),scores.std()
	))
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值