我正在尝试理解sklearn的.fit()
方法与.predict()
方法之间的关系;主要是数据通常是如何从一个方法传递到另一个方法的。我在Stack Overflow上没有找到直接回答这个问题的帖子,但有一些帖子涉及到了相关内容(例如这里)。
我使用BaseEstimator和RegressorMixin类编写了一个自定义的估计器,但在开始运行我的数据时,多次遇到了’NotFittedError’错误。能否有人通过一个简单的线性回归示例,向我解释一下数据是如何通过fit和predict方法传递的?不需要涉及数学部分——我理解回归的工作原理以及各个部分的作用。也许我忽略了显而易见的东西,把事情复杂化了?但这些估计器方法感觉有点像黑匣子。
回答:
当你在训练或使用.fit()
方法之前尝试使用分类器的.predict()
方法时,就会发生NotFittedError
错误。
以scikit learn的LinearRegression为例来说明。
>>> import numpy as np>>> from sklearn.linear_model import LinearRegression>>> X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])>>> # y = 1 * x_0 + 2 * x_1 + 3>>> y = np.dot(X, np.array([1, 2])) + 3>>> reg = LinearRegression().fit(X, y)>>> reg.score(X, y)1.0>>> reg.coef_array([1., 2.])>>> reg.intercept_ 3.0000...>>> reg.predict(np.array([[3, 5]]))array([16.])
所以,通过reg = LinearRegression().fit(X, y)
这行代码,你实例化了LinearRegression
类,然后将其拟合到你的数据X和y上,其中X是自变量,y是因变量。一旦模型在该类中训练完成,线性回归的beta系数就会保存在类属性coef_
中,你可以通过reg.coef_
访问它。这就是类在你使用.predict()
类方法时知道如何进行预测的方式。类会访问这些系数,然后通过简单的代数运算生成预测结果。
回到你的错误。如果你没有将模型拟合到训练数据上,那么该类就没有进行预测所需的必要属性。希望这能澄清一些关于类内部发生的事情,至少在fit()
和predict()
方法如何交互方面。
最终,就像上面评论的那样,这回归到面向对象编程的基础知识上,所以如果你想进一步学习,我建议阅读Python如何处理类,因为scikit learn模型遵循相同的行为模式。