python实现周志华西瓜书《机器学习》习题3.4 对比10折交叉验证和留一法的对率回归错误率

这道题仍然在抄大神代码的基础上写注释,首先感谢源代码:
https://blog.csdn.net/Snoopy_Yuan/article/details/64131129

感想是:sklearn是个好东西,如果没有现成的验证方法,光是10折验证就要造10个表格才行,而用现成的库,一行搞定,嗨森。
sklearn的API文档已收藏书签:http://scikit-learn.org/stable/modules/classes.html#
当然,seaborn也是个好东西,画图神器。
对数组,dataframe这些,模模糊糊有一点感觉了。
对于load_txt浮点型,以及seaborn load_dataset的ssl证书问题,还是晕,留待以后顿悟。。。。

#源代码 https://blog.csdn.net/Snoopy_Yuan/article/details/64131129
#对率回归和10折交叉验证用到sklearn库 http://scikit-learn.org/stable/
import numpy as np
import pandas as pd
import sklearn

#iris数据
#sklearn可以用datasets方法加载iris数据集,查找数据集链接 http://scikit-learn.org/stable/modules/classes.html#module-sklearn.datasets
from sklearn import datasets
#和api介绍不一样,如果增加return_X_y=True参数,反而会报错,说明false时候已经返回了target数值
iris=datasets.load_iris()
#返回的data是数据项,target是最后一列分类结果,对率分布y只有两个取值,因此取前100个数据
x=iris.data[0:100,:]
y=iris.target[0:100]

#逻辑回归
from sklearn.linear_model import LogisticRegression
#metrics是评估模块,例如准确率等
from sklearn import metrics
from sklearn.model_selection import cross_val_predict
log_model=LogisticRegression()

#10折交叉验证,cross_val_predict返回的是estimator的分类结果,用于和实际数据比较
y_pred=cross_val_predict(log_model,x,y,cv=10)
print("iris with 10folds, precision is:",metrics.accuracy_score(y,y_pred))

#留一法
from sklearn.model_selection import LeaveOneOut
loo=LeaveOneOut()
accuracy=0
#split是leaveoneout模型的方法,把数据分隔为train和test数组
for train,test in loo.split(x):
    log_model.fit(x[train],y[train])  #fit模型
    y_p=log_model.predict(x[test])
    if y_p==y[test]:
        accuracy+=1
print("iris with LeaveOneOut, precision is:",accuracy/np.shape(x)[0]) #shape(x)是数组维度,shape(x)[0]相当于数组的行数也就是样本数


#blood tranfusion数据
inputfile='/Users/huatong/PycharmProjects/Data/bloodtrans.xls'
trans=pd.read_excel(inputfile)
#read_excel返回的是dataframe类型数据,类似数据库的表,是不能直接切片的,需要用values函数提取数据
trans_x=trans.values[:,0:4]
trans_y=trans.values[:,4]
log_model=LogisticRegression()

#10折交叉验证,cross_val_predict返回的是estimator的分类结果,用于和实际数据比较
trans_y_pred=cross_val_predict(log_model,trans_x,trans_y,cv=10)
print("bloodtransfusion with 10folds, precision is:",metrics.accuracy_score(trans_y,trans_y_pred))

#留一法
loo=LeaveOneOut()
trans_accuracy=0
#split是leaveoneout模型的方法,把数据分隔为train和test数组
for train,test in loo.split(trans_x):
    log_model.fit(trans_x[train],trans_y[train])  #fit模型
    trans_y_p=log_model.predict(trans_x[test])
    if trans_y_p==trans_y[test]:
        trans_accuracy+=1
print("bloodtransfusion with LeaveOneOut, precision is:",trans_accuracy/np.shape(trans_x)[0])


#有关加载iris数据,以下两种方法都是有问题的
#第一种 根据line1链接里的方法,但是会报loadtxt出错,无法把分类列转换成float,但其他列是浮点数,因此用dtype=bytes也不合适
#import urllib
#定义iris数据的链接
#url="http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
#下载数据
#raw_data=urllib.request.urlopen(url)
#把数据加载进numpy数组中
#iris=np.loadtxt(raw_data,delimiter=",")

#第二种,seaborn自带有iris数据集读取方法,所有内置的数据集在https://github.com/mwaskom/seaborn-data/blob/master/iris.csv
#但会报证书错误,应该是github的https证书读不出来,加上了一行不读取证书的代码但报错没有sslcontext模块
#iris=sns.load_dataset("iris")
#ssl._create_default_https_context=ssl._create_unverified_context()

#由于没有用seaborn内置的iris数据,画图也是有问题的,会提示没有plot方法
#seaborn是用于画图的库,比python原有的matplotlib更简单
#import seaborn as sns
#设置画图的风格,默认样式是灰色底darkgrid
#sns.set(style="white",color_codes=True)
#sns.plot(kind="scatter",x=iris['sepallength'],y=iris['sepalwidth'])
#sns.plt.show()

猜你喜欢

转载自blog.csdn.net/catherined/article/details/82015857