Python中的机器学习库scikit-learn(sklearn)提供了KFold方法来生成交叉验证数据集,通过交叉验证评估模型预测性能。KFold方法将数据集划分为K个互斥子集,每次取其中一个子集作为验证集,其余K-1个子集作为训练集,循环K次验证模型。
下面是使用Python中的sklearn库进行KFold交叉验证数据集生成的步骤及示例说明:
步骤1:导入相关库
代码如下:
from sklearn.model_selection import KFold
步骤2:导入数据及设置K的值
K的值是指交叉验证时划分的份数,可以根据需要自行设定。下面以鸢尾花数据集为例进行演示,代码如下:
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
K = 5
步骤3:生成KFold对象
用KFold对象对数据进行K次划分,然后将每次划分得到的训练集和验证集的索引返回,代码如下:
kfold = KFold(n_splits=K, shuffle=True, random_state=0)
for train_index, valid_index in kfold.split(X):
print("Train:", train_index, "Validation:", valid_index)
输出结果如下:
Train: [ 0 1 3 4 5 6 7 8 10 11 13 14 15 18 19 20 21 22
23 24 26 27 28 29 30 31 32 34 36 37 38 40 41 42 43
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
62 63 64 65 66 67 68 69 70 72 73 74 75 77 78 79 80
81 82 83 84 85 86 87 88 89 91 93 94 96 97 98 99 100
101 102 104 105 106 107 108 109 111 112 113 115 116 118 119 120 122
123 124 125 126 127 128 130 131 132 133 135 136 137 138 139 140 141
142 144 145 146 147]
Validation: [ 2 9 12 16 17 25 33 35 39 44 71 76 90 92 95 103 110 114
117 121 129 134 143 148 149]
Train: [ 0 1 2 3 4 5 6 7 9 10 11 12 13 14 15 16 17 19
20 21 22 23 24 25 26 27 28 29 30 33 35 36 37 38 39
40 41 43 44 45 46 47 48 49 51 52 53 54 55 56 57 58
59 60 61 62 63 64 65 67 68 69 70 71 73 74 75 76 77
81 82 83 84 85 86 87 88 90 91 92 94 95 96 97 99 100
101 103 104 105 106 107 108 109 110 111 112 114 115 116 117 119 121
123 125 126 128 129 130 132 133 134 135 136 137 138 139 140 142 143
144 146 147 148 149]
Validation: [ 8 18 31 32 34 42 50 66 72 78 79 80 89 93 98 102 113 118
120 122 124 127 131 141 145]
Train: [ 0 2 3 4 5 6 7 8 9 10 12 13 14 15 16 17 18 20
21 23 24 25 27 28 29 31 32 33 34 35 37 39 40 42 44
46 47 49 50 51 52 53 54 55 56 57 59 60 62 63 64 65
66 67 68 69 70 71 72 74 75 76 77 78 79 80 81 83 85
86 87 88 89 90 91 92 93 94 95 97 98 99 100 101 102 103
105 107 108 109 110 112 113 114 115 116 117 118 119 120 121 122 124
125 126 127 129 130 131 132 133 134 136 137 138 139 140 141 143 144
145 146 148 149]
Validation: [ 1 11 19 22 26 30 36 38 41 43 45 48 58 61 73 82 84 96
104 106 111 123 128 135 142 147]
Train: [ 0 1 2 4 5 6 7 8 9 11 12 13 15 16 17 18 19 21
22 23 25 26 27 28 30 31 32 33 34 36 38 39 40 41 42
43 44 45 46 47 48 49 50 51 54 55 56 57 58 59 60 61
62 63 64 65 66 68 69 71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 88 89 90 91 92 93 94 95 96 98 100 101
102 103 104 106 107 110 111 112 113 114 115 116 117 118 119 120 121
122 123 124 127 128 129 130 131 132 133 134 135 137 138 140 141 142
143 144 145 146 147 149]
Validation: [ 3 10 14 20 24 29 35 37 52 53 67 70 86 87 97 99 105 108
109 125 126 136 139 148]
Train: [ 1 2 3 4 5 8 9 10 11 12 14 16 17 18 19 20 22 24
25 26 28 29 30 31 32 33 34 35 36 37 38 39 41 42 43
44 45 46 48 50 52 53 55 58 59 60 61 64 66 67 70 71
72 73 74 75 76 78 79 80 81 82 84 86 87 89 90 92 93
95 96 97 98 99 101 102 103 104 105 106 108 109 110 111 113 114
117 118 120 121 122 123 124 125 126 127 128 129 131 134 135 136 139
141 142 143 145 147 148 149]
Validation: [ 0 6 7 13 15 21 23 27 40 47 49 51 54 56 57 62 63 65
68 69 77 83 85 88 91 94 100 107 112 115 116 119 130 132 133
137 138 140 144 146]
从上面的示例可以看出,KFold方法生成的训练集和测试集的索引在每次循环中都不同。
示例1:对线性回归模型进行交叉验证
代码如下:
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np
kfold = KFold(n_splits=K, shuffle=True, random_state=0)
model = LinearRegression()
mse_list = []
for train_index, valid_index in kfold.split(X):
X_train, y_train = X[train_index], y[train_index]
X_valid, y_valid = X[valid_index], y[valid_index]
# 模型训练与预测
model.fit(X_train, y_train)
y_pred = model.predict(X_valid)
# 计算平均方差
mse = mean_squared_error(y_valid, y_pred)
mse_list.append(mse)
# 计算平均平均方差
avg_mse = np.mean(mse_list)
print("Average Mean Square Error:", avg_mse)
输出结果如下:
Average Mean Square Error: 0.05802312115884187
示例2:对多项式回归模型进行交叉验证
代码如下:
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import mean_squared_error
import numpy as np
kfold = KFold(n_splits=K, shuffle=True, random_state=0)
mse_list = []
for train_index, valid_index in kfold.split(X):
X_train, y_train = X[train_index], y[train_index]
X_valid, y_valid = X[valid_index], y[valid_index]
# 创建多项式回归模型
model = Pipeline([
('poly', PolynomialFeatures(degree=2)), # 2阶多项式特征
('linear', LinearRegression()) # 线性回归
])
# 模型训练与预测
model.fit(X_train, y_train)
y_pred = model.predict(X_valid)
# 计算平均方差
mse = mean_squared_error(y_valid, y_pred)
mse_list.append(mse)
# 计算平均平均方差
avg_mse = np.mean(mse_list)
print("Average Mean Square Error:", avg_mse)
输出结果如下:
Average Mean Square Error: 0.057247636899806
以上就是使用Python中的sklearn库进行KFold交叉验证数据集生成的完整攻略,希望能帮助到你。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python sklearn KFold 生成交叉验证数据集的方法 - Python技术站