周志华《机器学习》课后习题练习——ch3.4 交叉验证法练习

 

 

题目:选择两个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])

 

 

posted @ 2018-06-18 23:24  捕虫少年  阅读(1846)  评论(0编辑  收藏  举报