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

歡迎訪問 生活随笔!

生活随笔

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

python

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

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

(一)基礎理論部分

如果對支持向量機的基礎理論推導感興趣,這里分享一個經典的視頻:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(二)Python實戰

演示數據集:

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

提取碼:3u2b

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

#導入數據 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 '''#認識數據:數據可視化 import seaborn as sns sns.lmplot(data=data,x='Sugar',y='Butter',palette='Set1',fit_reg=False,hue='CakeType',scatter_kws={'s':150}) ''' lmplot()參數說明: palette='Set1'設置調色板型號,對應不同繪圖風格,色彩搭配。 fit_reg=False表示不顯示擬合的回歸線。因為lmplot()本身是線性回歸繪圖函數,默認會繪制點的擬合回歸線。 hue='CakeType'表示對樣本點按照'CakeType'的取值不同進行分類顯示,這樣不同類型的蛋糕會用不同顏色顯示。若不設置hue參數,則所有點都會顯示為一個顏色顯示。 scatter_kws={'s':150}:設置點的大小,其中s表示size。 '''

效果如下:


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

#數據預處理 #將CakeType的值映射到0、1,方便后續模型運算 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參數說明: C:懲罰系數,即當分類器錯誤地將A類樣本劃分為B類了,我們將給予分類器多大的懲罰。當我們給與非常大的懲罰,即C的值設置的很大,那么分類器會變得非常精準,但是,會產生過擬合問題。 kernel:核函數,如果使用一條直線就可以將屬于不同類別的樣本點全部劃分開,那么我們使用kernel='linear', 如果不能線性劃分開,尤其是當數據維度很多時,一般很難找到一條合適的線將不同的類別的樣本劃分開,那么就嘗試使用高斯核函數(也稱為徑向基核函數-rbf)、多項式核函數(poly) ''' svc.fit(X=x,y=label)#根據擬合結果,找出超平面 w = svc.coef_[0] a = -w[0]/w[1]#超平面的斜率,也是邊界線的斜率 xx = np.linspace(5,30)#生成5~30之間的50個數 #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]#根據超平面,找到超平面的兩條邊界線 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='--')

效果如下:

# 調整參數C,看看會有什么不同? svc = SVC(kernel='linear',C=0.001) svc.fit(X=x,y=label)#根據擬合結果,找出超平面 w = svc.coef_[0] a = -w[0]/w[1] xx = np.linspace(5,30) yy = a * xx - (svc.intercept_[0])/w[1]#根據超平面,找到超平面的兩條邊界線 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='--')

效果如下:

可以發現,當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 '''#認識數據:數據可視化 import seaborn as sns sns.lmplot(data=data,x='Sugar',y='Butter',palette='Set1',fit_reg=False,hue='CakeType',scatter_kws={'s':150})


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

#數據預處理 #將CakeType的值映射到0、1、2,方便后續模型運算 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') ''' 參數說明: decision_function_shape:設置分類器決策模式,有兩種模式:ovr和ovo ovr表示one vs rest模式,即比較某一個類別和其他所有類別; ovo表示one vs one模式,即一對一地比較(兩兩比較)兩個類別,如果樣本數據有ABC3個類別,則需要比較3次,分別是比較A和B,比較A和C,比較B和C。 ovo模式需要比較的次數會多于ovr模式,但是,ovo模式對于類別不均衡的樣本數據具有較好的穩定性。 ''' svc.fit(X=x,y=label) label_predict = svc.predict(X=x)#繪制三分類超平面和邊界線 #生成坐標 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_max的距離,所以,即使使用的相同步長(Step),生成的兩組數可能長度并不一樣。 ''' numpy 中arange()用于生成一組連續的數,可以指定數的起點、終點、和步長。 print(np.arange(0,3,0.05))#生成[0,3)之間,以0.05為步長的一組數 #結果: [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值,形成一個個點(二維坐標),用于后續預測這些點的類別 xx, yy = np.meshgrid(x_value,y_value) ''' numpy中的meshgrid()函數根據輸入的兩組數生成兩個二維數組,并且這兩個數組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()])#使用分類器對生成的坐標點進行預測類別 Z = Z.reshape(xx.shape)#轉換預測結果Z的格式,使得可以與坐標點一一對應#繪制原始數據的散點圖(此時,類型數據是真實值) ax = sns.scatterplot(data.Sugar, y=data.Butter,hue=label,palette='Set2') ax.legend(loc="lower right") #繪制基于預測值的分界面,即分類器的邊界 from matplotlib import pyplot as plt plt.contourf(xx, yy, Z, alpha=0.3)

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

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

說明:

contourf()函數用于繪制等高線,并會填充輪廓,f指fill
參數:
x為x軸坐標值,在只有兩個屬性的樣本數據集中,x對應樣本數據中的屬性x1.
y為y軸坐標值,對應樣本數據中的屬性x2.
z為等高線的高度,一般對應分類問題中的目標變量y,
cmap:設置等高線填充色的映射規則,可選值為: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坐標 y = np.linspace(-3, 3, n)#生成y坐標 X, Y = np.meshgrid(x, y)#組合x、y,形成二維坐標 # 計算x,y坐標對應的類別值Z(是連續變量) 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')

效果如下:

總結

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

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