了解机器学习过程和 K 折交叉验证

Posted

技术标签:

【中文标题】了解机器学习过程和 K 折交叉验证【英文标题】:Understanding machine learning process and Kfold crossvalidation 【发布时间】:2019-12-02 18:24:04 【问题描述】:

我是机器学习的初学者,我一直在尝试更详细地了解这个过程。

对于任何机器学习场景:

(1) 我做的第一步是将我的数据以 90% 到 10% 的比例拆分,并保留 10% 用于在最后一步进行测试

代码:

X1, X_Val, y1, y_Val = train_test_split(X, y, test_size=0.1, 
random_state=101)

(2)第二步,如果我的数据允许(不是太大),我运行一个K-Fold Cross 数据验证。

根据该分数,我可以获得所选模型的偏差、方差和准确度。

从这里,我可以像调整超参数一样调整模型,进行特征选择并尝试不同的算法(随机 forrest 等),看看什么能提供最佳解决方案

代码:

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

logreg = LogisticRegression()

scores = cross_val_score(logreg,X1,y1,cv = 10, scoring = "accuracy")

scores.mean()

scores.std()

(3) 现在我使用 cross_val_predict 来获取 y 预测(y_pred)

代码:

from sklearn.model_selection import cross_val_predict
ypred = cross_val_predict(logreg,X1,y1,cv = 10)

(4) 从那里,我可以运行分类报告:

代码:

print(classification_report(y1,ypred))
accuracy_score(y1,ypred)
confusion_matrix(y1,ypred)

(5) 现在,如果我们对分类报告的结果感到满意,我们可以输入新数据或未见过的数据(X_val,y_val),在我们的例子中是我们从步骤 1 中删除的测试集

这样做是这样的:

代码:

logreg2 = LogisticRegression()
logreg2.fit(X1,y1)
y_pred2 = logreg2.predict(X_Val)

然后我们可以使用 (y_Val,y_pred2) 运行另一个分类报告

上面有两个问题:

(1) 步骤是否正确?如果我遗漏了什么,请随时告诉我。

(2) 我应该报告什么作为我的模型的实际准确度,第 5 步或第 4 步的分类报告?

非常感谢您的帮助

【问题讨论】:

【参考方案1】:

您的程序总体上是正确的。 Order between using validation, training and test sets 中的讨论会很有用。小问题/澄清:

在第 1 步中,我们通常使用术语“测试集”而不是“验证集”(验证部分在这里被 K-fold CV 覆盖),所以 x_testy_test 将是更合适的变量名。

在第 5 步中,预计您将使用在交叉验证期间选择的特定超参数(您的示例未明确显示这一点)。

由于您已使用测试集对模型进行最终评估,因此正确的做法是报告第 5 步的结果;不过,您也可以随时报告第 4 步的结果,只要您提供适当的说明,即“CV 准确度x,测试准确度y”。

【讨论】:

以上是关于了解机器学习过程和 K 折交叉验证的主要内容,如果未能解决你的问题,请参考以下文章

机器学习100天(二十九):029 K折交叉验证

机器学习100天(二十九):029 K折交叉验证

机器学习--K折交叉验证和非负矩阵分解

机器学习 Out-of-Fold 折外预测详解 | 使用折外预测 OOF 评估模型的泛化性能和构建集成模型

机器学习实验方法与原理

Spark2.0机器学习系列之2:基于Pipeline交叉验证ParamMap的模型选择和超参数调优