Part 1 步骤
-
首先,需要
sklearn.base
中的两个类BaseEstimator
和TransformerMixin
-
其次,定义自定义变换继承上述两个类,如
class CustomFunction(BaseEstimator,TransformerMixin)
-
最后,在自定义变换中定义
fit
和transform
函数
Part 2 实例
-
目标:对于某个含有10个特征的数据集,现在想找到最佳的特征组合使识别率最高,使识别率最高
-
说明:为了达到这个目标,就是采用
GridSearchCV
的方法,根据CV得分,直接挑选出最佳的特征组合。因此需要构建一个Pipeline
能够放入GridSearchCV
中。但是,光构建Pipeline
还不够,还需要定义一个能够加入Pipeline
的选取特定特征组合的变换 -
以下为代码实例:
-
构建特征组合变换
SelectRowTransformer
-
生成数据
make_classification
-
构建
Pipeline
-
网格搜素
GridSearchCV
-
from sklearn.base import BaseEstimator,TransformerMixin
from sklearn.datasets import make_classification
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC
from sklearn.grid_search import GridSearchCV
from itertools import combinations
class SelectRowTransformer(BaseEstimator,TransformerMixin):
def __init__(self,comb_idx = [0,]):
self.comb_idx = comb_idx
def fit(self,X,y=None):
return self
def transform(self,X,y =None):
return X[:,self.comb_idx].copy()
if __name__ == '__main__':
__spec__ = None
K = 10
data, label = make_classification(n_samples=200, n_informative=4,n_redundant=0,
random_state=223,n_features=K)
pipe = Pipeline([
('Comb',SelectRowTransformer() ),
('SVC',LinearSVC() ),
])
param = {
'Comb__comb_idx':[i for j in range(K) for i in combinations(range(K),j+1)],
'SVC__C':[2**(f-2) for f in range(5)]
}
grid = GridSearchCV(pipe,param,cv=3,verbose=1,n_jobs=-1)
grid.fit(data,label)
print( '最佳CV得分:{0}, 最佳得分对应的特征组合:{1}, SVC-C:{2}'.format(grid.best_score_,
grid.best_params_['Comb__comb_idx'],grid.best_params_['SVC__C']))
- 结果
网友评论