• 周志华《机器学习》课后习题练习——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])

  • 相关阅读:
    在MathType如何让括号随内容自动调整大小的技巧
    对于MathType中公式与文字错位的问题怎么解决
    怎样批量修改MathType公式格式
    你与论文达人只差一个MathType的距离
    公式达人必杀技,你会几招?
    如何用MathType快速输入公式
    openfire数据库mysql配置
    thinkphp 操作mssql2008
    phpstudy+php5.2+mssql2008
    thinkphp openfire 添加用户 骨架
  • 原文地址:https://www.cnblogs.com/fengf1/p/9196720.html
Copyright © 2020-2023  润新知