sklearn源码解读1(sklearn.linear_model.LinearRegression)

Situation&Task:

遇到一个机器学习的回归问题。

Actioin:

1.尝试用LinearRegression这个model,涉及调参问题。然后阅读LinearRegression的源码,简单做个笔记。

2. 还尝试了RidgeCV (l2 regularizaiton), LassoCV(l1 regularizaiton)

Result&learned:

LinearRegression中的fit函数求参数w和b,是用normal equation求解的。具体求解方法:

numpy.linalg.lstsq(X, y)

函数说明参考官方函数

其中最重要的一句话,Solves the equation a x = b by computing a vector x that minimizes the Euclidean 2-norm || b - a x ||^2.

    def fit(self, X, y, sample_weight=None):
        """
        Fit linear model.

        Parameters
        ----------
        X : numpy array or sparse matrix of shape [n_samples,n_features]
            Training data

        y : numpy array of shape [n_samples, n_targets]
            Target values. Will be cast to X's dtype if necessary

        sample_weight : numpy array of shape [n_samples]
            Individual weights for each sample

            .. versionadded:: 0.17
               parameter *sample_weight* support to LinearRegression.

        Returns
        -------
        self : returns an instance of self.
        """

        n_jobs_ = self.n_jobs
        X, y = check_X_y(X, y, accept_sparse=['csr', 'csc', 'coo'],
                         y_numeric=True, multi_output=True)

        if sample_weight is not None and np.atleast_1d(sample_weight).ndim > 1:
            raise ValueError("Sample weights must be 1D array or scalar")

        X, y, X_offset, y_offset, X_scale = self._preprocess_data(
            X, y, fit_intercept=self.fit_intercept, normalize=self.normalize,
            copy=self.copy_X, sample_weight=sample_weight)

        if sample_weight is not None:
            # Sample weight can be implemented via a simple rescaling.
            X, y = _rescale_data(X, y, sample_weight)

        if sp.issparse(X):
            if y.ndim < 2:
                out = sparse_lsqr(X, y)
                self.coef_ = out[0]
                self._residues = out[3]
            else:
                # sparse_lstsq cannot handle y with shape (M, K)
                outs = Parallel(n_jobs=n_jobs_)(
                    delayed(sparse_lsqr)(X, y[:, j].ravel())
                    for j in range(y.shape[1]))
                self.coef_ = np.vstack(out[0] for out in outs)
                self._residues = np.vstack(out[3] for out in outs)
        else:
            self.coef_, self._residues, self.rank_, self.singular_ = \
                linalg.lstsq(X, y)  ##找了很久原来在这里##
            self.coef_ = self.coef_.T

        if y.ndim == 1:
            self.coef_ = np.ravel(self.coef_)
        self._set_intercept(X_offset, y_offset, X_scale)
        return self






Sklearn是一个流行的Python机器学习库,它提供了各种机器学习算法和工具,以帮助开发者构建和部署机器学习模型。如果你想深入了解Sklearn的源代码,下面是一些可能有助于你理解它的步骤和资源: 1. 官方文档:首先,我建议你查阅Sklearn的官方文档。官方文档中详细介绍了每个模块、每个函数以及它们的参数和用法。你可以通过阅读文档来了解Sklearn的工作原理和设计思路。 2. GitHub仓库:Sklearn的源代码托管在GitHub上,你可以访问https://github.com/scikit-learn/scikit-learn 来查看源代码。你可以浏览不同的模块和子模块,了解它们是如何实现的,并且参考相关的注释和文档字符串。 3. 源码结构:Sklearn的源代码结构非常清晰,不同的算法和功能被组织在不同的模块中。你可以从顶层的sklearn目录开始,逐步深入到具体的模块和类。阅读源码时,要注意查看各个类的继承关系和方法的调用关系,这有助于你理解整个库的结构和运行流程。 4. 调试和打印:如果你想更深入地了解Sklearn的内部运行机制,你可以使用调试工具来跟踪代码的执行过程。另外,你还可以在关键的位置插入打印语句,输出一些变量的值,以便观察代码的执行情况。 5. 论文和博客:Sklearn的源代码通常是基于机器学习算法的论文和研究成果实现的。如果你对某个具体的算法感兴趣,你可以查阅该算法的相关论文和博客文章,了解其原理和实现细节。这有助于你更好地理解Sklearn中相应模块的代码。 总之,阅读Sklearn源代码是一个深入理解机器学习库实现细节的好方法。通过仔细阅读文档、查看源码、调试代码以及参考相关论文,你可以更好地了解Sklearn的工作原理和设计思想。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值