機器學習:邏輯迴歸(使用多項式特徵)

1、基礎

  • 邏輯迴歸中的決策邊界,本質上至關於在特徵平面中找一條直線,用這條直線分割全部的樣本對應的分類;
  • 邏輯迴歸只能夠解決二分類問題(包含線性和非線性問題),所以其決策邊界只能夠將特徵平面分爲兩部分;
  • 問題:使用直線分類太過簡單,由於有不少狀況樣本的分類的決策邊界並非一條直線,以下圖;由於這些樣本點的分佈是非線性的
  • 方案引入多項式項,改變特徵,進而更改樣本的分佈狀態

 

 

2、具體實現

 1)模擬數據集

  • import numpy as np
    import matplotlib.pyplot as plt
    
    np.random.seed(666)
    X = np.random.normal(0, 1, size=(200, 2))
    y = np.array(X[:,0]**2 + X[:,1]**2 < 1.5, dtype='int')
    
    plt.scatter(X[y==0,0], X[y==0,1])
    plt.scatter(X[y==1,0], X[y==1,1])
    plt.show()

 

 2)使用邏輯迴歸算法(不添加多項式項)

  • from playML.LogisticRegression import LogisticRegression
    
    log_reg = LogisticRegression()
    log_reg.fit(X, y)
    
    def plot_decision_boundary(model, axis):
        
        x0, x1 = np.meshgrid(
            np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1,1),
            np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1,1)
        )
        X_new = np.c_[x0.ravel(), x1.ravel()]
        
        y_predict = model.predict(X_new)
        zz = y_predict.reshape(x0.shape)
        
        from matplotlib.colors import ListedColormap
        custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
        
        plt.contourf(x0, x1, zz, linewidth=5, cmap=custom_cmap)
    
    plot_decision_boundary(log_reg, axis=[-4, 4, -4, 4])
    plt.scatter(X[y==0,0], X[y==0,1])
    plt.scatter(X[y==1,0], X[y==1,1])
    plt.show()

  • 問題:決策邊界不能反應數據集樣本的分佈;

 

 3)使用邏輯迴歸算法(添加多項式項)

  • 使用管道(Pipeline)對特徵添加多項式項
    # 使用管道:Pipeline(list),list 內的每個元素爲爲管道的一步,每一步是一個元組,
            # 元組的第一個元素是一個字符串,是一個實例對象,描述這一步的內容或功能,第二個元素是一個類的對象
    from sklearn.pipeline import Pipeline
    from sklearn.preprocessing import PolynomialFeatures
    from sklearn.preprocessing import StandardScaler
    
    def PolynomialLogisticRegression(degree):
        return Pipeline([
            # 管道第一步:給樣本特徵添加多形式項;
            ('poly', PolynomialFeatures(degree=degree)),
            # 管道第二步:數據歸一化處理;
            ('std_scaler', StandardScaler()),
            ('log_reg', LogisticRegression())
        ])
    
    poly_log_reg = PolynomialLogisticRegression(degree=2)
    poly_log_reg.fit(X, y)
    
    plot_decision_boundary(poly_log_reg, axis=[-4, 4, -4, 4])
    plt.scatter(X[y==0,0], X[y==0,1])
    plt.scatter(X[y==1,0], X[y==1,1])
    plt.show()

 

 

3、其它

 1)管道(Pipeline)

  • Pipeline(list):list 內的每個元素爲爲管道的一步,每一步是一個元組,
  • 元組的第一個元素是一個字符串,是一個實例對象,描述這一步的內容或功能,第二個元素是一個類的對象;
  1. 管道第一步:給樣本特徵添加多形式項;
  2. 管道第二步:數據歸一化處理;

 

 2)scikit-learn 庫的標準

  • 管道中使用的邏輯迴歸算法模型:LogisticRegression() 是本身所寫的算法,之因此能直接傳入管道使用,由於本身所寫的算法遵循了 scikit-learn 的標準;
  • scikit-learn 中每個機器學習算法的標準:__init__()函數、fit()函數、predict()函、score()函數等;
  • 若是在scikit-learn 的模塊中使用了其它算法/模塊,只要這些其它的模塊遵循了 scikit-learn 中算法的標準,則 scikit-learn 的模塊就認爲這些模塊也是 scikit-learn 自己的模塊;
  • 也就是說,若是其它算法想和scikit-learn中的模塊銜接使用,該算法就要遵循scikit-learn中機器學習算法的標準;

 

 3)其它

  • 實習的應用中,須要對 degree 參數進行調整,選取最佳的參數;
  • scikit-learn 建議使用邏輯迴歸算法時都進行模型正則化;
相關文章
相關標籤/搜索