sklearn之线性回归和多项式回归

涉及内容

  • 多项式回归
  • 多项式的sklearn实现
  • 偏差和方差
  • 增加算法模型泛化能力的正则化处理

多项式回归

  • 研究一个因变量与一个或多个自变量(特征)间多项式的回归分析,成为多项式回归(Ploynomial Regression).其为线性回归模型,其回归函数关于回归系数是线性的,自变量x和因变量y之间的关系被建模为n次多项式
  • 当自变量只有一个时,成为一元多项式回归;如果自变量(特征)为多个时,称为多项式回归。在一元回归分析中,如果变量y与自变量x的关系为非线性的,且找不到适当函数曲线来拟合,可以采用一元多项式回归。
  • 任何函数都可以多项式来逼近,故多项式回归有着广泛应用,如在SVM的核函数,如下面非线性关系数据,无法用直线拟合,但是可以使用多项式更好的拟合
    多项式拟合曲线关系数据
  • 与简单线性回归,其输入特征只有一维,即:y=ax+b,(a为曲线斜率吧,b为截距项(或偏置项)),推广到多维特征,即有多个输入特征的线性回归:y = a1*X1 + a2*X2 + … + an*Xn + b
  • 线性回归的的本质有个很强的假设条件:数据存在线性关系,但现实世界中往往是非线性的。因此要对回归算法进行改进,使用多项式回归,可对非线性数据进行处理

多项式回归实现思路

  • 首先准备数据,创建一个一元二次方程,并增加一些噪音,先用线性关系拟合
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.linear_model import LinearRegression
    
    
    class LineRegression:
    	def __init__(self):
        		pass
    
            @staticmethod
    	def line_regression():
        		# 训练数据
        		x = np.random.uniform(-3, 3, size=100)
        		# 构建一元关系
        		y = 0.5 + x**2+x+2+np.random.normal(0, 1, size=100)
    
       		# 构建线性回归模型
        		line_regression = LinearRegression()
    
        		# 将训练特征转换为 1行100列特征,对应 实际y值得个数
        		train_data = x.reshape(-1, 1)
        		line_regression.fit(X=train_data, y=y)
        		# 给出预测值
        		y_predict = line_regression.predict(train_data)
    
        		# plt展示 y与 x之间的关系
        		plt.scatter(x, y)
        		# plt展示 实际y值与预测值的偏差
        		plt.scatter(x, y_predict, edgecolors='r')
    
       		plt.show()
    
    if __name__ == "__main__":
    	 PolyRegression.line_regression()
    
    线性回归拟合非线性关系
  • 使用多项式回归拟合
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.linear_model import LinearRegression
    
    class PolyRegression:
    	def __init__(self):
    		pass
    
    	@staticmethod
    	def poly_regression():
    		# 训练数据
    		x = np.random.uniform(-3, 3, size=100)
    		# 构建一元关系
    		y = 0.5 + x**2+x+2+np.random.normal(0, 1, size=100)
    
    		# 构建线性回归模型
    		line_regression = LinearRegression()
    
    		# 将训练特征转换为 1行100列特征,对应 实际y值得个数
    		train_data = x.reshape(-1, 1)
    
    		# 使用多项式,先创建一个新特征
    		# (train_data**2).reshape
    
    		# 创建一个新特征
    		new_feature_data = np.hstack([train_data, train_data**2])
    		# 构建模型
    		line_regression.fit(X=new_feature_data, y=y)
    		# 给出预测值
    		y_predict = line_regression.predict(new_feature_data)
    
    		# plt展示 y与 x之间的关系
    		plt.scatter(x, y)
    		# plt展示 实际y值与预测值的偏差
    		plt.scatter(np.sort(x), y_predict[np.argsort(x)], edgecolors='r')
    
    		plt.show()
    		# 输出模型指标,斜率,截距项协方差
    		print(line_regression.coef_, line_regression.intercept_)
    
    if __name__ == "__main__":
    	PolyRegression.poly_regression()
    
    多项式拟合的结果

sklearn中的一元多项式回归

  • 代码实现及拟合效果
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import  LinearRegression


class PolyRegression:
	def __init__(self):
		pass

	@staticmethod
	def poly_regression():
		# 1.预处理训练数据
		x = np.random.uniform(-3, 3, size=100)
		# 构建一元关系
		y = 0.5 + x**2+x+2+np.random.normal(0, 1, size=100)
		# 将训练特征转换为 1行100列特征,对应 实际y值得个数
		train_data = x.reshape(-1, 1)

		# 构建线性回归模型,degree表示使用多少幂次(多项式的最高次数)
		sklearn_poly_regression = PolynomialFeatures(degree=2)
		# 拟合数据
		sklearn_poly_regression.fit(train_data)
		# 转换数据
		X2 = sklearn_poly_regression.transform(X=train_data)
		# X2 集合的形式 为100行 3列
		print(X2.shape)
		# 查看前5行,所有列的数据,:5指前5行数据,所有列数据
		# 第一列为0次方,第二列是一次项系数(原来数据样本特征),第三列是二次线系数
		print(X2[:5, :])
		
   	        # 2.模型训练
		reg = LinearRegression()
		reg.fit(X=X2, y=y)
		# 给出预测值
		y_predict = reg.predict(X2)

		# plt展示 y与 x之间的关系
		plt.scatter(x, y)
		# plt展示 实际y值与预测值的偏差
		plt.scatter(np.sort(x), y_predict[np.argsort(x)], edgecolors='r')

		plt.show()

if __name__ == "__main__":
		PolyRegression.poly_regression()

sklearn

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值