我试图了解sklearn's .fit()
方法和.predict()
方法之间的关系;主要是,数据(通常)是如何从一个传递到另一个的。我还没有找到可以解决此问题的SO的另一个问题,但已经绕过它跳舞(即here)
我使用BaseEstimator和RegressorMixin类编写了一个自定义估算器,但是在我开始通过它运行数据时,遇到了几次“ NotFittedError”。有人可以指导我进行简单的线性回归,以及如何通过拟合和预测方法传递数据吗?无需进行数学运算-我了解回归的工作原理以及难题的内容。也许我忽略了显而易见的东西,并使它变得比它应该复杂的多了?但是估算器方法似乎有点像黑盒子。
答案 0 :(得分:2)
让我们看一个玩具估算师来做LinearRegression
from sklearn.base import TransformerMixin, BaseEstimator
import numpy as np
class ToyEstimator(BaseEstimator):
def __init__(self):
pass
def fit(self, X, y):
X = np.hstack((X,np.ones((len(X),1))))
self.W = np.random.randn(X.shape[1])
self.W = np.dot(np.dot(np.linalg.inv(np.dot(X.T,X)), X.T), y)
self.coef_ = self.W[:-1]
self.intercept_ = self.W[-1]
return self
def transform(self, X):
X = np.hstack((X,np.ones((len(X),1))))
return np.dot(X,self.W)
X = np.random.randn(10,3)
y = X[:,0]*1.11+X[:,1]*2.22+X[:,2]*3.33+4.44
reg = ToyEstimator()
reg.fit(X,y)
y_ = reg.transform(X)
print (reg.coef_, reg.intercept_)
输出:
[1.11 2.22 3.33] 4.4399999999999995
那么上面的代码做了什么?
fit
中,我们使用训练数据拟合\训练权重。这些权重是该类的成员变量[这是您在OOP中学到的东西] transform
方法使用训练后的权重对数据进行预测,这些权重存储为成员变量。 因此,在致电transform
之前,您需要致电fit
,因为transform
使用的是在拟合期间计算出的权重。
在sklearn模块中,如果您在transform
之前调用fit
,则会得到NotFittedError
异常。
答案 1 :(得分:1)
NotFittedError
方法之前尝试使用分类器的.predict()
方法时,会发生 .fit()
。
让我们以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学习模型遵循相同的行为