为何向cross_val_predict传入已拟合的SGD分类器?
关于cross_val_predict使用已拟合模型的疑问解答
cross_val_predict的内部逻辑:
scikit-learn的cross_val_predict函数有个核心特性——不管你传入的模型是否已经拟合过,它在每一轮交叉验证时,都会自动克隆一个该模型的“干净”未拟合副本,用当前的训练折数据重新训练这个副本,再用它对测试折做预测。所以你传入已拟合的sgd_clf,并不会直接用它已有的参数去预测,内部会重置模型重新训练。作者这里直接传之前定义好的模型对象,只是代码编写上的便捷操作。为什么不直接用已拟合模型预测完整训练集?
如果直接用已拟合的sgd_clf对X_train做预测,得到的是模型在训练过的数据上的结果,这会严重高估模型的实际泛化能力(模型已经记住了训练数据的细节)。而混淆矩阵的作用是评估模型在新数据上的表现,需要无偏的预测结果。cross_val_predict通过交叉验证,让每一个训练样本都被当作测试数据,由用其他2/3训练数据训练出的模型来预测,这样得到的y_train_pred能真实反映模型的泛化性能,基于它计算的混淆矩阵才有参考价值。为什么不传入未拟合的分类器?
其实效果完全一致。你传一个未拟合的SGDClassifier(),和传已经拟合过的sgd_clf,cross_val_predict内部都会克隆出未拟合的模型副本重新训练。作者只是沿用了之前代码里已经定义好的模型对象,没必要重复创建新的未拟合模型,属于合理的代码复用。
内容的提问来源于stack exchange,提问作者A_cat
相关产品推荐
相关产品推荐

