機器學習技術任務驅動式教程-課件匯 模塊7-10 基于支持向量機的分類預測 -基于深度學習的分類預測_第1頁
機器學習技術任務驅動式教程-課件匯 模塊7-10 基于支持向量機的分類預測 -基于深度學習的分類預測_第2頁
機器學習技術任務驅動式教程-課件匯 模塊7-10 基于支持向量機的分類預測 -基于深度學習的分類預測_第3頁
機器學習技術任務驅動式教程-課件匯 模塊7-10 基于支持向量機的分類預測 -基于深度學習的分類預測_第4頁
機器學習技術任務驅動式教程-課件匯 模塊7-10 基于支持向量機的分類預測 -基于深度學習的分類預測_第5頁
已閱讀5頁,還剩431頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

數據觀察數據清洗數據轉換SVM模型訓練SVM模型預測參考書目《機器學習技術任務驅動式教程》基于支持向量機的分類預測模塊7機器學習技術目錄乳腺癌預測手寫數字識別傳感器連通預測小結習題七基于支持向量機的分類預測模塊7機器學習技術乳腺癌(breastcarcinoma,BC)是女性最常見的惡性腫瘤之一,據資料統計,發病率占全身各種惡性腫瘤的7-10%,因此早期發現及治療非常重要,對其檢測的關鍵挑戰是如何將腫瘤分為惡性(癌性)或良性(非癌性)。1.1任務描述1

乳腺癌預測breast-cancer-kaggle.csv來自Kaggle網站提供的威斯康星州乳腺癌(診斷)數據,有569條癌癥病人檢測樣本,其中惡性樣本212條、良性樣本357條,每個樣本有32個字段。詳細的字段描述見下表。1.1任務描述1

乳腺癌預測字段類型允許為空標簽?例子idint否否842302diagnosis(診斷結果)str否是M:Malignant(惡性)B:Benign(良性)radius_mean/se/worst(半徑平均、標準差、最差)float否否17.99texture_mean(紋理平均、標準差、最差)float否否10.38perimeter_mean(周邊平均、標準差、最差)float否否122.80area_mean(面積平均、標準差、最差)float否否1001.0smoothness_mean(平滑度平均、標準差、最差)float否否0.11840compactness_mean(緊密度平均、標準差、最差)float否否0.27760concavity_mean(凹度平均、標準差、最差)float否否0.3001concavepoints_mean(凸度平均、標準差、最差)float否否0.1471symmetry_mean(對稱性平均、標準差、最差)float否否0.2419fractal_dimension_mean(分形維數平均、標準差、最差)float否否0.07871要求使用SVM和breast-cancer-kaggle.csv建立分類模型,預測病人腫瘤是良性還是惡性。任務目標1

乳腺癌預測1.2

任務分解import方式引入依賴的模塊檢查字段值和類型刪除任務無關或冗余的字段依賴庫導入數據探查數據清洗從探查數據內容開始,通過數據清洗和數據轉換加工原始數據,使用SVM模型找到決策函數,最后用實例解析SVM算法原理。1.2

任務分解文本轉換到數值;數據集切分為訓練集和測試集;實施標準化轉換、歸一化轉換和降維在訓練集上訓練SVM模型不同分布的人工數據集可視化SVM決策函數和樣本的空間分布,理解SVM算法思想和超參數數據轉換模型訓練SVM實例解析接上1

乳腺癌預測1.3

任務實施1.3.1依賴庫導入步驟1:定義2級標題。##<fontcolor="black">依賴庫導入</font>按“SHIFT+Enter”,運行結果如下:1

乳腺癌預測1.3

任務實施步驟2:導入依賴庫。importpandasaspdimportnumpyasnpfromsklearn.svmimportSVCfromsklearn.model_selectionimporttrain_test_splitimportmatplotlib.pyplotaspltimportmatplotlibasmplfromsklearn.preprocessingimportStandardScaler,Normalizer,LabelEncoder1

乳腺癌預測1.3

任務實施fromsklearn.decompositionimportPCAfromsklearn.metricsimportroc_auc_score,roc_curve,accuracy_scorefromsklearn.treeimportDecisionTreeClassifierfromsklearn.datasets._samples_generatorimportmake_blobs,make_circles接上1

乳腺癌預測1.3

任務實施1.3.2數據探查步驟1:定義2級標題。##<fontcolor="black">數據探查</font>按“SHIFT+Enter”,運行結果如下:1

乳腺癌預測1.3

任務實施步驟2:讀入數據集文件到DataFrame對象。df_data=pd.read_csv("../data/breast-cancer-kaggle.csv")df_data.shape運行結果如下:1

乳腺癌預測1.3

任務實施步驟3:檢查前5個樣本。df_data.head()運行結果如下:diagnoisis(標簽):M(惡性),B(良性)1

乳腺癌預測1.3

任務實施步驟4:查看數據類型。df_()運行結果如下:從上面的輸出可以看出,數據集有569條樣本,每個樣本有32個字段。其中字段”id”和預測無關,可以刪除。1

乳腺癌預測1.3

任務實施1.3.3數據清洗步驟1:定義2級標題。#<fontcolor=“black”>數據清洗</font>按“SHIFT+Enter”,運行結果如下:1

乳腺癌預測1.3

任務實施步驟2:刪除"id"列。all_data=df_data.drop("id",axis=1)all_data.head()運行結果:1

乳腺癌預測1.3

任務實施1.3.4數據轉換步驟1:定義2級標題。#<fontcolor="black">數據轉換</font>按“SHIFT+Enter”,運行結果如下:1

乳腺癌預測3.3

任務實施步驟2:“diagnosis”字段從文本轉換到數值。le=LabelEncoder()all_data["diagnosis"]=le.fit_transform(all_data["diagnosis"])all_()運行結果:1

乳腺癌預測1.3

任務實施步驟3:拆分出特征和標簽。X=all_data.iloc[:,1:].valuesy=all_data.iloc[:,0].valuesX.shape,y.shape運行結果:1

乳腺癌預測1.3

任務實施步驟4:數據集拆分成訓練集和測試集,測試集占30%。X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)X_train.shape,X_test.shape,y_train.shape,y_test.shape運行結果:1

乳腺癌預測1.3

任務實施步驟4:數據集拆分成訓練集和測試集,測試集占20%。X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)X_train.shape,X_test.shape,y_train.shape,y_test.shape運行結果:1

乳腺癌預測1.3

任務實施,其中x是特征值,xmean是特征平均值,xstd是特征標準偏差。scaler=StandardScaler()X_train_scaled=scaler.fit_transform(X_train)X_test_scaled=scaler.transform(X_test)X_train[0,0:5],X_train_scaled[0][0:5]1

乳腺癌預測步驟5:調用StandardScaler類標準化特征,特征標準化后服從(0,1)正態分布。標準化公式:

1.3

任務實施1

乳腺癌預測運行結果:,其中x是特征值,|X|是樣本向量大小。步驟6:調用Normalizer類歸一化特征,特征歸一化后樣本向量大小為1。歸一化公式:

1.3

任務實施normalizer=Normalizer()X_train_normalized=normalizer.fit_transform(X_train_scaled)X_test_normalized=normalizer.transform(X_test_scaled)X_train_normalized[0][0:5]運行結果:1

乳腺癌預測1.3

任務實施pca=PCA(n_components=20,random_state=51592)X_train_decomposed=pca.fit_transform(X_train_normalized)X_test_decomposed=pca.transform(X_test_normalized)X_train_normalized.shape,X_train_decomposed.shape1

乳腺癌預測步驟7:調用PCA類降低數據維度,避免不相關特征帶來過擬合問題。運行結果:1.3

任務實施1.3.5模型訓練步驟1:定義2級標題。##<fontcolor="black">模型訓練</font>按“SHIFT+Enter”,運行結果如下:1

乳腺癌預測1.3

任務實施步驟2:在訓練集上訓練SVM模型。svm_model=SVC(kernel="linear",random_state=2)svm_model.fit(X_train_decomposed,y_train)運行結果:1

乳腺癌預測1.3

任務實施步驟3:計算測試準確率。y_test_pred=svm_model.predict(X_test_decomposed)test_score=accuracy_score(y_test,y_test_pred)"準確率:{:.2f}".format(test_score*100)運行結果:1

乳腺癌預測1.3

任務實施步驟4:計算置信度(樣本到決策邊界的距離)。大于0預測為1,小于0預測為0,越大或越小表示預測結果越確定。deci=svm_model.decision_function(X_test_decomposed)(deci>0).sum()==(y_test_pred==1).sum()按“SHIFT+Enter”,運行結果如下:上面的結果表明deci>0和y_test_pred==1等價。1

乳腺癌預測支持向量機支持向量機(SupportVectorMachine,SVM)的基本原理:尋找一個分類器使得超平面和最近的數據點之間的分類邊緣(超平面和最近的數據點之間的間隔被稱為分類邊緣)最大。SVM算法通常認為分類邊緣越大,平面越優,具有“最大間隔”的決策面就是SVM要尋找的最優解。最優解對應兩側虛線要穿過的樣本點,稱為“支持向量”。支持向量機kernel=”linear”效果不好時再嘗試kernel=“rbf”,也可以用GridSearchCV嘗試其它的kernel。Sklearn庫的SVC類實現了SVM模型,定義如下:classsklearn.svm.SVC(C=1.0,kernel='rbf',gamma='scale',class_weight=None,**kargs)參數C:int,默認值1.0懲罰系數。一般需要通過交叉驗證選擇一個合適的C。kernel:默認值rbf

核函數。四種選擇:”linear”(線性),“poly”(多項式),“rbf”(高斯),“sigmoid”。gamma:float,默認值auto。核函數參數。kernel=“linear”時不起作用。class_weight:float

樣本權重。訓練集中某類樣本數量過多時,建議設置為“balanced”。如果樣本類別分布沒有明顯的偏移,忽略這個參數。1.3

任務實施1.3.6SVM實例解析SVM根據數據與決策函數的最大間隔選擇決策函數。根據線性可分和線性不可分2種情況,示例SVM算法的設計思路。步驟1:定義2級標題。##<fontcolor="black">SVM實例解析</font>按“SHIFT+Enter”,運行結果如下:1

乳腺癌預測1.3

任務實施步驟2:如果數據集可以用線性分類器劃分,稱為線性可分。定義3級標題。###<fontcolor="black">線性可分</font>運行結果:1

乳腺癌預測步驟3:定義4級標題。####<fontcolor="black">硬間隔</font>1.3

任務實施運行結果:1

乳腺癌預測步驟4:構造模擬數據。X,y=make_blobs(n_samples=60,centers=2,cluster_std=0.4,random_state=0)plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=plt.cm.Paired)1.3

任務實施運行結果:1

乳腺癌預測1.3

任務實施1

乳腺癌預測步驟5:可視化樣本和分類器(用函數表示)的最大間隔(分類器和樣本邊界的距離)。#Matplotlib支持中文字符mpl.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False#畫樣本plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=plt.cm.Paired)1.3

任務實施#畫函數x_fit=np.linspace(0,3,50)y_1=1*x_fit+0.8plt.plot(x_fit,y_1,'-c)#畫邊距plt.fill_between(x_fit,y_1-0.6,y_1+0.6,edgecolor='none',color='#AAAAAA',alpha=0.4)接上1

乳腺癌預測1.3

任務實施#畫函數y_2=-0.3*x_fit+3plt.plot(x_fit,y_2,'-k')#畫邊距plt.fill_between(x_fit,y_2-0.4,y_2+0.4,edgecolor='none',color='#AAAAAA',alpha=0.4)接上1

乳腺癌預測1.3

任務實施運行結果如下:從圖中看出,藍色線與數據集最大間隔大于黑色線的,因此藍色線代表的函數更優。1

乳腺癌預測支持向量機提供了在眾多可能的分類器之間進行選擇的原則,確保對未知數據集具有更高的泛化性。1.3

任務實施1

乳腺癌預測步驟6:訓練SVM分類器。svm_model=SVC(kernel='linear')svm_model.fit(X,y)運行結果:1.3

任務實施1

乳腺癌預測步驟7:準備SVM分類器參數。#最佳函數w=svm_model.coef_[0]b=svm_ercept_[0]a=-w[0]/w[1]y_3=a*x_fit-b/w[1]1.3

任務實施#最大邊距下界b_down=svm_model.support_vectors_[0]y_down=a*x_fit+b_down[1]-a*b_down[0]#最大邊距上界b_up=svm_model.support_vectors_[-1]y_up=a*x_fit+b_up[1]-a*b_up[0]接上1

乳腺癌預測1.3

任務實施1

乳腺癌預測步驟8:可視化樣本和線性SVM的最大間隔。#畫散點圖plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=plt.cm.Paired)#畫函數plt.plot(x_fit,y_3,'-c')#畫邊距plt.fill_between(x_fit,y_down,y_up,edgecolor='none',color='#AAAAAA',alpha=0.4)1.3

任務實施#畫支持向量plt.scatter(svm_model.support_vectors_[:,0],svm_model.support_vectors_[:,1],edgecolor='b',s=80,facecolors='none')接上1

乳腺癌預測1.3

任務實施運行結果如下:帶藍邊的點是距離SVM分類器最近的點,稱之為支持向量。1

乳腺癌預測可以看出,SVM分類器有著和數據集盡量大的最大間隔。1.3

任務實施1

乳腺癌預測步驟9:定義4級標題。####<fontcolor="black">軟間隔</font>運行結果:軟間隔相比于硬間隔而言,允許個別樣本出現在間隔帶中。如果沒有一個原則進行約束,滿足軟間隔的分類器就會出現很多條。SVC對分錯的數據進行懲罰,參數C就是懲罰參數。懲罰參數越小,容忍性就越大。1.3

任務實施1

乳腺癌預測步驟10:構造離散度更大的模擬數據。X,y=make_blobs(n_samples=60,centers=2,cluster_std=0.9,random_state=0)plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=plt.cm.Paired)運行結果:1.3

任務實施1

乳腺癌預測步驟11:可視化SVM模型(C=1)。svm_model=SVC(kernel='linear',C=1)svm_model.fit(X,y)#最佳函數w=svm_model.coef_[0]b=svm_ercept_[0]a=-w[0]/w[1]x_fit=np.linspace(-1.5,4,50)y_3=a*x_fit-b/w[1]1.3

任務實施#最大邊距下界b_down=svm_model.support_vectors_[0]y_down=a*x_fit+b_down[1]-a*b_down[0]#最大邊距上界b_up=svm_model.support_vectors_[-1]y_up=a*x_fit+b_up[1]-a*b_up[0]#畫散點圖plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=plt.cm.Paired)接上1

乳腺癌預測1.3

任務實施#畫函數plt.plot(x_fit,y_3,'-c')#畫邊距plt.fill_between(x_fit,y_down,y_up,edgecolor='none',color='#AAAAAA',alpha=0.4)#畫支持向量plt.scatter(svm_model.support_vectors_[:,0],svm_model.support_vectors_[:,1],edgecolor='black',s=80,facecolors='none')接上1

乳腺癌預測1.3

任務實施運行結果如下:懲罰參數C=0.2時,SVM會更具包容性,從而兼容更多的錯分樣本。1

乳腺癌預測1.3

任務實施1

乳腺癌預測步驟12:進一步放松樣本出現在間隔帶的限制,可視化SVM模型(C=0.2)。svm_model=SVC(kernel='linear',C=0.2)svm_model.fit(X,y)#最佳函數w=svm_model.coef_[0]b=svm_ercept_[0]a=-w[0]/w[1]y_3=a*x_fit-b/w[1]1.3

任務實施#最大邊距下界b_down=svm_model.support_vectors_[10]y_down=a*x_fit+b_down[1]-a*b_down[0]#最大邊距上界b_up=svm_model.support_vectors_[1]y_up=a*x_fit+b_up[1]-a*b_up[0]#畫散點圖plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=plt.cm.Paired)接上1

乳腺癌預測1.3

任務實施#畫函數plt.plot(x_fit,y_3,'-c')#畫邊距plt.fill_between(x_fit,y_down,y_up,edgecolor='none',color='#AAAAAA',alpha=0.4)#畫支持向量plt.scatter(svm_model.support_vectors_[:,0],svm_model.support_vectors_[:,1],edgecolor='black',s=80,facecolors='none')接上1

乳腺癌預測1.3

任務實施運行結果如下:懲罰參數C=0.2時,SVM會更具包容性,從而兼容更多的錯分樣本。1

乳腺癌預測1.3

任務實施1

乳腺癌預測步驟13:定義3級標題。###<fontcolor="black">線性不可分</font>運行結果:步驟14:低維數據不可分時,映射到高維空間。定義4級標題。###<fontcolor=“black”>超平面</font>1.3

任務實施1

乳腺癌預測運行結果:步驟15:構造線性不可分的模擬數據。X,y=make_circles(100,factor=.1,noise=.1,random_state=0)plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=plt.cm.Paired)1.3

任務實施運行結果如下:如果遇到這樣的數據集,沒有辦法利用線性分類器進行分類。1

乳腺癌預測1.3

任務實施1

乳腺癌預測步驟16:可以將二維(低維)空間的數據映射到三維(高維)空間后,通過一個超平面劃分數據,目的在于使用SVM在高維空間找到超平面的能力。#畫出映射到3維空間的樣本r=np.exp(-(X[:,0]**2+X[:,1]**2))ax=plt.subplot(projection='3d')ax.scatter3D(X[:,0],X[:,1],r,c=y,s=50,cmap=plt.cm.Paired)ax.set_xlabel('x')1.3

任務實施ax.set_ylabel('y')ax.set_zlabel('z')#畫一個平面分隔樣本x_1,y_1=np.meshgrid(np.linspace(-1,1),np.linspace(-1,1))z=0.01*x_1+0.01*y_1+0.5ax.plot_surface(x_1,y_1,z,alpha=0.3)接上1

乳腺癌預測1.3

任務實施運行結果如下:1

乳腺癌預測1.3

任務實施1

乳腺癌預測步驟17:在SVC中,可以用高斯核函數來實現這一功能:kernel='rbf'。#訓練kernel="rbf"的SVC模型clf=SVC(kernel='rbf')clf.fit(X,y)#畫出樣本plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=plt.cm.Paired)#構造meshgrid樣本x=np.linspace(-1,1)y=np.linspace(-1,1)1.3

任務實施x_1,y_1=np.meshgrid(x,y)P=np.zeros_like(x_1)fori,xiinenumerate(x):

forj,yjinenumerate(y): #計算meshgrid樣本的置信度

P[i,j]=clf.decision_function(np.array([[xi,yj]]))接上1

乳腺癌預測1.3

任務實施#畫出meshgrid等高線ax=plt.gca()ax.contour(x_1,y_1,P,colors='k',levels=[-1,0,0.9],alpha=0.5,linestyles=['--','-','--'])#畫出支持向量plt.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],edgecolor='b',s=80,facecolors='none')接上1

乳腺癌預測1.3

任務實施運行結果如下:1

乳腺癌預測SVM優缺點優點缺點有嚴格的數學理論支持,可解釋性強,不依靠統計方法,簡化算法流程;能找出對任務至關重要的關鍵樣本(即:支持向量);采用核技巧之后,可以處理非線性分類/回歸任務;最終決策函數只由少數的支持向量所確定,計算的復雜性取決于支持向量的數目,而不是樣本空間的維數,這在某種意義上避免了“維數災難”。訓練時間長。有些情況下(比如SMO)每次都需要挑選一對參數,因此時間復雜度為O(N2),其中N為訓練樣本的數量;當采用核技巧時,如果需要存儲核矩陣,則空間復雜度為O(N2);模型預測時,預測時間與支持向量的個數成正比,當支持向量較大時,預測計算復雜度較高。數據源由optdigits.tra和optdigits.tes組成,43人手寫的數字經過MNIST提供的預處理程序處理,有30個人手寫數字包含在optdigits.tra(訓練集),另外13個人手寫數字構成optdigits.tes(測試集)。每個手寫數字32x32位圖劃分為4x4的非重疊塊,并在每個塊中計數可視化像素數量。最終,生成8x8的輸入矩陣,其中每個元素都是0到16范圍內的整數,這降低了尺寸并且恒等產生了小的變形。2.1任務描述2手寫數字識別2.1任務描述應用SVM技術,實現手寫數字自動識別功能。任務目標下圖是一個0的8x8矩陣。樣本向量:(0,1,6,15,12,1,0,0,0,7,16,6,6,10,0,0,0,8,16,2,0,11,2,0,0,5,16,3,0,5,7,0,0,7,13,3,0,8,7,0,0,4,12,0,1,13,5,0,0,0,14,9,15,9,0,0,0,0,6,14,7,1,0,0)2手寫數字識別2.2

任務分解import方式引入依賴的模塊文件讀入到DataFrame對象DataFrame對象轉換到Numpy特征和標簽依賴庫導入數據讀取數據轉換讀取文件到內存后,在訓練集上訓練SVM模型,在測試集上評估模型,分析模型錯分樣本原因。2手寫數字識別2.2

任務分解構建SVM模型,然后在訓練集上訓練模型,在測試集上評估模型精度使用交叉驗證方法在參數子空間中找到模型最優參數使用模型的最優參數重新在訓練集上訓練模型,在測試集上評估模型精度模型訓練參數查找最優模型訓練接上可視化錯分樣本,分析錯誤樣本的特點,總結錯分規律最優模型訓練2手寫數字識別2.3

任務實施2.3.1依賴庫導入步驟1:定義2級標題。##<fontcolor="black">依賴庫導入</font>按“SHIFT+Enter”,運行結果如下:2手寫數字識別2.3

任務實施步驟2:導入依賴庫。importpandasaspdimportnumpyasnpfromsklearn.svmimportSVCfromsklearn.metricsimportaccuracy_scorefromsklearn.model_selectionimportGridSearchCVimportmatplotlib.pyplotaspltimportmatplotlibasmpl2手寫數字識別2.3

任務實施2.3.2數據讀取步驟1:定義2級標題。##<fontcolor="black">數據讀取</font>按“SHIFT+Enter”,運行結果如下:2手寫數字識別2.3

任務實施步驟2:讀取訓練集。train_df=pd.read_csv("../data/optdigits.tra",dtype=int,header=None)train_df.describe()2手寫數字識別運行結果:2.3

任務實施步驟3:讀取測試集。test_df=pd.read_csv("../data/optdigits.tes",dtype=int,header=None)train_df.describe()2手寫數字識別運行結果:2.3

任務實施2.3.3數據轉換步驟1:定義2級標題。##<fontcolor="black">數據轉換</font>按“SHIFT+Enter”,運行結果如下:2手寫數字識別2.3

任務實施步驟2:訓練數據轉換到Numpy類型。X_train=train_df.iloc[:,:-1].valuesy_train=train_df.iloc[:,-1].valuesX_train.shape,y_train.shape2手寫數字識別運行結果:2.3

任務實施步驟3:測試數據轉換到Numpy類型。X_test=test_df.iloc[:,:-1].valuesy_test=test_df.iloc[:,-1].valuesX_test.shape,y_test.shape2手寫數字識別運行結果:2.3

任務實施2.3.4模型訓練步驟1:定義2級標題。##<fontcolor="black">模型訓練</font>按“SHIFT+Enter”,運行結果如下:2手寫數字識別2.3

任務實施步驟2:建立SVM模型。model=SVC(kernel="rbf",random_state=0)model.fit(X_train,y_train)2手寫數字識別運行結果:2.3

任務實施步驟3:在測試集上評估模型。y_test_pred=model.predict(X_test)test_score=accuracy_score(y_test,y_test_pred)"測試準確率:{:.2f}".format(test_score*100)2手寫數字識別運行結果:2.3

任務實施2.3.5參數查找調整SVC類初始化參數將影響模型性能,常用的初始化參數包括:kernel:核函數類型,常用值有"rbf"或"linear",默認值是"rbf"。C:松弛系數的懲罰項系數。如果C值設定比較大,那SVC可能會選擇邊際較小的,能夠更好地分類所有訓練點的決策邊界;如果C的設定值較小,那SVC會盡量最大化邊界,決策功能會更簡單,但代價是訓練的準確度。gamma:核函數的系數,僅在參數kernel的選項為"rbf",“poly"和"sigmoid"的時候有效。接下來GridSearchCV搜索kernel和C值空間,找到最優參數。2手寫數字識別2.3

任務實施步驟1:定義2級標題。##<fontcolor="black">參數查找</font>2手寫數字識別運行結果:步驟2:搜索kernel和C組合在訓練集上的性能,找到最優參數。params={"kernel":["rbf","linear"],"C":np.logspace(0,3,5)}model=GridSearchCV(SVC(random_state=0,gamma=4e-4),param_grid=params,cv=5)2.3

任務實施model.fit(X_train,y_train)print("最好的參數是:{},它的精確度:{:.2f}".format(model.best_params_,model.best_score_*100))接上2手寫數字識別運行結果:numpy.logspaceNumpy中的logspace()函數可以在指定的范圍內生成等比數列,以10為底數取對數。比如生成從10的0次方到10的4次方之間5個數,可以使用logspace(0,4,5)函數。np.logspace(0,3,5)運行結果:2.3

任務實施2.3.6最優參數模型訓練步驟1:定義2級標題。##<fontcolor="black">最優參數模型訓練</font>按“SHIFT+Enter”,運行結果如下:2手寫數字識別2.3

任務實施步驟2:在訓練集上重新訓練SVM模型。model=SVC(kernel=model.best_params_["kernel"],C=model.best_params_["C"],gamma=4e-4,random_state=0)model.fit(X_train,y_train)2手寫數字識別運行結果:2.3

任務實施步驟3:在測試集上重新評估模型。y_test_pred=model.predict(X_test)test_score=accuracy_score(y_test,y_test_pred)"測試準確率:{:.2f}".format(test_score*100)2手寫數字識別運行結果:最優參數訓練的模型與默認參數訓練的模型相比,從97.61提到到97.83。2.3

任務實施2.3.7錯分樣本可視化步驟1:定義2級標題。##<fontcolor="black">錯分樣本可視化</font>按“SHIFT+Enter”,運行結果如下:2手寫數字識別2.3

任務實施步驟2:Matplotlib支持中文字符。mpl.rcParams['font.sans-serif']=['SimHei']2手寫數字識別步驟3:篩選預測錯誤的圖片數據。err_images=X_test[y_test!=y_test_pred]err_y_hat=y_test_pred[y_test!=y_test_pred]err_y=y_test[y_test!=y_test_pred]2.3

任務實施步驟4:顯示預測錯誤的數字圖片。forindex,imageinenumerate(err_images):

image=image.reshape(8,8)

ifindex>=12:

#只顯示12張圖片

break

#在index+1位置顯示數字圖片

plt.subplot(3,4,index+1) plt.imshow(image,cmap=plt.cm.gray_r,interpolation='nearest')2手寫數字識別2.3

任務實施 plt.title('{}錯分為{}'.format(err_y[index],err_y_hat[index]))plt.tight_layout()接上2手寫數字識別運行結果:從圖中看出,7錯分最常見,經常錯分到5或9。本次數據為半導體制造工藝數據集,數據集包括3個文件:sensor_train.csv、sensor_test.csv、sensor_test_label.csv。訓練文件(train.csv)

1253個樣本,每個樣本包含591個特征和1個標簽(0:成功,1:失敗)。測試文件(sensor_test.csv)

314個樣本,每個樣本包含591個特征。3.1任務描述3

傳感器連通預測3.1任務描述應用SVM技術,訓練一個可以智能監測半導體制造過程的分類模型,評估傳感器內部線測試是否順利通過(二值分類問題),并在測試數據集上嘗試獲得最優結果。任務目標測試標簽文件(sensor_test_label.csv)314個分類標簽,其中傳遞失敗記錄20個(labels為1)、傳遞成功記錄294個(labels為0),通過第1列的索引對應測試文件(sensor_test.csv)的樣本特征。3

傳感器連通預測3.2

任務分解import方式引入依賴的模塊文件讀入到DataFrame對象在原有特征基礎上構造統計特征依賴庫導入數據探查特征工程讀取文件到內存后,在訓練集上采用交叉驗證找到SVM模型的最優參數,訓練最優參數的分類模型,可視化模型在測試集上的AUC曲線。刪除任務無關或冗余的字段數據清洗3

傳感器連通預測3.2

任務分解數據集切分為訓練集和測試集,實施標準化轉換、歸一化轉換和降維構建SVM模型,然后在訓練集上訓練模型,在測試集上評估模型使用交叉驗證方法在參數子空間中找到模型最優參數數據轉換模型訓練參數查找接上重新在訓練集上訓練最優模型,在測試集上評估模型,可視化ROC曲線最優模型訓練3

傳感器連通預測3.3

任務實施3.3.1依賴庫導入步驟1:定義2級標題。##<fontcolor="black">依賴庫導入</font>按“SHIFT+Enter”,運行結果如下:3

傳感器連通預測3.3

任務實施步驟2:導入依賴庫。importpandasaspdimportnumpyasnpfromsklearn.svmimportSVCfromsklearn.metricsimportaccuracy_scorefromsklearn.model_selectionimportGridSearchCVimportmatplotlib.pyplotaspltimportmatplotlibasmpl3

傳感器連通預測3.3

任務實施fromsklearn.preprocessingimportStandardScaler,Normalizerfromsklearn.decompositionimportPCAfromsklearn.metricsimportroc_auc_score,roc_curvefromscipy.statsimportmedian_abs_deviation接上3

傳感器連通預測3.3

任務實施3.3.2數據探查步驟1:定義2級標題。##<fontcolor="black">數據探查</font>按“SHIFT+Enter”,運行結果如下:3

傳感器連通預測3.3

任務實施步驟2:定義3級標題。3

傳感器連通預測###<fontcolor="black">訓練集</font>按“SHIFT+Enter”,運行結果如下:步驟3:讀取訓練集。train_df=pd.read_csv("../data/sensor_train.csv",index_col=0,parse_dates=['timestamp'])train_df.shape2.3

任務實施按“SHIFT+Enter”,運行結果如下:2手寫數字識別步驟4:查看前5個樣本。train_df.head()運行結果如下,其中列”timestamp”解析為datetime格式。3.3

任務實施步驟5:查看字段類型。3

傳感器連通預測train_()按“SHIFT+Enter”,運行結果如下:表明訓練集有1253個樣本,592個字段,labels字段是標簽。3.3

任務實施步驟6:定義3級標題。3

傳感器連通預測###<fontcolor="black">測試集</font>按“SHIFT+Enter”,運行結果如下:步驟7:讀取測試集。test_df=pd.read_csv("../data/sensor_test.csv",index_col=0,parse_dates=['timestamp'])test_df.shape3.3

任務實施3

傳感器連通預測按“SHIFT+Enter”,運行結果如下:步驟8:查看前5個樣本。test_df.head()運行結果如下。測試集比訓練集少了標簽字段。3.3

任務實施步驟9:查看字段類型。3

傳感器連通預測test_()按“SHIFT+Enter”,運行結果如下:表明測試集有314個樣本,591個字段。另外,測試集和訓練集的索引唯一,合并后的索引用來關聯來源。3.3

任務實施3.3.3特征工程從原有特征構造新特征。步驟1:定義2級標題。##<fontcolor="black">特征工程</font>按“SHIFT+Enter”,運行結果如下:3

傳感器連通預測3.3

任務實施步驟2:訓練集刪除列"label"后與測試集按行合并。3

傳感器連通預測all_df=pd.concat([train_df.drop('labels',axis=1),test_df])all_df.shape按“SHIFT+Enter”,運行結果如下:步驟3:按照索引升序排列all_df。all_df=all_df.sort_index()all_df.head()3.3

任務實施3

傳感器連通預測按“SHIFT+Enter”,運行結果如下:步驟4:定義feature_engineering函數構造新特征。deffeature_engineering(data):

new_data=pd.DataFrame()

new_data["count(x)"]=data.count(axis=1)#非NAN個數

new_data["sum(x)"]=data.iloc[:,1:].sum(axis=1)#和3.3

任務實施 new_data["mean(x)"]=data.iloc[:,1:].mean(axis=1)#均值 new_data["mad(x)"]=median_abs_deviation(data.iloc[:,1:],axis=1,nan_policy="omit")#中位絕對離差 new_data[“median(x)”]=data.iloc[:,1:].median(axis=1)#中位數 new_data[“min(x)”]=data.iloc[:,1:].min(axis=1)#按行取最小值 new_data[“max(x)”]=data.iloc[:,1:].max(axis=1)#按行取最大值 new_data[“prod(x)”]=data.iloc[:,1:].prod(axis=1)#按行取乘積 new_data[“std(x)”]=data.iloc[:,1:].std(axis=1)#按行求標準差接上3

傳感器連通預測3.3

任務實施 new_data[“var(x)”]=data.iloc[:,1:].var(axis=1)#按行求無偏誤差 new_data[“skew(x)”]=data.iloc[:,1:].skew(axis=1)#按行求無偏偏度 new_data[“kurt(x)”]=data.iloc[:,1:].kurt(axis=1)#按行求無偏峰度 new_data["month(timestamp)"]=data["timestamp"].dt.month#月份 new_data["day(timestamp)"]=data["timestamp"].dt.day#日

new_data["hour(timestamp)"]=data["timestamp"].dt.hour#小時 new_data["weekday(timestamp)"]=data["timestamp"].dt.weekday#星期 returnnew_data接上3

傳感器連通預測3.3

任務實施3

傳感器連通預測new_features=feature_engineering(all_df)步驟5:新特征添加到數據集。print("原數據集形狀:{}".format(all_df.shape))features=pd.concat([all_df,new_features],axis=1)print("添加新特征后的數據集形狀:{}".format(features.shape))按“SHIFT+Enter”,運行結果如下:3.3

任務實施3.3.4數據清洗步驟1:定義2級標題。##<fontcolor="black">數據清洗</font>按“SHIFT+Enter”,運行結果如下:3

傳感器連通預測3.3

任務實施步驟3:用0填充空值。features=features.fillna(0)3

傳感器連通預測步驟2:month(timestamp)/day(timestamp)/hour(timestamp)/weekday(timestamp)包含”timestamp",刪除”timestamp”。features=features.drop('timestamp',axis=1)3.3

任務實施3.3.5數據轉換步驟1:定義2級標題。##<fontcolor="black">數據轉換</font>按“SHIFT+Enter”,運行結果如下:3

傳感器連通預測3.3

任務實施3

傳感器連通預測步驟2:從新數據集中拆分成訓練集和測試集,DataFrame.index對應數據來源。X_train=features.iloc[train_df.index,:]X_test=features.iloc[test_df.index,:]X_train.shape,X_test.shape按“SHIFT+Enter”,運行結果如下:3.3

任務實施3

傳感器連通預測步驟3:標準化數據。scaler=StandardScaler()X_train_scaled=scaler.fit_transform(X_train)X_test_scaled=scaler.transform(X_test)print("原數據為:\n",X_train.iloc[0,0:5])print("標準化后的數據為:\n",X_train_scaled[0][0:5])按“SHIFT+Enter”,運行結果如下:3.3

任務實施3

傳感器連通預測按“SHIFT+Enter”,運行結果如下:步驟4:正則化數據。normalizer=Normalizer()X_train_normalized=normalizer.fit_transform(X_train_scaled)X_test_normalized=normalizer.transform(X_test_scaled)print("正則化后的數據為:\n",X_train_normalized[0][0:5])3.3

任務實施3

傳感器連通預測按“SHIFT+Enter”,運行結果如下:步驟5:特征太多影響預測,降低維度到20。pca=PCA(n_components=20,random_state=0)X_train_decomposed=pca.fit_transform(X_train_normalized)X_test_decomposed=pca.transform(X_test_normalized)X_train_decomposed.shape,X_test_decomposed.shape按“SHIFT+Enter”,運行結果如下:3.3

任務實施3.3.6模型訓練步驟1:定義2級標題。##<fontcolor="black">模型訓練</font>按“SHIFT+Enter”,運行結果如下:3

傳感器連通預測3.3

任務實施3

傳感器連通預測步驟2:讀入訓練集和測試集標簽。y_train=train_df.loc[:,"labels"].valuestest_label_data=pd.read_csv("../data/sensor_test_label.csv",index_col=0)y_test=test_label_data.loc[:,"labels"]步驟3:在訓練集上訓練SVM模型。model=SVC(kernel='rbf',random_state=0)model.fit(X_train_decomposed,y_train)3.3

任務實施3

傳感器連通預測按“SHIFT+Enter”,運行結果如下:步驟4:在測試集上評估模型。y_test_pred=model.predict(X_test_decomposed)test_score=accuracy_score(y_test,y_test_pred)"準確率:{:.2f}".format(test_score*100)按“SHIFT+Enter”,運行結果如下:3.3

任務實施3

傳感器連通預測步驟5:準確率很高,但AUC未必。test_auc=roc_auc_score(y_test,y_test_pred)"AUC:{}".format(test_auc)按“SHIFT+Enter”,運行結果如下:監督學習性能指標TP是預測值和真值都為1的樣本數,FN是預測值為0但真值為1的樣本數,FP是預測值為1但真值為0的樣本數,TN是預測值和真值都為0的樣本數。常用的監督學習性能評價指標有:準確率召回率ROC曲線精確率AUC監督學習性能指標

監督學習性能指標

監督學習性能指標5.AUCAUC的全稱是“AreaundertheCurveofROC”,即為ROC曲線下的面積。當樣本分布不平衡時,只用準確率往往不能反映分類器的好壞。比如數據集有9個正類樣本(真值為0)、1個負類樣本(真值為1),最簡單的分類器就是把所有的樣本都預測為0,那么精度就是90%,顯然這樣的分類器沒有價值。如果我們用AUC評價這個最簡單的分類器就會發現,ROC就是1條斜率為1的斜線,AUC是ROC曲線下的面積,即0.5。分類器只有大于0.5時才有價值,這就為我們提供了一個除精度以外的性能指標。3.3

任務實施3.3.7參數查找接下來GridSearchCV搜索C和gamma的取值空間,找到模型AUC指標最好的參數步驟1:定義2級標題。##<fontcolor="black">參數查找</font>按“SHIFT+Enter”,運行結果如下:3

傳感器連通預測3.3

任務實施3

傳感器連通預測步驟2:查看樣本標簽的分布。ir=np.sum(y_train==0)/np.sum(y_train==1)f"不平衡率:{ir:.2f}"結果表明正負類樣本嚴重不平衡,嘗試設置class_weight參數。按“SHIFT+Enter”,運行結果如下:3.3

任務實施3

傳感器連通預測步驟3:評估class_weight=14時模型的測試準確率。model=SVC(kernel='rbf',class_weight={0:1,1:14},random_state=0)model.fit(X_train_decomposed,y_train)y_test_pred=model.predict(X_test_decomposed)print("準確率:{:.2f}".format(test_score*100))test_auc=roc_auc_score(y_test,y_test_pred)print("AUC:{:.4f}".format(test_auc))按“SHIFT+Enter”,運行結果如下:3.3

任務實施3

傳感器連通預測按“SHIFT+Enter”,運行結果如下:步驟4:查找最優C和gamma參數。params={"C":np.logspace(0,3,3),"gamma":np.logspace(-3,0,3)}gs=GridSearchCV(SVC(kernel='rbf',class_weight={0:1,1:14},random_state=0),param_grid=params,cv=5,scoring="roc_auc")gs.fit(X_train_decomposed,y_train)3.3

任務實施接上3

傳感器連通預測print("最好的參數是:{},AUC:{:.4f}".format(gs.best_params_,gs.best_score_))按“SHIFT+Enter”,運行結果如下:3.3

任務實施3.3.8最優參數模型訓練步驟1:定義2級標題。##<fontcolor="black">最優參數模型訓練</font>按“SHIFT+Enter”,運行結果如下:3

傳感器連通預測3.3

任務實施3

傳感器連通預測步驟2:在訓練集上重新訓練SVM模型。model=SVC(kernel='rbf',random_state=0,class_weight={0:1,1:14},C=gs.best_params_["C"],gamma=gs.best_params_["gamma"])model.fit(X_train_decomposed,y_train)按“SHIFT+Enter”,運行結果如下:3.3

任務實施3

傳感器連通預測步驟3:在測試集上重新評估模型。y_test_pred=model.predict(X_test_decomposed)test_score=accuracy_score(y_test,y_test_pred)"準確率:{:.2f}".format(test_score*100)按“SHIFT+Enter”,運行結果如下:3.3

任務實施3

傳感器連通預測步驟4:準確率降低,但AUC上升。test_auc=roc_auc_score(y_test,y_test_pred)"AUC:{:4f}".format(test_auc)按“SHIFT+Enter”,運行結果如下:3.3

任務實施3

傳感器連通預測步驟5:計算tpr和fpr,thresholds取deci最小值和最大值之間的值以及無窮大。deci=model.decision_function(X_test_decomposed)fpr,tpr,thresholds=roc_curve(y_test,y_score=deci,pos_label=1)fpr,tpr,thresholds3.3

任務實施3

傳感器連通預測按“SHIFT+Enter”,運行結果如下:3.3

任務實施3

傳感器連通預測步驟6:設置Matplotlib畫圖時的中文字體。mpl.rcParams['font.sans-serif']=['SimHei']步驟7:畫出ROC曲線。plt.plot(fpr,tpr,"k--",label=f"AUC(面積{test_auc:.4f})")plt.xlabel("假陽率")plt.ylabel("真陽率")plt.legend(loc="lowerright")3.3

任務實施3

傳感器連通預測按“SHIFT+Enter”,運行結果如下:小結分類型特征需要使用OrdinalEncoder函數轉換到數值型索引后參與訓練。分類型標簽需要使用LabelEncoder函數轉換到數值型索引后參與訓練。包含空值的樣本只有填充默認值(比如平均值)后保留,其他有空值的樣本將被刪除。SVM算法可處理線性可分和線性不可分的數據。SVM模型使用kernel=”rbf”會將低維線性不可分數據映射到高維線性可分數據。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論