前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多项式回归(Polynomial regression)

多项式回归(Polynomial regression)

作者头像
生信编程日常
发布2020-10-29 11:32:55
1.6K0
发布2020-10-29 11:32:55
举报
文章被收录于专栏:生物信息学、python、R、linux

在线性回归中,我们是寻找一条直线来尽可能的拟合数据。但是我们在大部分情况下并不满足简单的线性回归的。如下图所示的这种特殊的线性回归的情况,这种特殊的回归方法被称为多项式回归(Polynomial regression)。

有以下数据:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (8,6)

x = np.random.uniform(-3, 3, size = 100)
y = 2 * x ** 2 + 3 * x + 3 + np.random.normal(0, 1, size = 100) # 加上一点噪声

plt.scatter(x, y)
plt.show()

如果用普通的线性回归的话:

代码语言:javascript
复制
from sklearn.linear_model import LinearRegression

X = x.reshape(-1,1)
lin_reg = LinearRegression()
lin_reg.fit(X, y)
y_pred = lin_reg.predict(X)
plt.scatter(x, y)
plt.scatter(x, y_pred, color = 'r')
plt.show()

可见用线性回归去拟合明显不好。为了解决这个问题,可以增加一个X的平方的特征:

代码语言:javascript
复制
X2 = np.hstack([X, X**2])
lin_reg2 = LinearRegression()
lin_reg2.fit(X2, y)
y_pred2 = lin_reg2.predict(X2)
plt.scatter(x, y)
plt.scatter(x, y_pred2, color = 'r')
plt.show()

其实在sklearn中有封装好的方法(sklearn.preprocessing.PolynomialFeatures),我们不必自己去生成这个特征了:

代码语言:javascript
复制
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2) # 添加几次方特征
poly.fit(X)
X2 = poly.transform(X)

# 训练
lin_reg = LinearRegression()
lin_reg.fit(X2, y)
y_pred = lin_reg.predict(X2)
plt.scatter(x, y)
plt.scatter(x, y_pred, color = 'r')
plt.show()

也可以写到pipeline中调用,会更方便:

代码语言:javascript
复制
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

poly_reg = Pipeline([
    ("poly", PolynomialFeatures(degree=2)),
    ("std_scaler", StandardScaler()),
    ("lin_reg", LinearRegression())
])

poly_reg.fit(X,y)
y_pred = poly_reg.predict(X)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档