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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python sns绘制回归线_SVM--支持向量机amp;Python代码

發(fā)布時間:2025/3/19 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python sns绘制回归线_SVM--支持向量机amp;Python代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

(一)基礎(chǔ)理論部分

如果對支持向量機的基礎(chǔ)理論推導(dǎo)感興趣,這里分享一個經(jīng)典的視頻:

https://www.youtube.com/watch?v=_PwhiWxHK8o?www.youtube.com

如果只是想要了SVM的解基本思想并進行實踐,一定要看這個視頻:

https://www.youtube.com/watch?v=N1vOgolbjSc?www.youtube.com

由于視頻是在油管發(fā)布的,很多小伙伴看不了,油管搬運工又來做體力活了~

現(xiàn)在有一個維度為二維(x,y),類別有2類(Class=0或1)的數(shù)據(jù)集。將其可視化后效果如下:

我們想要訓(xùn)練出一個分類器,使得新給一個x和y值后,就可以預(yù)測該點的類別。

這個分類器事實上可以有多個,只要分類器能夠?qū)蓚€類別完全區(qū)分開來,我們就可以說這個分類器是合格的。如下圖所示,一條黑色直線就是一個分類器。

但是,這么多分類器,哪個才是最好的呢???

我們認(rèn)為,下面這條直線是最佳分類器,這條直線也稱為超平面(Hyperplane)。

可是,為什么是這條直線呢?

因為,當(dāng)我們對超平面在保證斜率不變的前提下,進行上下平移時,形成兩個分類邊界線,這兩個邊界線之間的距離(寬度)是最大的。使兩個邊界線之間的距離(寬度)達(dá)到盡可能大,這么做的好處是,新樣本數(shù)據(jù)被誤分的概率就會更小。

對比,其他超平面形成的分類邊界如下:

另外一個問題是,在對超平面進行平移過程中,我們平移到哪里就該停止平移呢?

答約,當(dāng)我們遇到“支持向量”時就該停止平移,從而形成邊界。

什么是“支持向量”?一般認(rèn)為,超平面在平移過程中,遇到第一個點后就停止平移,則這個點就是支持向量。

(二)Python實戰(zhàn)

演示數(shù)據(jù)集:

鏈接:https://pan.baidu.com/s/1RPPtIkioXf3CSp5eHtTVXQ

提取碼:3u2b

數(shù)據(jù)集是一個蛋糕配方,共有muffin和cupcake兩種類型的蛋糕,配方變量為Sugar和Butter。我們需要判斷,給定Sugar和Butter值,預(yù)測該蛋糕類型。

#導(dǎo)入數(shù)據(jù) import pandas as pd path = "C:UsersCaraDesktopcupcake or muffin.xlsx" data = pd.read_excel(path) print(data.shape)#(18, 3) print(data.head(5)) '''Sugar Butter CakeType 0 3 7 muffin 1 12 6 muffin 2 18 6 muffin 3 12 6 muffin 4 3 7 muffin '''#認(rèn)識數(shù)據(jù):數(shù)據(jù)可視化 import seaborn as sns sns.lmplot(data=data,x='Sugar',y='Butter',palette='Set1',fit_reg=False,hue='CakeType',scatter_kws={'s':150}) ''' lmplot()參數(shù)說明: palette='Set1'設(shè)置調(diào)色板型號,對應(yīng)不同繪圖風(fēng)格,色彩搭配。 fit_reg=False表示不顯示擬合的回歸線。因為lmplot()本身是線性回歸繪圖函數(shù),默認(rèn)會繪制點的擬合回歸線。 hue='CakeType'表示對樣本點按照'CakeType'的取值不同進行分類顯示,這樣不同類型的蛋糕會用不同顏色顯示。若不設(shè)置hue參數(shù),則所有點都會顯示為一個顏色顯示。 scatter_kws={'s':150}:設(shè)置點的大小,其中s表示size。 '''

效果如下:


從繪圖結(jié)果來看,樣本數(shù)據(jù)很適合進行二分類訓(xùn)練,因為兩種蛋糕剛好可以互相分離,使用一條直線就可以將兩類樣本清楚劃分。而且,這樣的直線不止一條,因此,我們需要找到最優(yōu)的那條劃分直線。

#數(shù)據(jù)預(yù)處理 #將CakeType的值映射到0、1,方便后續(xù)模型運算 import numpy as np label = np.where(data['CakeType']=='muffin',0,1) print(label)#[0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1] x = data[['Sugar','Butter']] #print(x)#SVM實例化 from sklearn.svm import SVC #SVC指Support Vector Classifier svc = SVC(kernel='linear',C=1) ''' SVC參數(shù)說明: C:懲罰系數(shù),即當(dāng)分類器錯誤地將A類樣本劃分為B類了,我們將給予分類器多大的懲罰。當(dāng)我們給與非常大的懲罰,即C的值設(shè)置的很大,那么分類器會變得非常精準(zhǔn),但是,會產(chǎn)生過擬合問題。 kernel:核函數(shù),如果使用一條直線就可以將屬于不同類別的樣本點全部劃分開,那么我們使用kernel='linear', 如果不能線性劃分開,尤其是當(dāng)數(shù)據(jù)維度很多時,一般很難找到一條合適的線將不同的類別的樣本劃分開,那么就嘗試使用高斯核函數(shù)(也稱為徑向基核函數(shù)-rbf)、多項式核函數(shù)(poly) ''' svc.fit(X=x,y=label)#根據(jù)擬合結(jié)果,找出超平面 w = svc.coef_[0] a = -w[0]/w[1]#超平面的斜率,也是邊界線的斜率 xx = np.linspace(5,30)#生成5~30之間的50個數(shù) #print(xx) ''' [ 5. 5.51020408 6.02040816 6.53061224 7.04081633 7.551020418.06122449 8.57142857 9.08163265 9.59183673 10.10204082 10.612244911.12244898 11.63265306 12.14285714 12.65306122 13.16326531 13.6734693914.18367347 14.69387755 15.20408163 15.71428571 16.2244898 16.7346938817.24489796 17.75510204 18.26530612 18.7755102 19.28571429 19.7959183720.30612245 20.81632653 21.32653061 21.83673469 22.34693878 22.8571428623.36734694 23.87755102 24.3877551 24.89795918 25.40816327 25.9183673526.42857143 26.93877551 27.44897959 27.95918367 28.46938776 28.9795918429.48979592 30. ]''' yy = a * xx - (svc.intercept_[0])/w[1]#根據(jù)超平面,找到超平面的兩條邊界線 b = svc.support_vectors_[0] yy_down = a * xx + (b[1]-a*b[0]) b = svc.support_vectors_[-1] yy_up = a * xx + (b[1]-a*b[0])#繪制超平面和邊界線 #(1)繪制樣本點的散點圖 sns.lmplot(data=data,x='Sugar',y='Butter',hue='CakeType',palette='Set1',fit_reg=False,scatter_kws={'s':150}) #(2)向散點圖添加超平面 from matplotlib import pyplot as plt plt.plot(xx,yy,linewidth=4,color='black')#(3)向散點圖添加邊界線 plt.plot(xx,yy_down,linewidth=2,color='blue',linestyle='--') plt.plot(xx,yy_up,linewidth=2,color='blue',linestyle='--')

效果如下:

# 調(diào)整參數(shù)C,看看會有什么不同? svc = SVC(kernel='linear',C=0.001) svc.fit(X=x,y=label)#根據(jù)擬合結(jié)果,找出超平面 w = svc.coef_[0] a = -w[0]/w[1] xx = np.linspace(5,30) yy = a * xx - (svc.intercept_[0])/w[1]#根據(jù)超平面,找到超平面的兩條邊界線 b = svc.support_vectors_[0] yy_down = a * xx + (b[1]-a*b[0]) b = svc.support_vectors_[-1] yy_up = a * xx + (b[1]-a*b[0])#繪制超平面和邊界線 #(1)繪制樣本點的散點圖 sns.lmplot(data=data,x='Sugar',y='Butter',hue='CakeType',palette='Set1',fit_reg=False,scatter_kws={'s':150}) #(2)向散點圖添加超平面 from matplotlib import pyplot as plt plt.plot(xx,yy,linewidth=4,color='black') #(3)向散點圖添加邊界線 plt.plot(xx,yy_down,linewidth=2,color='blue',linestyle='--') plt.plot(xx,yy_up,linewidth=2,color='blue',linestyle='--')

效果如下:

可以發(fā)現(xiàn),當(dāng)C值給的十分小時,模型精確度會下滑地很厲害,很多樣本被錯分了。

################################################

#SCM做多分類

import pandas as pd path = "C:UsersCaraDesktopcupcake and muffin and Cavine.xlsx" data = pd.read_excel(path) print(data.shape)#(24, 3) print(data['CakeType'].value_counts()) ''' cupcake 9 muffin 9 Cavine 6 Name: CakeType, dtype: int64 '''#認(rèn)識數(shù)據(jù):數(shù)據(jù)可視化 import seaborn as sns sns.lmplot(data=data,x='Sugar',y='Butter',palette='Set1',fit_reg=False,hue='CakeType',scatter_kws={'s':150})


從可視化結(jié)果來看,樣本共有3個類別,且3個類別之間可以使用兩條直線進行劃分,因此,SVM的kernel參數(shù)仍然可以使用linear。

#數(shù)據(jù)預(yù)處理 #將CakeType的值映射到0、1、2,方便后續(xù)模型運算 label = data.CakeType.map({'muffin':0,'cupcake':1,'Cavine':2}) #print(label) x = data[['Sugar','Butter']]#實例化SVC from sklearn.svm import SVC svc = SVC(kernel='linear',C=0.001,decision_function_shape='ovr') ''' 參數(shù)說明: decision_function_shape:設(shè)置分類器決策模式,有兩種模式:ovr和ovo ovr表示one vs rest模式,即比較某一個類別和其他所有類別; ovo表示one vs one模式,即一對一地比較(兩兩比較)兩個類別,如果樣本數(shù)據(jù)有ABC3個類別,則需要比較3次,分別是比較A和B,比較A和C,比較B和C。 ovo模式需要比較的次數(shù)會多于ovr模式,但是,ovo模式對于類別不均衡的樣本數(shù)據(jù)具有較好的穩(wěn)定性。 ''' svc.fit(X=x,y=label) label_predict = svc.predict(X=x)#繪制三分類超平面和邊界線 #生成坐標(biāo) import numpy as np x_min, x_max = data.Sugar.min() - 0.2, data.Sugar.max() + 0.2 y_min, y_max = data.Butter.min() - 0.2, data.Butter.max() + 0.2 step = 0.01 x_value = np.arange(x_min, x_max, step) y_value = np.arange(y_min, y_max, step) #注意!因為x_min到x_max的距離可能并不等于y_min到y(tǒng)_max的距離,所以,即使使用的相同步長(Step),生成的兩組數(shù)可能長度并不一樣。 ''' numpy 中arange()用于生成一組連續(xù)的數(shù),可以指定數(shù)的起點、終點、和步長。 print(np.arange(0,3,0.05))#生成[0,3)之間,以0.05為步長的一組數(shù) #結(jié)果: [0. 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.6 0.650.7 0.75 0.8 0.85 0.9 0.95 1. 1.05 1.1 1.15 1.2 1.25 1.3 1.351.4 1.45 1.5 1.55 1.6 1.65 1.7 1.75 1.8 1.85 1.9 1.95 2. 2.052.1 2.15 2.2 2.25 2.3 2.35 2.4 2.45 2.5 2.55 2.6 2.65 2.7 2.752.8 2.85 2.9 2.95] ''' #基于生成的x值、y值,形成一個個點(二維坐標(biāo)),用于后續(xù)預(yù)測這些點的類別 xx, yy = np.meshgrid(x_value,y_value) ''' numpy中的meshgrid()函數(shù)根據(jù)輸入的兩組數(shù)生成兩個二維數(shù)組,并且這兩個數(shù)組shape是一模一樣的。 a,b = np.meshgrid([1,2,3],[4,5,6,7,8]) print(a) [[1 2 3][1 2 3][1 2 3][1 2 3][1 2 3]]print(b) [[4 4 4][5 5 5][6 6 6][7 7 7][8 8 8]]'''Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])#使用分類器對生成的坐標(biāo)點進行預(yù)測類別 Z = Z.reshape(xx.shape)#轉(zhuǎn)換預(yù)測結(jié)果Z的格式,使得可以與坐標(biāo)點一一對應(yīng)#繪制原始數(shù)據(jù)的散點圖(此時,類型數(shù)據(jù)是真實值) ax = sns.scatterplot(data.Sugar, y=data.Butter,hue=label,palette='Set2') ax.legend(loc="lower right") #繪制基于預(yù)測值的分界面,即分類器的邊界 from matplotlib import pyplot as plt plt.contourf(xx, yy, Z, alpha=0.3)

背景色表示三個類別的邊界,是基于訓(xùn)練出的分類器繪制的。散點本身是真實類別信息。

可以看到,由于SVC中的參數(shù)C設(shè)置為較小的數(shù)(C=0.001),所以存在部分點被錯誤分到其他類別邊界內(nèi)。主要是綠色點被錯誤劃分到橙色點的邊界內(nèi)。

說明:

contourf()函數(shù)用于繪制等高線,并會填充輪廓,f指fill
參數(shù):
x為x軸坐標(biāo)值,在只有兩個屬性的樣本數(shù)據(jù)集中,x對應(yīng)樣本數(shù)據(jù)中的屬性x1.
y為y軸坐標(biāo)值,對應(yīng)樣本數(shù)據(jù)中的屬性x2.
z為等高線的高度,一般對應(yīng)分類問題中的目標(biāo)變量y,
cmap:設(shè)置等高線填充色的映射規(guī)則,可選值為:plt.cm.jet、plt.cm.ocean、plt.cm.hsv
更多顏色:https://matplotlib.org/examples/color/colormaps_reference.html
contourf()功能演示:

n = 256 import numpy as np x = np.linspace(-3, 3, n)#生成x坐標(biāo) y = np.linspace(-3, 3, n)#生成y坐標(biāo) X, Y = np.meshgrid(x, y)#組合x、y,形成二維坐標(biāo) # 計算x,y坐標(biāo)對應(yīng)的類別值Z(是連續(xù)變量) def fun(x, y):Z = (1-x/2+x**3+y**5) * np.exp(-x**2-y**2)return ZZ = fun(X,Y) import matplotlib.pyplot as plt plt.contourf(X, Y, Z) plt.xlabel('x') plt.ylabel('y')

效果如下:

總結(jié)

以上是生活随笔為你收集整理的python sns绘制回归线_SVM--支持向量机amp;Python代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。