sklearn编程模型

来源:互联网 发布:手机画图软件排行 编辑:程序博客网 时间:2024/06/05 13:37

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.targetestimater.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的fitpredict有些地方用abc metaclass来保证,但不是很统一,好像有个基类BaseEstimator,又用mixin、又用metaclass的,自己要实现一个estimator也不知道继承哪一个。

没找到sklearn的类继承图,它的各个estimator分布在不同模块里,那么要实现一个estimator,可能的方法

  • 直接继承成熟的estimator,如LinearRegression,svm.SVC,然后修改fit和predict函数
  • 不继承,完全实现,因为就算继承了,基类中也没什么可复用的代码