邏輯迴歸解決二分類問題,可是像下圖所示的非線性數據集,是沒辦法用一條直線分割爲兩部分的。
算法
對於此數據集,用一個圓形或者橢圓形分割是比較合理的,圓形的表達式:\(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
隨着項數的增長,算法變得複雜,趨於過擬合,但爲了獲得複雜形狀的決策邊界,又不能過多的減少多項式項,此時,應該考慮模型的正則化,見下章。