python 画出决策边界_Python3入门机器学习 - 逻辑回归与决策边界
logistic回歸又稱logistic回歸分析,是一種廣義的線性回歸分析模型,以胃癌病情分析為例,選擇兩組人群,一組是胃癌組,一組是非胃癌組,兩組人群必定具有不同的體征與生活方式等。因此因變量就為是否胃癌,值為“是”或“否”,自變量就可以包括很多了,如年齡、性別、飲食習慣、幽門螺桿菌感染等。
邏輯回歸需要將原本線性回歸結果的值域置于(0,1)之間,概率大于0.5看作結果為1
常使用sigmoid函數將結果變為(0,1)之間的值域
繪制sigmoid曲線def?sigmoid(t):
return?1/(1+np.exp(-t))
x?=?np.linspace(-10,10,100)
y?=?sigmoid(x)
plt.plot(x,y)
邏輯回歸的損失函數
該損失函數沒有公式解,可以用梯度下降法求最優解
損失函數求導
封裝Logistics模型我使用Logistics模型及鳶尾花數據集的前兩列,可得到1.0準確率的預測精準度。#?代碼與線性回歸及其相似,只是推導公式不同#?_*_?encoding:utf-8?_*_import?numpy?as?np
from?sklearn.metrics?import?r2_score
from?metrics?import?accuracy_scoreclass?LinearRegression:
def?__init__(self):????????self.coef_?=?None????????self.interception_?=?None????????self._theta?=?None????def?_sigmoid(self,t):????????return?1./(1.+?np.exp(-t))????def?fit(self,X_train,y_train,eta=0.01,n_iters=1e6):????????def?J(theta,X_b,y):
y_hat?=?self._sigmoid(X_b.dot(theta))????????????try:
return?-np.sum(y*np.log(y_hat)+(1-y)*np.log(1-y_hat))/len(y)????????????except:
return?float("inf")????????def?dJ(theta,X_b,y):????????????#?res?=?np.empty()
#?res[0]?=?np.sum(X_b.dot(theta)-y)
#?for?i?in?range(1,len(theta)):
#?????res[i]?=?(X_b.dot(theta)-y).dot(X_b[:,i])
#?return?res?*?2?/?len(X_b)
return?X_b.T.dot(self._sigmoid(X_b.dot(theta))-y)/len(X_b)????????def?gradient_descent(X_b,y,initial_theta,eta,n_iters=1e6,epsilon=1e-8):
theta?=?initial_theta
cur_iter?=?0
while?cur_iter
gradient?=?dJ(theta,X_b,y)
last_theta?=?theta
theta?=?theta?-?eta?*?gradient????????????????if?(abs(J(theta,X_b,y)?-?J(last_theta,X_b,y))?
cur_iter+=1
return?theta
X_b?=?np.hstack([np.ones((len(X_train),1)),X_train])
initial_theta?=?np.zeros(X_b.shape[1])????????self._theta?=?gradient_descent(X_b,y_train,initial_theta,eta,n_iters)????????self.interception_?=?self._theta[0]????????self.coef_?=?self._theta[1:????????return?self
def?predict_proba(self,X_predict):
X_b?=?np.hstack([np.ones((len(X_predict),1)),X_predict])????????return?self._sigmoid(X_b.dot(self._theta))????def?predict(self,X_predict):
proba?=?self.predict_proba(X_predict)????????return?proba>=0.5
def?score(self,X_test,y_test):????????return?accuracy_score(y_test,self.predict(X_test))????def?__repr__(self):????????return?"LogisticRegreesion()"
決策邊界在邏輯回歸中,易得決策邊界為 theta*X_b=0 的直線
如果只有兩個特征值,則很容易通過公式畫出邏輯回歸的決策邊界
藍線即為鳶尾花數據前兩列特征值通過邏輯回歸得到的決策邊界
不規則的決策邊界的繪制
一種繪制思路def?plot_decision_boundary(model,axis):
x0,x1?=?np.meshgrid(
np.linspace(axis[0],axis[1],int((axis[1]-axis[0])*100)),
np.linspace(axis[2],axis[3],int((axis[3]-axis[2])*100))
)
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,7.5,1.5,4.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()
knn算法的決策邊界knn_clf?=?KNeighborsClassifier()
knn_clf.fit(iris.data[:,:2],iris.target)
plot_decision_boundary(knn_clf,axis=[4,7.5,1.5,4.5])
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
plt.show()
n_neighbors默認等于5時
n_neighbors等于50時
多項式特征應用于邏輯回歸#準備數據X?=?np.random.normal(0,1,size=(200,2))
y?=?np.array(X[:,0]**2?+?X[:,1]**2<1.5,dtype='int')def?PolynomialLogisticRegression(degree):
return?Pipeline([
('Poly',PolynomialFeatures(degree=degree)),
('std_scaler',StandardScaler()),
('Logistic',LogisticRegression())
])
Log_reg?=?PolynomialLogisticRegression(2)
Log_reg.fit(X,y)
邏輯回歸的模型正則化
邏輯回歸的模型正則化方式#準備數據import?numpy?as?npimport?matplotlib.pyplot?as?plt
X?=?np.random.normal(0,1,size=(200,2))
y?=?np.array(X[:,0]**2?+?X[:,1]<1.5,dtype='int')for?_?in?range(20):
y[np.random.randint(200)]?=?1???#噪音plt?.scatter(X[y==0,0],X[y==0,1])
plt?.scatter(X[y==1,0],X[y==1,1])
plt.show()
數據.pngfrom?sklearn.linear_model?import?LogisticRegressionfrom?sklearn.preprocessing?import?PolynomialFeaturesfrom?sklearn.pipeline?import?Pipeline
log_reg?=?LogisticRegression()
log_reg.fit(X,y)LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,
penalty='l2', random_state=None, solver='liblinear', tol=0.0001,
verbose=0, warm_start=False)
其中模型正則化公式中的參數C默認為1,penalty默認為'l2'from?sklearn.preprocessing?import?StandardScalerdef?PolynomialLogisticRegression(degree,C=1.0,penalty='l2'):
return?Pipeline([
('Poly',PolynomialFeatures(degree=degree)),
('std_scaler',StandardScaler()),
('Logistic',LogisticRegression(C=C,penalty=penalty))
])
poly_log_reg?=?PolynomialLogisticRegression(degree=20,C=0.1,penalty='l1')
poly_log_reg.fit(X,y)
曲線相對平滑
應用OVR和OVO使邏輯回歸處理多分類問題OVR:One Vs Rest
OVO:One Vs One
OVR耗時較少,性能較高,但分類準確度略低
OVO耗時較多,分類準確度較高#為了數據可視化方便,我們只使用鳶尾花數據集的前兩列特征from?sklearn?import?datasets
iris?=?datasets.load_iris()
X?=?iris['data'][:,:2]
y?=?iris['target']
log_reg?=?LogisticRegression(multi_class='ovr')???#傳入multi_class參數可以指定使用ovr或ovo,默認ovrlog_reg.score(X_test,y_test)>>>?0.578???#由于只使用前兩列特征,導致分類準確度較低log_reg?=?LogisticRegression(multi_class='ovr',solver='newton-cg')
log_reg.fit(X_train,y_train)
log_reg.score(X_test,y_test)>>>?0.7894736842105263
OVR分類決策邊界
OVO分類決策邊界
使用scikitlearn中的OVO及OVR類來進行多分類from?sklearn.multiclass?import?OneVsOneClassifierfrom?sklearn.multiclass?import?OneVsRestClassifier
ovr?=?OneVsRestClassifier(log_reg)
ovr.fit(X_train,y_train)
print(ovr.score(X_test,y_test))
ovo?=?OneVsOneClassifier(log_reg)
ovo.fit(X_train,y_train)
print(ovo.score(X_test,y_test))>>>?0.7894736842105263>>>?0.8157894736842105
作者:冰源_63ad
鏈接:https://www.jianshu.com/p/c5ba12a1b2c8
總結
以上是生活随笔為你收集整理的python 画出决策边界_Python3入门机器学习 - 逻辑回归与决策边界的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python采用面向对象编程模式吗_如何
- 下一篇: python原理与架构_Python:爬