美文网首页
多项式回归(Polynomial regression)

多项式回归(Polynomial regression)

作者: 生信编程日常 | 来源:发表于2020-10-24 22:48 被阅读0次

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


    有以下数据:

    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()
    

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

    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的平方的特征:

    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),我们不必自己去生成这个特征了:

    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中调用,会更方便:

    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)
    

    相关文章

      网友评论

          本文标题:多项式回归(Polynomial regression)

          本文链接:https://www.haomeiwen.com/subject/tfawmktx.html