天天看点

周志华《机器学习》课后习题解答系列(四):Ch3.4 - 交叉验证法练习

本系列主要采用Python-sklearn实现,环境搭建可参考 数据挖掘入门:Python开发环境搭建(eclipse-pydev模式).

相关答案和源代码托管在我的Github上:PY131/Machine-Learning_ZhouZhihua.

3.4 比较k折交叉验证法与留一法

周志华《机器学习》课后习题解答系列(四):Ch3.4 - 交叉验证法练习

本题采用UCI中的 Iris Data Set 和 Blood Transfusion Service Center Data Set,基于sklearn完成练习(查看完整代码)。

关于数据集的介绍:

IRIS数据集简介 - 百度百科;通过花朵的性状数据(花萼大小、花瓣大小…)来推测花卉的类别。变量属性X=4种,类别标签y公有3种,这里我们选取其中两类数据来拟合对率回归(逻辑斯蒂回归)。

Blood Transfusion Service Center Data Set - UCI;通过献血行为(上次献血时间、总献血cc量…)的历史数据,来推测某人是否会在某一时段献血。变量属性X=4种,类别y={0,1}。该数据集相对iris要大一些。

具体过程如下:

1. 数据导入、可视化、预分析:

iris数据集十分常用,sklearn的数据包已包含该数据集,我们可以直接载入。对于transfusion数据集,我们从UCI官网上下载导入即可。

采用seaborn库可以实现基于matplotlib的非常漂亮的可视化呈现效果,下图是采用seaborn.pairplot()绘制的iris数据集各变量关系组合图,从图中可以看出,类别区分十分明显,分类器应该比较容易实现:

周志华《机器学习》课后习题解答系列(四):Ch3.4 - 交叉验证法练习

相关样例代码:

import numpy as np
import seaborn as sns
sns.set(style="white", color_codes=True)
iris = sns.load_dataset("iris")

iris.plot(kind="scatter", x="sepal_length", y="sepal_width")
sns.pairplot(iris,hue='species') 
sns.plt.show()
           

2. 基于sklearn进行拟合与交叉验证:

这里我们选择iris中的两类数据对应的样本进行分析。k-折交叉验证可直接根据sklearn.model_selection.cross_val_predict()得到精度、F1值等度量(该函数要求1<k<n-1)。留一法稍微复杂一点,这里采用loop实现。

面向iris数据集的样例代码:

'''
2-nd logistic regression using sklearn
'''
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
from sklearn.model_selection import cross_val_predict

# log-regression lib model
log_model = LogisticRegression()
m = np.shape(X)[]

# 10-folds CV
y_pred = cross_val_predict(log_model, X, y, cv=)
print(metrics.accuracy_score(y, y_pred))

# LOOCV
from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
accuracy = ;
for train, test in loo.split(X):
    log_model.fit(X[train], y[train])  # fitting
    y_p = log_model.predict(X[test])
    if y_p == y[test] : accuracy +=   
print(accuracy / np.shape(X)[])
           

得出了精度(预测准确度)结果如下:

0.97
0.96
           

可以看到,两种方法的模型精度都十分高,这也得益于iris数据集类间散度较大。

同样的方法对blood-transfusion数据集得出的精度结果:

0.76
0.77
           

也可以看到,两种交叉验证的结果相近,但是由于此数据集的类分性不如iris明显,所得结果也要差一些。同时由程序运行可以看出,LOOCV的运行时间相对较长,这一点随着数据量的增大而愈发明显。

所以,一般情况下选择K-折交叉验证即可满足精度要求,同时运算量相对小。

本文的一些重要索引如下:

  • sklearn中自带iris数据集的使用
  • UCI机器学习数据集官方主页
  • 基于Python的数据可视化 matplotlib seaborn pandas
  • seaborn可视化库的官方主页

继续阅读