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

Understanding machine learning process and Kfold crossvalidation

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

对于任何机器学习场景:

(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)

然后我们可以 运行 另一个 classification_report with (y_Val,y_pred2)

以上问题我有2个:

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

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

非常感谢您的帮助

你的程序大体上是正确的。 中的讨论将很有用。未成年人 issues/clarifications:

  • 在步骤#1中,我们通常使用术语"test set"而不是"validation set"(这里验证部分由K-fold CV覆盖),所以x_testy_test 将是更合适的变量名称。

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

由于您已使用测试集对模型进行最终评估,因此此处正确的做法是报告第 5 步的结果;尽管如此,只要您提供适当的说明,即 "CV accuracy x, test accuracy y".

,您也始终可以报告步骤 #4 的结果。