機器學習:多項式回歸(scikit-learn中的多項式回歸和 Pipeline)


一、scikit-learn 中的多項式回歸

 1)實例過程

  • 模擬數據
    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.random.uniform(-3, 3, size=100)
    X = x.reshape(-1, 1)
    y = 0.5 * x**2 + x + np.random.normal(0, 1, 100)
  1. 相對於scikit-learn中的多項式回歸,自己使用多項式回歸,就是在使用線性回歸前,改造了樣本的特征;
  2. sklearn 中,多項式回歸算法(PolynomialFeatures)封裝在了 preprocessing 包中,也就是對數據的預處理;
  3. 對於多項式回歸來說,主要做的事也是對數據的預處理,為數據添加一些新的特征;

 

  • 使用 PolynomialFeatures 生成新的數據集
    from sklearn.preprocessing import PolynomialFeatures
    
    poly = PolynomialFeatures(degree=2)
    poly.fit(X)
    X2 = poly.transform(X)
    
    X2.shape
    # 輸出:(100, 3)
    
    X2[:5, :]
    # 輸出:
    array([[1. , 2.98957009, 8.93752931],
    [1. , 0.5481444 , 0.30046228], [1. , 2.43260405, 5.91756246], [1. , 1.86837318, 3.49081835], [1. , 2.89120321, 8.35905598]])
  1. degree=2:表示對原本數據集 X 添加一個最多為 2 次冪的相應的多項式特征;
  2. poly.transform(X):將原本數據集 X 的每一種特征,轉化為對應的多項式的特征;
  3. X2:生成的多項式特征相應的數據集;
  4. 疑問:X 的樣本原有一個特征,經過 PolynomialFeatures 后生成了 3 個特征?
  5. X2 == [1., x, x2];

 

  • 使用 LinearRegression 類操作新的數據集 X2
    from sklearn.linear_model import LinearRegression
    
    lin_reg2 = LinearRegression()
    lin_reg2.fit(X2, y)
    y_predict2 = lin_reg2.predict(X2)

     

  • 繪制擬合結果
    plt.scatter(x, y)
    plt.plot(np.sort(x), y_predict2[np.argsort(x)], color='r')
    plt.show()

 

 

二、Pipeline(管道)

 1)疑問:如果數據集有 n 個特征,經過 PolynomialFeatures 生成的數據集有多少個?

  • 模擬數據集

    X = np.arange(1, 11).reshape(-1, 2)
    X.shape
    # 輸出:(5, 2)
    
    X
    # 輸出:
    array([[ 1,  2],
           [ 3,  4],
           [ 5,  6],
           [ 7,  8],
           [ 9, 10]])

     

  1. 當 degree = 2
    poly = PolynomialFeatures(degree=2)
    poly.fit(X)
    X2 = poly.transform(X)
    
    X2.shape
    # 輸出:(5, 6)
    
    X2
    # 輸出:
    array([[  1.,   1.,   2.,   1.,   2.,   4.],
           [  1.,   3.,   4.,   9.,  12.,  16.],
           [  1.,   5.,   6.,  25.,  30.,  36.],
           [  1.,   7.,   8.,  49.,  56.,  64.],
           [  1.,   9.,  10.,  81.,  90., 100.]])

     

  2. 當 degree = 3
    poly = PolynomialFeatures(degree=3)
    poly.fit(X)
    X3 = poly.transform(X)
    
    X3.shape
    # 輸出:(5, 10)
    
    X3
    # 輸出:
    array([[   1.,    1.,    2.,    1.,    2.,    4.,    1.,    2.,    4.,    8.],
           [   1.,    3.,    4.,    9.,   12.,   16.,   27.,   36.,   48.,   64.],
           [   1.,    5.,    6.,   25.,   30.,   36.,  125.,  150.,  180.,  216.],
           [   1.,    7.,    8.,   49.,   56.,   64.,  343.,  392.,  448.,  512.],
           [   1.,    9.,   10.,   81.,   90.,  100.,  729.,  810.,  900., 1000.]])

     

  • 分析:經過 PolynomialFeatures 之后,樣本特征呈指數增長,新增的特征包含了所有可能的所樣式;

 

 2)Pipeline 過程

  • 使用多項式回歸的過程
  1. 將原始數據集 X 講過 PolynomialFeatures 算法,生成多項式的特征的樣本的數據集;
  2. 數據歸一化(StandardScaler):如果 degree 非常的大,樣本生成的特征的數據的差距也會變動非常的大;
  3. 將新的數據集傳給線性回歸算法:LinearRegression;
  • Pipeline 將這 3 步合為一體,使得每次使用多項式回歸時,不需要重復這 3 個過程;

 

  • 具體操作過程
  1. 模擬數據
    x = np.random.uniform(-3, 3, size=100)
    X = x.reshape(-1, 1)
    y = 0.5 * x**2 + x + 2 + np.random.normal(0, 1, 100)

     

  2. 使用 Pipeline
    from sklearn.pipeline import Pipeline
    from sklearn.linear_model import LinearRegression
    from sklearn.preprocessing import PolynomialFeatures
    from sklearn.preprocessing import StandardScaler
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 實例化 Pipeline
    poly_reg = Pipeline([
        ("poly", PolynomialFeatures(degree=2)),
        ("std_scaler", StandardScaler()),
        ("lin_reg", LinearRegression())
    ])
    
    poly_reg.fit(X, y)
    y_predict = poly_reg.predict(X)

     

  3. 繪制擬合的結果
    plt.scatter(x, y)
    plt.plot(np.sort(x), y_predict[np.argsort(x)], color='r')
    plt.show()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM