1. 程式人生 > >周誌華《機器學習》課後習題練習——ch3.4 交叉驗證法練習

周誌華《機器學習》課後習題練習——ch3.4 交叉驗證法練習

估計 行數據 his line air spl AR metrics reg

題目:選擇兩個UCI數據集,比較10折交叉驗證法和留一法所估計出的對率回歸的錯誤率。

其中代碼主要參考:https://blog.csdn.net/snoopy_yuan/article/details/64131129

為了練習我采用的數據集與原博客中的有所區別,是UCI中一個霓虹人搞的有關於大腸桿菌中蛋白質的分布的數據集。。。傳送門:http://archive.ics.uci.edu/ml/datasets/Ecoli

其中一共有8個屬性,包括大腸桿菌的名字,以及其余7個不同的指標,最終的預測結果一共有8種不同的分類。

簡單說一下原博客中沒有提到的而我遇到的一些要點吧。

我主要用到的庫有:pandas,numpy,sklearn,matplotlib,

首先是UCI的數據集很多都是.data和.name 結尾的文件,這些文件處理起來不是很方便,為此可以在UCI網站中打開相應的數據集,直接Ctrl+A復制到TXT中,然後復制進EXCEL中進行數據處理,進行簡單的分列之後即可得到便於進行數據處理的csv文件了。

其次是在原博客中提到了使用seaborn進行畫圖,但是最新版本的seaborn中已經不帶plt了,所以需要引進matplotlib中的pyplot。

然後是在進行數據處理的時候,原數據集中的分類結果是字符串表示的cp,im,pp等,分別代表蛋白質存在於細胞漿,細胞膜等中,對此字符串可以使用pandas的replace函數對其進行替換。

在替換之後使用sklearn進行10折交叉驗證的時候會出現一個提示:Unknown label type:‘unkonwn’,這是因為數據類型沒有確定導致的,可以使用.astype(‘int‘)即可。

 1 # -*- coding: utf-8 -*
 2 import numpy as np
 3 import seaborn as sns
 4 import pandas as pd
 5 import matplotlib.pyplot as plt
 6 from sklearn.linear_model import LogisticRegression
 7 from sklearn import metrics
 8 from sklearn.model_selection import cross_val_predict
 9 
10 ecoli = pd.read_csv("
ecoli.csv") 11 # print(ecoli) 12 # sns.jointplot("mcg", "gvh", tips, kind=‘reg‘) 13 # sns.pairplot(tips) 14 # plt.show() 15 16 ‘‘‘ 17 Class Distribution. The class is the localization site. Please see Nakai & 18 Kanehisa referenced above for more details. 19 20 cp (cytoplasm) 143 21 im (inner membrane without signal sequence) 77 22 pp (perisplasm) 52 23 imU (inner membrane, uncleavable signal sequence) 35 24 om (outer membrane) 20 25 omL (outer membrane lipoprotein) 5 26 imL (inner membrane lipoprotein) 2 27 imS (inner membrane, cleavable signal sequence) 2 28 ‘‘‘ 29 30 ecoli = ecoli.replace(to_replace=cp , value= 143) 31 ecoli = ecoli.replace(im , 77) 32 ecoli = ecoli.replace(pp , 52) 33 ecoli = ecoli.replace(imU , 35) 34 ecoli = ecoli.replace(om , 20) 35 ecoli = ecoli.replace(omL , 5) 36 ecoli = ecoli.replace(imL , 2) 37 ecoli = ecoli.replace(imS , 2) 38 print(ecoli) 39 40 X = ecoli.values[:,1:7] #training set 41 y = ecoli.values[:,8].astype(int) #training set 42 # print(X) 43 # print(y) 44 45 # log-regression lib model 46 log_model = LogisticRegression() 47 m = np.shape(X)[0] 48 49 # 10-folds CV 50 y_pred = cross_val_predict(log_model, X, y, cv=10) 51 print(metrics.accuracy_score(y, y_pred)) 52 # print(y_pred) 53 54 55 #LOO 56 from sklearn.model_selection import LeaveOneOut 57 loo = LeaveOneOut() 58 accuracy = 0; 59 for train, test in loo.split(X): 60 log_model.fit(X[train], y[train]) # fitting 61 y_p = log_model.predict(X[test]) 62 if y_p == y[test] : accuracy += 1 63 print(accuracy / np.shape(X)[0])

周誌華《機器學習》課後習題練習——ch3.4 交叉驗證法練習