




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
數(shù)據(jù)觀察數(shù)據(jù)清洗數(shù)據(jù)轉(zhuǎn)換SVM模型訓(xùn)練SVM模型預(yù)測(cè)參考書(shū)目《機(jī)器學(xué)習(xí)技術(shù)任務(wù)驅(qū)動(dòng)式教程》基于支持向量機(jī)的分類(lèi)預(yù)測(cè)模塊7機(jī)器學(xué)習(xí)技術(shù)目錄乳腺癌預(yù)測(cè)手寫(xiě)數(shù)字識(shí)別傳感器連通預(yù)測(cè)小結(jié)習(xí)題七基于支持向量機(jī)的分類(lèi)預(yù)測(cè)模塊7機(jī)器學(xué)習(xí)技術(shù)乳腺癌(breastcarcinoma,BC)是女性最常見(jiàn)的惡性腫瘤之一,據(jù)資料統(tǒng)計(jì),發(fā)病率占全身各種惡性腫瘤的7-10%,因此早期發(fā)現(xiàn)及治療非常重要,對(duì)其檢測(cè)的關(guān)鍵挑戰(zhàn)是如何將腫瘤分為惡性(癌性)或良性(非癌性)。1.1任務(wù)描述1
乳腺癌預(yù)測(cè)breast-cancer-kaggle.csv來(lái)自Kaggle網(wǎng)站提供的威斯康星州乳腺癌(診斷)數(shù)據(jù),有569條癌癥病人檢測(cè)樣本,其中惡性樣本212條、良性樣本357條,每個(gè)樣本有32個(gè)字段。詳細(xì)的字段描述見(jiàn)下表。1.1任務(wù)描述1
乳腺癌預(yù)測(cè)字段類(lèi)型允許為空標(biāo)簽?例子idint否否842302diagnosis(診斷結(jié)果)str否是M:Malignant(惡性)B:Benign(良性)radius_mean/se/worst(半徑平均、標(biāo)準(zhǔn)差、最差)float否否17.99texture_mean(紋理平均、標(biāo)準(zhǔn)差、最差)float否否10.38perimeter_mean(周邊平均、標(biāo)準(zhǔn)差、最差)float否否122.80area_mean(面積平均、標(biāo)準(zhǔn)差、最差)float否否1001.0smoothness_mean(平滑度平均、標(biāo)準(zhǔn)差、最差)float否否0.11840compactness_mean(緊密度平均、標(biāo)準(zhǔn)差、最差)float否否0.27760concavity_mean(凹度平均、標(biāo)準(zhǔn)差、最差)float否否0.3001concavepoints_mean(凸度平均、標(biāo)準(zhǔn)差、最差)float否否0.1471symmetry_mean(對(duì)稱(chēng)性平均、標(biāo)準(zhǔn)差、最差)float否否0.2419fractal_dimension_mean(分形維數(shù)平均、標(biāo)準(zhǔn)差、最差)float否否0.07871要求使用SVM和breast-cancer-kaggle.csv建立分類(lèi)模型,預(yù)測(cè)病人腫瘤是良性還是惡性。任務(wù)目標(biāo)1
乳腺癌預(yù)測(cè)1.2
任務(wù)分解import方式引入依賴(lài)的模塊檢查字段值和類(lèi)型刪除任務(wù)無(wú)關(guān)或冗余的字段依賴(lài)庫(kù)導(dǎo)入數(shù)據(jù)探查數(shù)據(jù)清洗從探查數(shù)據(jù)內(nèi)容開(kāi)始,通過(guò)數(shù)據(jù)清洗和數(shù)據(jù)轉(zhuǎn)換加工原始數(shù)據(jù),使用SVM模型找到?jīng)Q策函數(shù),最后用實(shí)例解析SVM算法原理。1.2
任務(wù)分解文本轉(zhuǎn)換到數(shù)值;數(shù)據(jù)集切分為訓(xùn)練集和測(cè)試集;實(shí)施標(biāo)準(zhǔn)化轉(zhuǎn)換、歸一化轉(zhuǎn)換和降維在訓(xùn)練集上訓(xùn)練SVM模型不同分布的人工數(shù)據(jù)集可視化SVM決策函數(shù)和樣本的空間分布,理解SVM算法思想和超參數(shù)數(shù)據(jù)轉(zhuǎn)換模型訓(xùn)練SVM實(shí)例解析接上1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施1.3.1依賴(lài)庫(kù)導(dǎo)入步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">依賴(lài)庫(kù)導(dǎo)入</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施步驟2:導(dǎo)入依賴(lài)庫(kù)。importpandasaspdimportnumpyasnpfromsklearn.svmimportSVCfromsklearn.model_selectionimporttrain_test_splitimportmatplotlib.pyplotaspltimportmatplotlibasmplfromsklearn.preprocessingimportStandardScaler,Normalizer,LabelEncoder1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施fromsklearn.decompositionimportPCAfromsklearn.metricsimportroc_auc_score,roc_curve,accuracy_scorefromsklearn.treeimportDecisionTreeClassifierfromsklearn.datasets._samples_generatorimportmake_blobs,make_circles接上1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施1.3.2數(shù)據(jù)探查步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">數(shù)據(jù)探查</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施步驟2:讀入數(shù)據(jù)集文件到DataFrame對(duì)象。df_data=pd.read_csv("../data/breast-cancer-kaggle.csv")df_data.shape運(yùn)行結(jié)果如下:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施步驟3:檢查前5個(gè)樣本。df_data.head()運(yùn)行結(jié)果如下:diagnoisis(標(biāo)簽):M(惡性),B(良性)1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施步驟4:查看數(shù)據(jù)類(lèi)型。df_()運(yùn)行結(jié)果如下:從上面的輸出可以看出,數(shù)據(jù)集有569條樣本,每個(gè)樣本有32個(gè)字段。其中字段”id”和預(yù)測(cè)無(wú)關(guān),可以刪除。1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施1.3.3數(shù)據(jù)清洗步驟1:定義2級(jí)標(biāo)題。#<fontcolor=“black”>數(shù)據(jù)清洗</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施步驟2:刪除"id"列。all_data=df_data.drop("id",axis=1)all_data.head()運(yùn)行結(jié)果:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施1.3.4數(shù)據(jù)轉(zhuǎn)換步驟1:定義2級(jí)標(biāo)題。#<fontcolor="black">數(shù)據(jù)轉(zhuǎn)換</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1
乳腺癌預(yù)測(cè)3.3
任務(wù)實(shí)施步驟2:“diagnosis”字段從文本轉(zhuǎn)換到數(shù)值。le=LabelEncoder()all_data["diagnosis"]=le.fit_transform(all_data["diagnosis"])all_()運(yùn)行結(jié)果:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施步驟3:拆分出特征和標(biāo)簽。X=all_data.iloc[:,1:].valuesy=all_data.iloc[:,0].valuesX.shape,y.shape運(yùn)行結(jié)果:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施步驟4:數(shù)據(jù)集拆分成訓(xùn)練集和測(cè)試集,測(cè)試集占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運(yùn)行結(jié)果:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施步驟4:數(shù)據(jù)集拆分成訓(xùn)練集和測(cè)試集,測(cè)試集占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運(yùn)行結(jié)果:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施,其中x是特征值,xmean是特征平均值,xstd是特征標(biāo)準(zhǔn)偏差。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
乳腺癌預(yù)測(cè)步驟5:調(diào)用StandardScaler類(lèi)標(biāo)準(zhǔn)化特征,特征標(biāo)準(zhǔn)化后服從(0,1)正態(tài)分布。標(biāo)準(zhǔn)化公式:
1.3
任務(wù)實(shí)施1
乳腺癌預(yù)測(cè)運(yùn)行結(jié)果:,其中x是特征值,|X|是樣本向量大小。步驟6:調(diào)用Normalizer類(lèi)歸一化特征,特征歸一化后樣本向量大小為1。歸一化公式:
1.3
任務(wù)實(shí)施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]運(yùn)行結(jié)果:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施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
乳腺癌預(yù)測(cè)步驟7:調(diào)用PCA類(lèi)降低數(shù)據(jù)維度,避免不相關(guān)特征帶來(lái)過(guò)擬合問(wèn)題。運(yùn)行結(jié)果:1.3
任務(wù)實(shí)施1.3.5模型訓(xùn)練步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">模型訓(xùn)練</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施步驟2:在訓(xùn)練集上訓(xùn)練SVM模型。svm_model=SVC(kernel="linear",random_state=2)svm_model.fit(X_train_decomposed,y_train)運(yùn)行結(jié)果:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施步驟3:計(jì)算測(cè)試準(zhǔn)確率。y_test_pred=svm_model.predict(X_test_decomposed)test_score=accuracy_score(y_test,y_test_pred)"準(zhǔn)確率:{:.2f}".format(test_score*100)運(yùn)行結(jié)果:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施步驟4:計(jì)算置信度(樣本到?jīng)Q策邊界的距離)。大于0預(yù)測(cè)為1,小于0預(yù)測(cè)為0,越大或越小表示預(yù)測(cè)結(jié)果越確定。deci=svm_model.decision_function(X_test_decomposed)(deci>0).sum()==(y_test_pred==1).sum()按“SHIFT+Enter”,運(yùn)行結(jié)果如下:上面的結(jié)果表明deci>0和y_test_pred==1等價(jià)。1
乳腺癌預(yù)測(cè)支持向量機(jī)支持向量機(jī)(SupportVectorMachine,SVM)的基本原理:尋找一個(gè)分類(lèi)器使得超平面和最近的數(shù)據(jù)點(diǎn)之間的分類(lèi)邊緣(超平面和最近的數(shù)據(jù)點(diǎn)之間的間隔被稱(chēng)為分類(lèi)邊緣)最大。SVM算法通常認(rèn)為分類(lèi)邊緣越大,平面越優(yōu),具有“最大間隔”的決策面就是SVM要尋找的最優(yōu)解。最優(yōu)解對(duì)應(yīng)兩側(cè)虛線(xiàn)要穿過(guò)的樣本點(diǎn),稱(chēng)為“支持向量”。支持向量機(jī)kernel=”linear”效果不好時(shí)再?lài)L試kernel=“rbf”,也可以用GridSearchCV嘗試其它的kernel。Sklearn庫(kù)的SVC類(lèi)實(shí)現(xiàn)了SVM模型,定義如下:classsklearn.svm.SVC(C=1.0,kernel='rbf',gamma='scale',class_weight=None,**kargs)參數(shù)C:int,默認(rèn)值1.0懲罰系數(shù)。一般需要通過(guò)交叉驗(yàn)證選擇一個(gè)合適的C。kernel:默認(rèn)值rbf
核函數(shù)。四種選擇:”linear”(線(xiàn)性),“poly”(多項(xiàng)式),“rbf”(高斯),“sigmoid”。gamma:float,默認(rèn)值auto。核函數(shù)參數(shù)。kernel=“l(fā)inear”時(shí)不起作用。class_weight:float
樣本權(quán)重。訓(xùn)練集中某類(lèi)樣本數(shù)量過(guò)多時(shí),建議設(shè)置為“balanced”。如果樣本類(lèi)別分布沒(méi)有明顯的偏移,忽略這個(gè)參數(shù)。1.3
任務(wù)實(shí)施1.3.6SVM實(shí)例解析SVM根據(jù)數(shù)據(jù)與決策函數(shù)的最大間隔選擇決策函數(shù)。根據(jù)線(xiàn)性可分和線(xiàn)性不可分2種情況,示例SVM算法的設(shè)計(jì)思路。步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">SVM實(shí)例解析</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施步驟2:如果數(shù)據(jù)集可以用線(xiàn)性分類(lèi)器劃分,稱(chēng)為線(xiàn)性可分。定義3級(jí)標(biāo)題。###<fontcolor="black">線(xiàn)性可分</font>運(yùn)行結(jié)果:1
乳腺癌預(yù)測(cè)步驟3:定義4級(jí)標(biāo)題。####<fontcolor="black">硬間隔</font>1.3
任務(wù)實(shí)施運(yùn)行結(jié)果:1
乳腺癌預(yù)測(cè)步驟4:構(gòu)造模擬數(shù)據(jù)。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
任務(wù)實(shí)施運(yùn)行結(jié)果:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施1
乳腺癌預(yù)測(cè)步驟5:可視化樣本和分類(lèi)器(用函數(shù)表示)的最大間隔(分類(lèi)器和樣本邊界的距離)。#Matplotlib支持中文字符mpl.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False#畫(huà)樣本plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=plt.cm.Paired)1.3
任務(wù)實(shí)施#畫(huà)函數(shù)x_fit=np.linspace(0,3,50)y_1=1*x_fit+0.8plt.plot(x_fit,y_1,'-c)#畫(huà)邊距plt.fill_between(x_fit,y_1-0.6,y_1+0.6,edgecolor='none',color='#AAAAAA',alpha=0.4)接上1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施#畫(huà)函數(shù)y_2=-0.3*x_fit+3plt.plot(x_fit,y_2,'-k')#畫(huà)邊距plt.fill_between(x_fit,y_2-0.4,y_2+0.4,edgecolor='none',color='#AAAAAA',alpha=0.4)接上1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施運(yùn)行結(jié)果如下:從圖中看出,藍(lán)色線(xiàn)與數(shù)據(jù)集最大間隔大于黑色線(xiàn)的,因此藍(lán)色線(xiàn)代表的函數(shù)更優(yōu)。1
乳腺癌預(yù)測(cè)支持向量機(jī)提供了在眾多可能的分類(lèi)器之間進(jìn)行選擇的原則,確保對(duì)未知數(shù)據(jù)集具有更高的泛化性。1.3
任務(wù)實(shí)施1
乳腺癌預(yù)測(cè)步驟6:訓(xùn)練SVM分類(lèi)器。svm_model=SVC(kernel='linear')svm_model.fit(X,y)運(yùn)行結(jié)果:1.3
任務(wù)實(shí)施1
乳腺癌預(yù)測(cè)步驟7:準(zhǔn)備SVM分類(lèi)器參數(shù)。#最佳函數(shù)w=svm_model.coef_[0]b=svm_ercept_[0]a=-w[0]/w[1]y_3=a*x_fit-b/w[1]1.3
任務(wù)實(shí)施#最大邊距下界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
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施1
乳腺癌預(yù)測(cè)步驟8:可視化樣本和線(xiàn)性SVM的最大間隔。#畫(huà)散點(diǎn)圖plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=plt.cm.Paired)#畫(huà)函數(shù)plt.plot(x_fit,y_3,'-c')#畫(huà)邊距plt.fill_between(x_fit,y_down,y_up,edgecolor='none',color='#AAAAAA',alpha=0.4)1.3
任務(wù)實(shí)施#畫(huà)支持向量plt.scatter(svm_model.support_vectors_[:,0],svm_model.support_vectors_[:,1],edgecolor='b',s=80,facecolors='none')接上1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施運(yùn)行結(jié)果如下:帶藍(lán)邊的點(diǎn)是距離SVM分類(lèi)器最近的點(diǎn),稱(chēng)之為支持向量。1
乳腺癌預(yù)測(cè)可以看出,SVM分類(lèi)器有著和數(shù)據(jù)集盡量大的最大間隔。1.3
任務(wù)實(shí)施1
乳腺癌預(yù)測(cè)步驟9:定義4級(jí)標(biāo)題。####<fontcolor="black">軟間隔</font>運(yùn)行結(jié)果:軟間隔相比于硬間隔而言,允許個(gè)別樣本出現(xiàn)在間隔帶中。如果沒(méi)有一個(gè)原則進(jìn)行約束,滿(mǎn)足軟間隔的分類(lèi)器就會(huì)出現(xiàn)很多條。SVC對(duì)分錯(cuò)的數(shù)據(jù)進(jìn)行懲罰,參數(shù)C就是懲罰參數(shù)。懲罰參數(shù)越小,容忍性就越大。1.3
任務(wù)實(shí)施1
乳腺癌預(yù)測(cè)步驟10:構(gòu)造離散度更大的模擬數(shù)據(jù)。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)運(yùn)行結(jié)果:1.3
任務(wù)實(shí)施1
乳腺癌預(yù)測(cè)步驟11:可視化SVM模型(C=1)。svm_model=SVC(kernel='linear',C=1)svm_model.fit(X,y)#最佳函數(shù)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
任務(wù)實(shí)施#最大邊距下界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]#畫(huà)散點(diǎn)圖plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=plt.cm.Paired)接上1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施#畫(huà)函數(shù)plt.plot(x_fit,y_3,'-c')#畫(huà)邊距plt.fill_between(x_fit,y_down,y_up,edgecolor='none',color='#AAAAAA',alpha=0.4)#畫(huà)支持向量plt.scatter(svm_model.support_vectors_[:,0],svm_model.support_vectors_[:,1],edgecolor='black',s=80,facecolors='none')接上1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施運(yùn)行結(jié)果如下:懲罰參數(shù)C=0.2時(shí),SVM會(huì)更具包容性,從而兼容更多的錯(cuò)分樣本。1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施1
乳腺癌預(yù)測(cè)步驟12:進(jìn)一步放松樣本出現(xiàn)在間隔帶的限制,可視化SVM模型(C=0.2)。svm_model=SVC(kernel='linear',C=0.2)svm_model.fit(X,y)#最佳函數(shù)w=svm_model.coef_[0]b=svm_ercept_[0]a=-w[0]/w[1]y_3=a*x_fit-b/w[1]1.3
任務(wù)實(shí)施#最大邊距下界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]#畫(huà)散點(diǎn)圖plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=plt.cm.Paired)接上1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施#畫(huà)函數(shù)plt.plot(x_fit,y_3,'-c')#畫(huà)邊距plt.fill_between(x_fit,y_down,y_up,edgecolor='none',color='#AAAAAA',alpha=0.4)#畫(huà)支持向量plt.scatter(svm_model.support_vectors_[:,0],svm_model.support_vectors_[:,1],edgecolor='black',s=80,facecolors='none')接上1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施運(yùn)行結(jié)果如下:懲罰參數(shù)C=0.2時(shí),SVM會(huì)更具包容性,從而兼容更多的錯(cuò)分樣本。1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施1
乳腺癌預(yù)測(cè)步驟13:定義3級(jí)標(biāo)題。###<fontcolor="black">線(xiàn)性不可分</font>運(yùn)行結(jié)果:步驟14:低維數(shù)據(jù)不可分時(shí),映射到高維空間。定義4級(jí)標(biāo)題。###<fontcolor=“black”>超平面</font>1.3
任務(wù)實(shí)施1
乳腺癌預(yù)測(cè)運(yùn)行結(jié)果:步驟15:構(gòu)造線(xiàn)性不可分的模擬數(shù)據(jù)。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
任務(wù)實(shí)施運(yùn)行結(jié)果如下:如果遇到這樣的數(shù)據(jù)集,沒(méi)有辦法利用線(xiàn)性分類(lèi)器進(jìn)行分類(lèi)。1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施1
乳腺癌預(yù)測(cè)步驟16:可以將二維(低維)空間的數(shù)據(jù)映射到三維(高維)空間后,通過(guò)一個(gè)超平面劃分?jǐn)?shù)據(jù),目的在于使用SVM在高維空間找到超平面的能力。#畫(huà)出映射到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
任務(wù)實(shí)施ax.set_ylabel('y')ax.set_zlabel('z')#畫(huà)一個(gè)平面分隔樣本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
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施運(yùn)行結(jié)果如下:1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施1
乳腺癌預(yù)測(cè)步驟17:在SVC中,可以用高斯核函數(shù)來(lái)實(shí)現(xiàn)這一功能:kernel='rbf'。#訓(xùn)練kernel="rbf"的SVC模型clf=SVC(kernel='rbf')clf.fit(X,y)#畫(huà)出樣本plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap=plt.cm.Paired)#構(gòu)造meshgrid樣本x=np.linspace(-1,1)y=np.linspace(-1,1)1.3
任務(wù)實(shí)施x_1,y_1=np.meshgrid(x,y)P=np.zeros_like(x_1)fori,xiinenumerate(x):
forj,yjinenumerate(y): #計(jì)算meshgrid樣本的置信度
P[i,j]=clf.decision_function(np.array([[xi,yj]]))接上1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施#畫(huà)出meshgrid等高線(xiàn)ax=plt.gca()ax.contour(x_1,y_1,P,colors='k',levels=[-1,0,0.9],alpha=0.5,linestyles=['--','-','--'])#畫(huà)出支持向量plt.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],edgecolor='b',s=80,facecolors='none')接上1
乳腺癌預(yù)測(cè)1.3
任務(wù)實(shí)施運(yùn)行結(jié)果如下:1
乳腺癌預(yù)測(cè)SVM優(yōu)缺點(diǎn)優(yōu)點(diǎn)缺點(diǎn)有嚴(yán)格的數(shù)學(xué)理論支持,可解釋性強(qiáng),不依靠統(tǒng)計(jì)方法,簡(jiǎn)化算法流程;能找出對(duì)任務(wù)至關(guān)重要的關(guān)鍵樣本(即:支持向量);采用核技巧之后,可以處理非線(xiàn)性分類(lèi)/回歸任務(wù);最終決策函數(shù)只由少數(shù)的支持向量所確定,計(jì)算的復(fù)雜性取決于支持向量的數(shù)目,而不是樣本空間的維數(shù),這在某種意義上避免了“維數(shù)災(zāi)難”。訓(xùn)練時(shí)間長(zhǎng)。有些情況下(比如SMO)每次都需要挑選一對(duì)參數(shù),因此時(shí)間復(fù)雜度為O(N2),其中N為訓(xùn)練樣本的數(shù)量;當(dāng)采用核技巧時(shí),如果需要存儲(chǔ)核矩陣,則空間復(fù)雜度為O(N2);模型預(yù)測(cè)時(shí),預(yù)測(cè)時(shí)間與支持向量的個(gè)數(shù)成正比,當(dāng)支持向量較大時(shí),預(yù)測(cè)計(jì)算復(fù)雜度較高。數(shù)據(jù)源由optdigits.tra和optdigits.tes組成,43人手寫(xiě)的數(shù)字經(jīng)過(guò)MNIST提供的預(yù)處理程序處理,有30個(gè)人手寫(xiě)數(shù)字包含在optdigits.tra(訓(xùn)練集),另外13個(gè)人手寫(xiě)數(shù)字構(gòu)成optdigits.tes(測(cè)試集)。每個(gè)手寫(xiě)數(shù)字32x32位圖劃分為4x4的非重疊塊,并在每個(gè)塊中計(jì)數(shù)可視化像素?cái)?shù)量。最終,生成8x8的輸入矩陣,其中每個(gè)元素都是0到16范圍內(nèi)的整數(shù),這降低了尺寸并且恒等產(chǎn)生了小的變形。2.1任務(wù)描述2手寫(xiě)數(shù)字識(shí)別2.1任務(wù)描述應(yīng)用SVM技術(shù),實(shí)現(xiàn)手寫(xiě)數(shù)字自動(dòng)識(shí)別功能。任務(wù)目標(biāo)下圖是一個(gè)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手寫(xiě)數(shù)字識(shí)別2.2
任務(wù)分解import方式引入依賴(lài)的模塊文件讀入到DataFrame對(duì)象DataFrame對(duì)象轉(zhuǎn)換到Numpy特征和標(biāo)簽依賴(lài)庫(kù)導(dǎo)入數(shù)據(jù)讀取數(shù)據(jù)轉(zhuǎn)換讀取文件到內(nèi)存后,在訓(xùn)練集上訓(xùn)練SVM模型,在測(cè)試集上評(píng)估模型,分析模型錯(cuò)分樣本原因。2手寫(xiě)數(shù)字識(shí)別2.2
任務(wù)分解構(gòu)建SVM模型,然后在訓(xùn)練集上訓(xùn)練模型,在測(cè)試集上評(píng)估模型精度使用交叉驗(yàn)證方法在參數(shù)子空間中找到模型最優(yōu)參數(shù)使用模型的最優(yōu)參數(shù)重新在訓(xùn)練集上訓(xùn)練模型,在測(cè)試集上評(píng)估模型精度模型訓(xùn)練參數(shù)查找最優(yōu)模型訓(xùn)練接上可視化錯(cuò)分樣本,分析錯(cuò)誤樣本的特點(diǎn),總結(jié)錯(cuò)分規(guī)律最優(yōu)模型訓(xùn)練2手寫(xiě)數(shù)字識(shí)別2.3
任務(wù)實(shí)施2.3.1依賴(lài)庫(kù)導(dǎo)入步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">依賴(lài)庫(kù)導(dǎo)入</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2手寫(xiě)數(shù)字識(shí)別2.3
任務(wù)實(shí)施步驟2:導(dǎo)入依賴(lài)庫(kù)。importpandasaspdimportnumpyasnpfromsklearn.svmimportSVCfromsklearn.metricsimportaccuracy_scorefromsklearn.model_selectionimportGridSearchCVimportmatplotlib.pyplotaspltimportmatplotlibasmpl2手寫(xiě)數(shù)字識(shí)別2.3
任務(wù)實(shí)施2.3.2數(shù)據(jù)讀取步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">數(shù)據(jù)讀取</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2手寫(xiě)數(shù)字識(shí)別2.3
任務(wù)實(shí)施步驟2:讀取訓(xùn)練集。train_df=pd.read_csv("../data/optdigits.tra",dtype=int,header=None)train_df.describe()2手寫(xiě)數(shù)字識(shí)別運(yùn)行結(jié)果:2.3
任務(wù)實(shí)施步驟3:讀取測(cè)試集。test_df=pd.read_csv("../data/optdigits.tes",dtype=int,header=None)train_df.describe()2手寫(xiě)數(shù)字識(shí)別運(yùn)行結(jié)果:2.3
任務(wù)實(shí)施2.3.3數(shù)據(jù)轉(zhuǎn)換步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">數(shù)據(jù)轉(zhuǎn)換</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2手寫(xiě)數(shù)字識(shí)別2.3
任務(wù)實(shí)施步驟2:訓(xùn)練數(shù)據(jù)轉(zhuǎn)換到Numpy類(lèi)型。X_train=train_df.iloc[:,:-1].valuesy_train=train_df.iloc[:,-1].valuesX_train.shape,y_train.shape2手寫(xiě)數(shù)字識(shí)別運(yùn)行結(jié)果:2.3
任務(wù)實(shí)施步驟3:測(cè)試數(shù)據(jù)轉(zhuǎn)換到Numpy類(lèi)型。X_test=test_df.iloc[:,:-1].valuesy_test=test_df.iloc[:,-1].valuesX_test.shape,y_test.shape2手寫(xiě)數(shù)字識(shí)別運(yùn)行結(jié)果:2.3
任務(wù)實(shí)施2.3.4模型訓(xùn)練步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">模型訓(xùn)練</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2手寫(xiě)數(shù)字識(shí)別2.3
任務(wù)實(shí)施步驟2:建立SVM模型。model=SVC(kernel="rbf",random_state=0)model.fit(X_train,y_train)2手寫(xiě)數(shù)字識(shí)別運(yùn)行結(jié)果:2.3
任務(wù)實(shí)施步驟3:在測(cè)試集上評(píng)估模型。y_test_pred=model.predict(X_test)test_score=accuracy_score(y_test,y_test_pred)"測(cè)試準(zhǔn)確率:{:.2f}".format(test_score*100)2手寫(xiě)數(shù)字識(shí)別運(yùn)行結(jié)果:2.3
任務(wù)實(shí)施2.3.5參數(shù)查找調(diào)整SVC類(lèi)初始化參數(shù)將影響模型性能,常用的初始化參數(shù)包括:kernel:核函數(shù)類(lèi)型,常用值有"rbf"或"linear",默認(rèn)值是"rbf"。C:松弛系數(shù)的懲罰項(xiàng)系數(shù)。如果C值設(shè)定比較大,那SVC可能會(huì)選擇邊際較小的,能夠更好地分類(lèi)所有訓(xùn)練點(diǎn)的決策邊界;如果C的設(shè)定值較小,那SVC會(huì)盡量最大化邊界,決策功能會(huì)更簡(jiǎn)單,但代價(jià)是訓(xùn)練的準(zhǔn)確度。gamma:核函數(shù)的系數(shù),僅在參數(shù)kernel的選項(xiàng)為"rbf",“poly"和"sigmoid"的時(shí)候有效。接下來(lái)GridSearchCV搜索kernel和C值空間,找到最優(yōu)參數(shù)。2手寫(xiě)數(shù)字識(shí)別2.3
任務(wù)實(shí)施步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">參數(shù)查找</font>2手寫(xiě)數(shù)字識(shí)別運(yùn)行結(jié)果:步驟2:搜索kernel和C組合在訓(xùn)練集上的性能,找到最優(yōu)參數(shù)。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
任務(wù)實(shí)施model.fit(X_train,y_train)print("最好的參數(shù)是:{},它的精確度:{:.2f}".format(model.best_params_,model.best_score_*100))接上2手寫(xiě)數(shù)字識(shí)別運(yùn)行結(jié)果:numpy.logspaceNumpy中的logspace()函數(shù)可以在指定的范圍內(nèi)生成等比數(shù)列,以10為底數(shù)取對(duì)數(shù)。比如生成從10的0次方到10的4次方之間5個(gè)數(shù),可以使用logspace(0,4,5)函數(shù)。np.logspace(0,3,5)運(yùn)行結(jié)果:2.3
任務(wù)實(shí)施2.3.6最優(yōu)參數(shù)模型訓(xùn)練步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">最優(yōu)參數(shù)模型訓(xùn)練</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2手寫(xiě)數(shù)字識(shí)別2.3
任務(wù)實(shí)施步驟2:在訓(xùn)練集上重新訓(xùn)練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手寫(xiě)數(shù)字識(shí)別運(yùn)行結(jié)果:2.3
任務(wù)實(shí)施步驟3:在測(cè)試集上重新評(píng)估模型。y_test_pred=model.predict(X_test)test_score=accuracy_score(y_test,y_test_pred)"測(cè)試準(zhǔn)確率:{:.2f}".format(test_score*100)2手寫(xiě)數(shù)字識(shí)別運(yùn)行結(jié)果:最優(yōu)參數(shù)訓(xùn)練的模型與默認(rèn)參數(shù)訓(xùn)練的模型相比,從97.61提到到97.83。2.3
任務(wù)實(shí)施2.3.7錯(cuò)分樣本可視化步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">錯(cuò)分樣本可視化</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2手寫(xiě)數(shù)字識(shí)別2.3
任務(wù)實(shí)施步驟2:Matplotlib支持中文字符。mpl.rcParams['font.sans-serif']=['SimHei']2手寫(xiě)數(shù)字識(shí)別步驟3:篩選預(yù)測(cè)錯(cuò)誤的圖片數(shù)據(jù)。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
任務(wù)實(shí)施步驟4:顯示預(yù)測(cè)錯(cuò)誤的數(shù)字圖片。forindex,imageinenumerate(err_images):
image=image.reshape(8,8)
ifindex>=12:
#只顯示12張圖片
break
#在index+1位置顯示數(shù)字圖片
plt.subplot(3,4,index+1) plt.imshow(image,cmap=plt.cm.gray_r,interpolation='nearest')2手寫(xiě)數(shù)字識(shí)別2.3
任務(wù)實(shí)施 plt.title('{}錯(cuò)分為{}'.format(err_y[index],err_y_hat[index]))plt.tight_layout()接上2手寫(xiě)數(shù)字識(shí)別運(yùn)行結(jié)果:從圖中看出,7錯(cuò)分最常見(jiàn),經(jīng)常錯(cuò)分到5或9。本次數(shù)據(jù)為半導(dǎo)體制造工藝數(shù)據(jù)集,數(shù)據(jù)集包括3個(gè)文件:sensor_train.csv、sensor_test.csv、sensor_test_label.csv。訓(xùn)練文件(train.csv)
1253個(gè)樣本,每個(gè)樣本包含591個(gè)特征和1個(gè)標(biāo)簽(0:成功,1:失敗)。測(cè)試文件(sensor_test.csv)
314個(gè)樣本,每個(gè)樣本包含591個(gè)特征。3.1任務(wù)描述3
傳感器連通預(yù)測(cè)3.1任務(wù)描述應(yīng)用SVM技術(shù),訓(xùn)練一個(gè)可以智能監(jiān)測(cè)半導(dǎo)體制造過(guò)程的分類(lèi)模型,評(píng)估傳感器內(nèi)部線(xiàn)測(cè)試是否順利通過(guò)(二值分類(lèi)問(wèn)題),并在測(cè)試數(shù)據(jù)集上嘗試獲得最優(yōu)結(jié)果。任務(wù)目標(biāo)測(cè)試標(biāo)簽文件(sensor_test_label.csv)314個(gè)分類(lèi)標(biāo)簽,其中傳遞失敗記錄20個(gè)(labels為1)、傳遞成功記錄294個(gè)(labels為0),通過(guò)第1列的索引對(duì)應(yīng)測(cè)試文件(sensor_test.csv)的樣本特征。3
傳感器連通預(yù)測(cè)3.2
任務(wù)分解import方式引入依賴(lài)的模塊文件讀入到DataFrame對(duì)象在原有特征基礎(chǔ)上構(gòu)造統(tǒng)計(jì)特征依賴(lài)庫(kù)導(dǎo)入數(shù)據(jù)探查特征工程讀取文件到內(nèi)存后,在訓(xùn)練集上采用交叉驗(yàn)證找到SVM模型的最優(yōu)參數(shù),訓(xùn)練最優(yōu)參數(shù)的分類(lèi)模型,可視化模型在測(cè)試集上的AUC曲線(xiàn)。刪除任務(wù)無(wú)關(guān)或冗余的字段數(shù)據(jù)清洗3
傳感器連通預(yù)測(cè)3.2
任務(wù)分解數(shù)據(jù)集切分為訓(xùn)練集和測(cè)試集,實(shí)施標(biāo)準(zhǔn)化轉(zhuǎn)換、歸一化轉(zhuǎn)換和降維構(gòu)建SVM模型,然后在訓(xùn)練集上訓(xùn)練模型,在測(cè)試集上評(píng)估模型使用交叉驗(yàn)證方法在參數(shù)子空間中找到模型最優(yōu)參數(shù)數(shù)據(jù)轉(zhuǎn)換模型訓(xùn)練參數(shù)查找接上重新在訓(xùn)練集上訓(xùn)練最優(yōu)模型,在測(cè)試集上評(píng)估模型,可視化ROC曲線(xiàn)最優(yōu)模型訓(xùn)練3
傳感器連通預(yù)測(cè)3.3
任務(wù)實(shí)施3.3.1依賴(lài)庫(kù)導(dǎo)入步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">依賴(lài)庫(kù)導(dǎo)入</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3
傳感器連通預(yù)測(cè)3.3
任務(wù)實(shí)施步驟2:導(dǎo)入依賴(lài)庫(kù)。importpandasaspdimportnumpyasnpfromsklearn.svmimportSVCfromsklearn.metricsimportaccuracy_scorefromsklearn.model_selectionimportGridSearchCVimportmatplotlib.pyplotaspltimportmatplotlibasmpl3
傳感器連通預(yù)測(cè)3.3
任務(wù)實(shí)施fromsklearn.preprocessingimportStandardScaler,Normalizerfromsklearn.decompositionimportPCAfromsklearn.metricsimportroc_auc_score,roc_curvefromscipy.statsimportmedian_abs_deviation接上3
傳感器連通預(yù)測(cè)3.3
任務(wù)實(shí)施3.3.2數(shù)據(jù)探查步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">數(shù)據(jù)探查</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3
傳感器連通預(yù)測(cè)3.3
任務(wù)實(shí)施步驟2:定義3級(jí)標(biāo)題。3
傳感器連通預(yù)測(cè)###<fontcolor="black">訓(xùn)練集</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:步驟3:讀取訓(xùn)練集。train_df=pd.read_csv("../data/sensor_train.csv",index_col=0,parse_dates=['timestamp'])train_df.shape2.3
任務(wù)實(shí)施按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2手寫(xiě)數(shù)字識(shí)別步驟4:查看前5個(gè)樣本。train_df.head()運(yùn)行結(jié)果如下,其中列”timestamp”解析為datetime格式。3.3
任務(wù)實(shí)施步驟5:查看字段類(lèi)型。3
傳感器連通預(yù)測(cè)train_()按“SHIFT+Enter”,運(yùn)行結(jié)果如下:表明訓(xùn)練集有1253個(gè)樣本,592個(gè)字段,labels字段是標(biāo)簽。3.3
任務(wù)實(shí)施步驟6:定義3級(jí)標(biāo)題。3
傳感器連通預(yù)測(cè)###<fontcolor="black">測(cè)試集</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:步驟7:讀取測(cè)試集。test_df=pd.read_csv("../data/sensor_test.csv",index_col=0,parse_dates=['timestamp'])test_df.shape3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)按“SHIFT+Enter”,運(yùn)行結(jié)果如下:步驟8:查看前5個(gè)樣本。test_df.head()運(yùn)行結(jié)果如下。測(cè)試集比訓(xùn)練集少了標(biāo)簽字段。3.3
任務(wù)實(shí)施步驟9:查看字段類(lèi)型。3
傳感器連通預(yù)測(cè)test_()按“SHIFT+Enter”,運(yùn)行結(jié)果如下:表明測(cè)試集有314個(gè)樣本,591個(gè)字段。另外,測(cè)試集和訓(xùn)練集的索引唯一,合并后的索引用來(lái)關(guān)聯(lián)來(lái)源。3.3
任務(wù)實(shí)施3.3.3特征工程從原有特征構(gòu)造新特征。步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">特征工程</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3
傳感器連通預(yù)測(cè)3.3
任務(wù)實(shí)施步驟2:訓(xùn)練集刪除列"label"后與測(cè)試集按行合并。3
傳感器連通預(yù)測(cè)all_df=pd.concat([train_df.drop('labels',axis=1),test_df])all_df.shape按“SHIFT+Enter”,運(yùn)行結(jié)果如下:步驟3:按照索引升序排列all_df。all_df=all_df.sort_index()all_df.head()3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)按“SHIFT+Enter”,運(yùn)行結(jié)果如下:步驟4:定義feature_engineering函數(shù)構(gòu)造新特征。deffeature_engineering(data):
new_data=pd.DataFrame()
new_data["count(x)"]=data.count(axis=1)#非NAN個(gè)數(shù)
new_data["sum(x)"]=data.iloc[:,1:].sum(axis=1)#和3.3
任務(wù)實(shí)施 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")#中位絕對(duì)離差 new_data[“median(x)”]=data.iloc[:,1:].median(axis=1)#中位數(shù) 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)#按行求標(biāo)準(zhǔn)差接上3
傳感器連通預(yù)測(cè)3.3
任務(wù)實(shí)施 new_data[“var(x)”]=data.iloc[:,1:].var(axis=1)#按行求無(wú)偏誤差 new_data[“skew(x)”]=data.iloc[:,1:].skew(axis=1)#按行求無(wú)偏偏度 new_data[“kurt(x)”]=data.iloc[:,1:].kurt(axis=1)#按行求無(wú)偏峰度 new_data["month(timestamp)"]=data["timestamp"].dt.month#月份 new_data["day(timestamp)"]=data["timestamp"].dt.day#日
new_data["hour(timestamp)"]=data["timestamp"].dt.hour#小時(shí) new_data["weekday(timestamp)"]=data["timestamp"].dt.weekday#星期 returnnew_data接上3
傳感器連通預(yù)測(cè)3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)new_features=feature_engineering(all_df)步驟5:新特征添加到數(shù)據(jù)集。print("原數(shù)據(jù)集形狀:{}".format(all_df.shape))features=pd.concat([all_df,new_features],axis=1)print("添加新特征后的數(shù)據(jù)集形狀:{}".format(features.shape))按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.3
任務(wù)實(shí)施3.3.4數(shù)據(jù)清洗步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">數(shù)據(jù)清洗</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3
傳感器連通預(yù)測(cè)3.3
任務(wù)實(shí)施步驟3:用0填充空值。features=features.fillna(0)3
傳感器連通預(yù)測(cè)步驟2:month(timestamp)/day(timestamp)/hour(timestamp)/weekday(timestamp)包含”timestamp",刪除”timestamp”。features=features.drop('timestamp',axis=1)3.3
任務(wù)實(shí)施3.3.5數(shù)據(jù)轉(zhuǎn)換步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">數(shù)據(jù)轉(zhuǎn)換</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3
傳感器連通預(yù)測(cè)3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)步驟2:從新數(shù)據(jù)集中拆分成訓(xùn)練集和測(cè)試集,DataFrame.index對(duì)應(yīng)數(shù)據(jù)來(lái)源。X_train=features.iloc[train_df.index,:]X_test=features.iloc[test_df.index,:]X_train.shape,X_test.shape按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)步驟3:標(biāo)準(zhǔn)化數(shù)據(jù)。scaler=StandardScaler()X_train_scaled=scaler.fit_transform(X_train)X_test_scaled=scaler.transform(X_test)print("原數(shù)據(jù)為:\n",X_train.iloc[0,0:5])print("標(biāo)準(zhǔn)化后的數(shù)據(jù)為:\n",X_train_scaled[0][0:5])按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)按“SHIFT+Enter”,運(yùn)行結(jié)果如下:步驟4:正則化數(shù)據(jù)。normalizer=Normalizer()X_train_normalized=normalizer.fit_transform(X_train_scaled)X_test_normalized=normalizer.transform(X_test_scaled)print("正則化后的數(shù)據(jù)為:\n",X_train_normalized[0][0:5])3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)按“SHIFT+Enter”,運(yùn)行結(jié)果如下:步驟5:特征太多影響預(yù)測(cè),降低維度到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”,運(yùn)行結(jié)果如下:3.3
任務(wù)實(shí)施3.3.6模型訓(xùn)練步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">模型訓(xùn)練</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3
傳感器連通預(yù)測(cè)3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)步驟2:讀入訓(xùn)練集和測(cè)試集標(biāo)簽。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:在訓(xùn)練集上訓(xùn)練SVM模型。model=SVC(kernel='rbf',random_state=0)model.fit(X_train_decomposed,y_train)3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)按“SHIFT+Enter”,運(yùn)行結(jié)果如下:步驟4:在測(cè)試集上評(píng)估模型。y_test_pred=model.predict(X_test_decomposed)test_score=accuracy_score(y_test,y_test_pred)"準(zhǔn)確率:{:.2f}".format(test_score*100)按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)步驟5:準(zhǔn)確率很高,但AUC未必。test_auc=roc_auc_score(y_test,y_test_pred)"AUC:{}".format(test_auc)按“SHIFT+Enter”,運(yùn)行結(jié)果如下:監(jiān)督學(xué)習(xí)性能指標(biāo)TP是預(yù)測(cè)值和真值都為1的樣本數(shù),F(xiàn)N是預(yù)測(cè)值為0但真值為1的樣本數(shù),F(xiàn)P是預(yù)測(cè)值為1但真值為0的樣本數(shù),TN是預(yù)測(cè)值和真值都為0的樣本數(shù)。常用的監(jiān)督學(xué)習(xí)性能評(píng)價(jià)指標(biāo)有:準(zhǔn)確率召回率ROC曲線(xiàn)精確率AUC監(jiān)督學(xué)習(xí)性能指標(biāo)
監(jiān)督學(xué)習(xí)性能指標(biāo)
監(jiān)督學(xué)習(xí)性能指標(biāo)5.AUCAUC的全稱(chēng)是“AreaundertheCurveofROC”,即為ROC曲線(xiàn)下的面積。當(dāng)樣本分布不平衡時(shí),只用準(zhǔn)確率往往不能反映分類(lèi)器的好壞。比如數(shù)據(jù)集有9個(gè)正類(lèi)樣本(真值為0)、1個(gè)負(fù)類(lèi)樣本(真值為1),最簡(jiǎn)單的分類(lèi)器就是把所有的樣本都預(yù)測(cè)為0,那么精度就是90%,顯然這樣的分類(lèi)器沒(méi)有價(jià)值。如果我們用AUC評(píng)價(jià)這個(gè)最簡(jiǎn)單的分類(lèi)器就會(huì)發(fā)現(xiàn),ROC就是1條斜率為1的斜線(xiàn),AUC是ROC曲線(xiàn)下的面積,即0.5。分類(lèi)器只有大于0.5時(shí)才有價(jià)值,這就為我們提供了一個(gè)除精度以外的性能指標(biāo)。3.3
任務(wù)實(shí)施3.3.7參數(shù)查找接下來(lái)GridSearchCV搜索C和gamma的取值空間,找到模型AUC指標(biāo)最好的參數(shù)步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">參數(shù)查找</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3
傳感器連通預(yù)測(cè)3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)步驟2:查看樣本標(biāo)簽的分布。ir=np.sum(y_train==0)/np.sum(y_train==1)f"不平衡率:{ir:.2f}"結(jié)果表明正負(fù)類(lèi)樣本嚴(yán)重不平衡,嘗試設(shè)置class_weight參數(shù)。按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)步驟3:評(píng)估class_weight=14時(shí)模型的測(cè)試準(zhǔn)確率。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("準(zhǔn)確率:{:.2f}".format(test_score*100))test_auc=roc_auc_score(y_test,y_test_pred)print("AUC:{:.4f}".format(test_auc))按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)按“SHIFT+Enter”,運(yùn)行結(jié)果如下:步驟4:查找最優(yōu)C和gamma參數(shù)。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
任務(wù)實(shí)施接上3
傳感器連通預(yù)測(cè)print("最好的參數(shù)是:{},AUC:{:.4f}".format(gs.best_params_,gs.best_score_))按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.3
任務(wù)實(shí)施3.3.8最優(yōu)參數(shù)模型訓(xùn)練步驟1:定義2級(jí)標(biāo)題。##<fontcolor="black">最優(yōu)參數(shù)模型訓(xùn)練</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3
傳感器連通預(yù)測(cè)3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)步驟2:在訓(xùn)練集上重新訓(xùn)練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”,運(yùn)行結(jié)果如下:3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)步驟3:在測(cè)試集上重新評(píng)估模型。y_test_pred=model.predict(X_test_decomposed)test_score=accuracy_score(y_test,y_test_pred)"準(zhǔn)確率:{:.2f}".format(test_score*100)按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)步驟4:準(zhǔn)確率降低,但AUC上升。test_auc=roc_auc_score(y_test,y_test_pred)"AUC:{:4f}".format(test_auc)按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)步驟5:計(jì)算tpr和fpr,thresholds取deci最小值和最大值之間的值以及無(wú)窮大。deci=model.decision_function(X_test_decomposed)fpr,tpr,thresholds=roc_curve(y_test,y_score=deci,pos_label=1)fpr,tpr,thresholds3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)步驟6:設(shè)置Matplotlib畫(huà)圖時(shí)的中文字體。mpl.rcParams['font.sans-serif']=['SimHei']步驟7:畫(huà)出ROC曲線(xiàn)。plt.plot(fpr,tpr,"k--",label=f"AUC(面積{test_auc:.4f})")plt.xlabel("假陽(yáng)率")plt.ylabel("真陽(yáng)率")plt.legend(loc="lowerright")3.3
任務(wù)實(shí)施3
傳感器連通預(yù)測(cè)按“SHIFT+Enter”,運(yùn)行結(jié)果如下:小結(jié)分類(lèi)型特征需要使用OrdinalEncoder函數(shù)轉(zhuǎn)換到數(shù)值型索引后參與訓(xùn)練。分類(lèi)型標(biāo)簽需要使用LabelEncoder函數(shù)轉(zhuǎn)換到數(shù)值型索引后參與訓(xùn)練。包含空值的樣本只有填充默認(rèn)值(比如平均值)后保留,其他有空值的樣本將被刪除。SVM算法可處理線(xiàn)性可分和線(xiàn)性不可分的數(shù)據(jù)。SVM模型使用kernel=”rbf”會(huì)將低維線(xiàn)性不可分?jǐn)?shù)據(jù)映射到高維線(xiàn)性可分?jǐn)?shù)據(jù)。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 過(guò)程質(zhì)量管控
- 2025年浙江省臺(tái)州市路橋區(qū)小升初數(shù)學(xué)試卷
- 2025年河南省三門(mén)峽市陜州區(qū)小升初數(shù)學(xué)試卷
- 部編版語(yǔ)文七年級(jí)上學(xué)期《紀(jì)念白求恩》導(dǎo)學(xué)案
- 2026屆安徽省長(zhǎng)豐縣聯(lián)考中考英語(yǔ)考試模擬沖刺卷含答案
- 山東省濟(jì)南市萊蕪區(qū)2026屆中考物理押題試卷含解析
- 廣東省揭陽(yáng)真理中學(xué)2026屆中考沖刺卷英語(yǔ)試題含答案
- 2026屆吉林省長(zhǎng)春市外國(guó)語(yǔ)學(xué)校初中物理畢業(yè)考試模擬沖刺卷含解析
- 寧夏鹽池縣2026屆中考語(yǔ)文考試模擬沖刺卷含解析
- 湖北省武漢市武昌區(qū)拼搏聯(lián)盟重點(diǎn)名校2026屆中考數(shù)學(xué)猜題卷含解析
- 鉆孔工安全教育試卷
- AI+Agent與Agentic+AI的原理和應(yīng)用洞察與未來(lái)展望
- 高血壓分級(jí)管理策略
- 勁性復(fù)合樁技術(shù)規(guī)程知識(shí)培訓(xùn)
- T/CHES 59-2021組合式金屬防洪擋板安裝、驗(yàn)收及維護(hù)規(guī)范
- 基于AI的智能語(yǔ)音助手創(chuàng)業(yè)計(jì)劃書(shū)模板
- 糖尿病培訓(xùn)內(nèi)容
- 2025年水利工程師職稱(chēng)考試試題及答案
- 2025北京高三一模地理匯編:人文地理(非選擇題)
- 不良事件分級(jí)培訓(xùn)
- 2025建筑安全員C證考試(專(zhuān)職安全員)題庫(kù)及答案
評(píng)論
0/150
提交評(píng)論