sklearn可視化不同資料劃分方法的差異:TimeSeriesSplit, KFold, ShuffleSplit,StratifiedKFold, GroupShuffleSplit,GroupKFold, StratifiedShuffleSplit
目錄
sklearn可視化不同資料劃分方法的差異:TimeSeriesSplit, KFold, ShuffleSplit,StratifiedKFold, GroupShuffleSplit,GroupKFold, StratifiedShuffleSplit
#包匯入
#仿真資料集
#定義查看不同交叉驗證資料劃分形式的函式
#KFold交叉驗證資料劃分
#StratifiedKFold交叉驗證資料劃分
#同時查看KFold, GroupKFold, ShuffleSplit, StratifiedKFold,GroupShuffleSplit, StratifiedShuffleSplit, TimeSeriesSplit交叉驗證資料劃分
選擇合適的交叉驗證物件是正確擬合模型的關鍵部分,為了避免模型過擬合、規范測驗集中的組數等,有許多方法可以將資料拆分為訓練集和測驗集,
#包匯入
from sklearn.model_selection import (TimeSeriesSplit, KFold, ShuffleSplit,
StratifiedKFold, GroupShuffleSplit,
GroupKFold, StratifiedShuffleSplit)
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Patch
np.random.seed(1338)
cmap_data = plt.cm.Paired
cmap_cv = plt.cm.coolwarm
n_splits = 4
首先,我們必須了解我們資料的結構,它有100個隨機生成的輸入資料樣本,3個類在樣本上不均勻地分布,資料中的10個組在資料上均勻地分布,
正如我們將看到的,一些交叉驗證物件對標記的資料執行特定的操作,其他的對分組的資料執行不同的操作,而其他的則不使用這些分組資訊,
#仿真資料集
# Generate the class/group data
n_points = 100
X = np.random.randn(100, 10)
percentiles_classes = [.1, .3, .6]
y = np.hstack([[ii] * int(100 * perc)
for ii, perc in enumerate(percentiles_classes)])
# Evenly spaced groups repeated once
groups = np.hstack([[ii] * 10 for ii in range(10)])
def visualize_groups(classes, groups, name):
# Visualize dataset groups
fig, ax = plt.subplots()
ax.scatter(range(len(groups)), [.5] * len(groups), c=groups, marker='_',
lw=50, cmap=cmap_data)
ax.scatter(range(len(groups)), [3.5] * len(groups), c=classes, marker='_',
lw=50, cmap=cmap_data)
ax.set(ylim=[-1, 5], yticks=[.5, 3.5],
yticklabels=['Data\ngroup', 'Data\nclass'], xlabel="Sample index")
visualize_groups(y, groups, 'no groups')

#定義查看不同交叉驗證資料劃分形式的函式
def plot_cv_indices(cv, X, y, group, ax, n_splits, lw=10):
"""Create a sample plot for indices of a cross-validation object."""
# Generate the training/testing visualizations for each CV split
for ii, (tr, tt) in enumerate(cv.split(X=X, y=y, groups=group)):
# Fill in indices with the training/test groups
indices = np.array([np.nan] * len(X))
indices[tt] = 1
indices[tr] = 0
# Visualize the results
ax.scatter(range(len(indices)), [ii + .5] * len(indices),
c=indices, marker='_', lw=lw, cmap=cmap_cv,
vmin=-.2, vmax=1.2)
# Plot the data classes and groups at the end
ax.scatter(range(len(X)), [ii + 1.5] * len(X),
c=y, marker='_', lw=lw, cmap=cmap_data)
ax.scatter(range(len(X)), [ii + 2.5] * len(X),
c=group, marker='_', lw=lw, cmap=cmap_data)
# Formatting
yticklabels = list(range(n_splits)) + ['class', 'group']
ax.set(yticks=np.arange(n_splits+2) + .5, yticklabels=yticklabels,
xlabel='Sample index', ylabel="CV iteration",
ylim=[n_splits+2.2, -.2], xlim=[0, 100])
ax.set_title('{}'.format(type(cv).__name__), fontsize=15)
return ax
#KFold交叉驗證資料劃分
fig, ax = plt.subplots()
cv = KFold(n_splits)
plot_cv_indices(cv, X, y, groups, ax, n_splits)

#StratifiedKFold交叉驗證資料劃分
fig, ax = plt.subplots()
cv = StratifiedKFold(n_splits)
plot_cv_indices(cv, X, y, groups, ax, n_splits)

#同時查看KFold, GroupKFold, ShuffleSplit, StratifiedKFold,GroupShuffleSplit, StratifiedShuffleSplit, TimeSeriesSplit交叉驗證資料劃分
cvs = [KFold, GroupKFold, ShuffleSplit, StratifiedKFold,
GroupShuffleSplit, StratifiedShuffleSplit, TimeSeriesSplit]
for cv in cvs:
this_cv = cv(n_splits=n_splits)
fig, ax = plt.subplots(figsize=(6, 3))
plot_cv_indices(this_cv, X, y, groups, ax, n_splits)
ax.legend([Patch(color=cmap_cv(.8)), Patch(color=cmap_cv(.02))],
['Testing set', 'Training set'], loc=(1.02, .8))
# Make the legend fit
plt.tight_layout()
fig.subplots_adjust(right=.7)
plt.show()







參考:sklearn
參考:Visualizing cross-validation behavior in scikit-learn
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302166.html
標籤:AI
上一篇:R語言正太分布函式Normal Distribution(dnorm, pnorm, qnorm & rnorm)實戰
下一篇:人工智能術語集
