1. 使用 train/test split 进行模型评估的缺点
传统使用分类器
train_test_split(X, y, random_state=random_state)
train_test_split() 是将原始数据集划分为训练集/测试集,避免了为了追求高准确率而在训练集上产生过拟合,从而使得模型在样本外的数据上预测准确率高。但是,划分出训练集/测试集的不同会使得模型的准确率产生明显的变化。
这时可以采用K折交叉验证法
其步骤为:
- 随机打乱训练数据集train。
- 将数据集分割成不同的k个片段。
- 在k次的每次循环中选择一个片段来当作验证集,其余的所有片段当成训练集。
- 重复这个过程使每个片段都有可能成为训练集或者测试集的一部分。
- 随机初始化权重来训练模型。
- 在k个循环中每次都要重新初始化模型,但是权重要保持相同的随机初始化,然后再在验证集中进行验证
其调用代码为:
from sklearn.cross_validation import KFold
kf = KFold(25, n_folds=5, shuffle=False)
# 打印每个训练集和测试集
print('{} {:^61} {}'.format('Iteration', 'Training set observations', 'Testing set observations'))
for iteration, data in enumerate(kf, start=1):
print('{:^9} {} {:^25}'.format(iteration, str(data[0]), str(data[1])))
下面可以用cross_val_score()方法得出准确率,也可以用迭代方式找到机器学习方法中需要确定的参数,如KNN方法中的K
下面为调用方法(logistic)
# K折交叉验证
log_reg = SGDClassifier(loss="log", penalty="none", max_iter=args.num_epochs)
scores = cross_val_score(log_reg, standardized_X_train, y_train, cv=10, scoring="accuracy")
print("Scores:", scores)
print("Mean:", scores.mean())
print("Standard Deviation:", scores.std())