邏輯迴歸-4.添加多項式特徵

邏輯迴歸解決二分類問題,可是像下圖所示的非線性數據集,是沒辦法用一條直線分割爲兩部分的。
算法

對於此數據集,用一個圓形或者橢圓形分割是比較合理的,圓形的表達式:\(X_1^2 + X_2^2 - R^2 = 0\)
爲了讓邏輯迴歸學習到這樣的決策邊界,咱們須要引入多項式項,\(X_1^2,X_2^2\)分別是\(X_1,X_2\)的二次多項式。使用多項式後,能夠定義任意圓心位置的圓、橢圓或不規則形狀的決策邊界。dom

代碼實現

構造數據集學習

import numpy
import matplotlib.pyplot as plt

numpy.random.seed(666)
X = numpy.random.normal(0,1,size=(200,2))
y = numpy.array(X[:,0]**2 + X[:,1]**2 < 1.5,dtype='int')

plt.scatter(X[y==0,0],X[y==0,1],color='red')
plt.scatter(X[y==1,0],X[y==1,1],color='blue')
plt.show()

邏輯迴歸算法測試測試

from mylib.LogisticRegression import LogisticRegression

log = LogisticRegression()
log.fit(X,y)

算法正確率只有60%
spa

畫出決策邊界:
code

能夠看出,用線性分類來擬合此數據集是錯誤的orm

添加多項式,並使用管道

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler

def PolynomialLogisticRegression(degree):
    return Pipeline([
        ('poly',PolynomialFeatures(degree=degree)),
        ('stand_scalor',StandardScaler()),
        ('log_reg',LogisticRegression())
    ])

poly_log_reg = PolynomialLogisticRegression(2)
poly_log_reg.fit(X,y)

注意:管道中的邏輯迴歸是本身實現的,可是能準確的傳遞到管道中,這是由於咱們是仿照scikit-learn的標準實現的

添加多項式後,算法的準確率提升到了95%blog

決策邊界:
ip

當多項式項爲20時
ci

隨着項數的增長,算法變得複雜,趨於過擬合,但爲了獲得複雜形狀的決策邊界,又不能過多的減少多項式項,此時,應該考慮模型的正則化,見下章。

相關文章
相關標籤/搜索