繁体   English   中英

Scikit-Learn 的.fit() 方法如何将数据传递给.predict()?

[英]How does Scikit-Learn's .fit() method pass data to .predict()?

我试图了解sklearn's.fit()方法和 .predict( .predict()方法之间的关系; 主要是数据(通常)如何从一个传递到另一个。 我还没有在 SO 上找到另一个问题来解决这个问题,但是围绕它跳舞(即这里

我已经使用 BaseEstimator 和RegressorMixin类编写了一个自定义估计器,但是当我开始通过它运行我的数据时,我遇到了几次“NotFittedError”。 有人可以引导我完成一个简单的线性回归以及数据如何通过拟合和预测方法传递吗? 无需深入数学——我了解回归的工作原理以及拼图的作用。 也许我忽略了显而易见的事情并使它变得比应有的更复杂? 但是估计器方法感觉有点像一个黑盒子。

当您在训练或使用NotFittedError .fit()方法之前尝试使用分类器的 .predict( .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 是您的依赖变量。 一旦 model 在 class 内部训练,线性回归的 beta 系数就会保存在 class 属性coef_ ,您可以使用reg.coef_访问它。 这就是 class 知道何时使用 .predict .predict() class 方法进行预测的方式。 class 访问这些系数,然后它只是简单的代数来产生预测。

所以回到你的错误。 如果您没有将 model 拟合到您的训练数据中,则 class 没有进行预测所需的必要属性。 希望这可以消除 class 内部发生的一些困惑,至少在fit()predict()方法如何交互方面。

最终就像上面评论的那样,这可以追溯到 Object 面向编程的基础知识,所以如果你想进一步了解,我会阅读 Python 如何处理类,因为 scikit 学习模型遵循相同的行为

让我们看一个做LinearRegression的玩具 Estimator

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

Output:

[1.11 2.22 3.33] 4.4399999999999995

那么上面的代码做了什么?

  1. fit的情况下,我们使用训练数据拟合\训练权重。 这些权重是 class 的成员变量 [这是你在 OOP 中学到的东西]
  2. transform方法使用存储为成员变量的训练权重对数据进行预测。

因此,在调用transform之前,您需要调用fit ,因为transform使用在 fit 期间计算的权重。

在 sklearn 模块中,如果您在fit之前调用transform ,则会收到NotFittedError异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM