周志華《機器學習》課後習題解答系列(四):Ch3.4 - 交叉驗證法練習

Snoopy_Yuan發表於2017-03-20

本系列主要採用Python-sklearn實現,環境搭建可參考 資料探勘入門:Python開發環境搭建(eclipse-pydev模式).

相關答案和原始碼託管在我的Github上:PY131/Machine-Learning_ZhouZhihua.

3.4 比較k折交叉驗證法與留一法

這裡寫圖片描述

本題採用UCI中的 Iris Data SetBlood 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資料集各變數關係組合圖,從圖中可以看出,類別區分十分明顯,分類器應該比較容易實現:

這裡寫圖片描述

相關樣例程式碼:

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)[0]

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

# LOOCV
from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
accuracy = 0;
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 += 1  
print(accuracy / np.shape(X)[0])

得出了精度(預測準確度)結果如下:

0.97
0.96

可以看到,兩種方法的模型精度都十分高,這也得益於iris資料集類間散度較大。

同樣的方法對blood-transfusion資料集得出的精度結果:

0.76
0.77

也可以看到,兩種交叉驗證的結果相近,但是由於此資料集的類分性不如iris明顯,所得結果也要差一些。同時由程式執行可以看出,LOOCV的執行時間相對較長,這一點隨著資料量的增大而愈發明顯。

所以,一般情況下選擇K-折交叉驗證即可滿足精度要求,同時運算量相對小。


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

相關文章