sklearn编程模型
数据集
sklearn.datasets自带一些经典数据集,方便用于实验。以iris数据集为例
.data是一个150x4的矩阵,每行是一个样本,每列是一个feature,feature的名字在.feature_names,.target是150x1的数组,对应每个样本的目标:
sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) | .target |
---|---|---|---|---|
5.100 | 3.500 | 1.400 | 0.200 | 0 |
4.900 | 3.000 | 1.400 | 0.200 | 0 |
4.700 | 3.200 | 1.300 | 0.200 | 0 |
4.600 | 3.100 | 1.500 | 0.200 | 0 |
… | … | … | … | … |
通常用法如下,用大写表示矩阵,小写表示数组。数据集可以按需求拆分成训练集和测试集使用。
X, y = iris.data, iris.target
estimater.fit(X, y)
estimator(估计器)
有了数据集之后就是训练与分类/回归的过程,新建一个estimator,先用estimator.fit(X, y)
训练,然后用estimator.predict(T)
测试,示例如下,如果这个estimator是一个分类器,给他的实例起名叫classifier会比较清晰:
>>> from sklearn import svm
>>> classifier = svm.SVC(gamma=0.001, C=100.)
>>> classifier.fit(iris.data[:-1], iris.target[:-1]) #保留最后一条样本,用于测试
>>> classifier.predict(iris.data[-1:])
transformer(数据集转换)
transformer实现fit
transform
,还有一个方便的组合fit_transform
transformer涵盖很广,包括数据预处理、数据降维、特征提取等,它的接口和estimator很类似,transformer和estimator常被组织进Pipeline,按步骤操作。
Pipeline
前一个transformer.transform()输出给下一个,这样就串联起来了,最后一个步骤通常是个estimator。预处理、降维、训练,调用一次fit
就行了。
#PCA是个transformer,做降维,SVC是个estimator,训练
>>> estimators = [('reduce_dim', PCA()), ('clf', SVC())]
>>> pipe = Pipeline(estimators)
>>> pipe.fit(X, y)
FeatureUnion
和Pipeline类似,但不是串联,是并联,把多个transformer处理过的数据合起来输出
>>> estimators = [('linear_pca', PCA()), ('kernel_pca', KernelPCA())]
>>> combined = FeatureUnion(estimators)
>>> combined.fit(X, y).transform() #假设PCA提取2个特征,KernelPCA提取3个特征,变换样本数不变,输出5列
#也可以并联之后再串联
>>> pipeline = Pipeline([("features", combined), ("svm", svm)])
sklearn模块、类组织方法
estimator和Pipeline可以fit
predict
,transformer和FeatureUnion可以fit
transform
,接口很相似,便于相互配合工作。
python没有强制interface保证,比如estimator的fit
和predict
有些地方用abc metaclass来保证,但不是很统一,好像有个基类BaseEstimator,又用mixin、又用metaclass的,自己要实现一个estimator也不知道继承哪一个。
没找到sklearn的类继承图,它的各个estimator分布在不同模块里,那么要实现一个estimator,可能的方法
- 直接继承成熟的estimator,如LinearRegression,svm.SVC,然后修改fit和predict函数
- 不继承,完全实现,因为就算继承了,基类中也没什么可复用的代码