了解机器学习过程和 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_test
和 y_test
将是更合适的变量名。
在第 5 步中,预计您将使用在交叉验证期间选择的特定超参数(您的示例未明确显示这一点)。
由于您已使用测试集对模型进行最终评估,因此正确的做法是报告第 5 步的结果;不过,您也可以随时报告第 4 步的结果,只要您提供适当的说明,即“CV 准确度x
,测试准确度y
”。
【讨论】:
以上是关于了解机器学习过程和 K 折交叉验证的主要内容,如果未能解决你的问题,请参考以下文章