关于
sklearn是python的机器学习库,来源于Google summer 的一个项目,个人认为是一个设计地非常好的软件,
对模型的抽象很不错。另一方面,在学习理论的同时,自己写代码是一个加深理解的好方式,而阅读源码也是
一种很好的方式,而且还能学习别人的实现和优化技巧。
这个源码阅读计划可能持续较长,内容会总结在wiki中,最后形成文章在我的博客中出现。
基础类 base.py
sklearn使用5个基础类,对模型的功能进行抽象。用户可以基于这些类实现自己的模型,使得可以像操作sklearn
里面的其他模型那样调用。基础类放在包sklearn.base中
- BaseEstimator,要求构造方法能够设置模型参数,并且实现
get_params和set_params两个方法。 - ClassifierMixin,实现
score方法,返回 accuracy_score,所有的分类器的Mixin类 - RegressorMixin,实现
score方法,返回 r2_score,所有回归器的Mixin类 - ClusterMixin,实现
fit_predict方法,返回 聚类标签,所有聚类器的Mixin类 - BiclusterMixin,两聚类Mixin类
- TransformerMixin,实现
fit_transform方法,转换器Mixin类 - MetaEstimatorMixin,MetaEstimator Mixin类
estimator有个属性_estimator_type,用来表示他是分类器还是回归器。这是通过两个Mixin类来实现的。
在base模块中,还提供一个clone函数,用于克隆一个现有的estimator。
线性模型
base.py
-
LinearModel线性模型的基础类- 继承
BaseEstimator,提供抽象方法fit需要子类实现。 - 它实现了
predict方法,用来预测,该方法直接输出_decision_function的结果! - 它的核心就是这个
_decision_function,代码很简单safe_sparse_dot(X, self.coef_.T, dense_output=True) + self.intercept_。
就是对特征向量X做一个仿射变换y = W X + b。此外,还有一个_set_intercept用来设置偏置$(b = \bar{y} - w \bar{x})$。 - 在实现的时候,会对数据做中心化处理,有一个私有的中心化函数
_conter_data。
- 继承
-
LinearClassifierMixin线性分类器 Mixin,只处理预测- 核心的函数是
decision_function返回样本到超平面的有向距离,和上面的函数一样(?为什么分开写)。 predict如果是两分类,返回(scores > 0).astype(np.int),多分类则返回距离最大的那个indexscores.argmax(axis=1),
最后会将结果映射会label标签的值。_predict_proba_lrLR的私有方法,输出概率!代码采用 inplaced 优化空间,可以看这个代码
- 核心的函数是
-
SparseCoefMixin稀疏系数 Mixin 类。稀疏稀疏和普通系数互相转换。L1 正则化需要继承这个类densify方法将稀疏系数转为普通向量。sparsify转为稀疏系数
-
LinearRegression线性回归模型,继承LinearModel, RegressorMixin。residues_采用@property修饰实现只读属性!0.19要废弃这个属性fit方法
是核心。对于稀疏数据,