日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 画出决策边界_Python3入门机器学习 - 逻辑回归与决策边界

發布時間:2025/3/11 python 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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入门机器学习 - 逻辑回归与决策边界的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。