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

时间:2019-07-24 14:44:20

标签: python python-3.x machine-learning scikit-learn cross-validation

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

对于任何机器学习方案:

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

代码:

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

(2)第二步,如果我的数据允许(不是太大),我运行K形交叉 验证数据。

从该得分中,我可以获得所选模型的偏差,方差和准确性。

从这里,我可以像调整超参数中那样调整模型,进行特征选择并尝试不同的算法(随机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)运行另一个分类报告

以上我有2个问题:

(1)步骤正确吗?如果您有任何遗漏,请随时告诉我。

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

非常感谢您的帮助

1 个答案:

答案 0 :(得分:2)

您的程序通常是正确的。 Order between using validation, training and test sets中的讨论将非常有用。次要问题/说明:

  • 在步骤1中,我们通常使用术语“测试集”而不是“验证集”(此处的验证部分由K折CV覆盖),因此x_test和{{1 }}将是更合适的变量名。

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

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