使用Sklearn GridSearchCV和Pipeline时如何传递权重

时间:2018-05-14 14:56:10

标签: python scikit-learn pipeline cross-validation grid-search

我正在研究文本分类模型,我正在使用PipelineGridSearch Cross Validation。代码片段如下:

count_vec=CountVectorizer(ngram_range=(1,2),stop_words=Stopwords_X,min_df=0.01)
TFIDF_Transformer=TfidfTransformer(sublinear_tf=True,norm='l2')

my_pipeline=Pipeline([('Count_Vectorizer',count_vec),
                    ('TF_IDF',TFIDF_Transformer),
                    ('MultiNomial_NB',MultinomialNB())])

param_grid={'Count_Vectorizer__ngram_range':[(1,1),(1,2),(2,2)],
               'Count_Vectorizer__stop_words':[Stopwords_X,stopwords],
               'Count_Vectorizer__min_df':[0.001,0.005,0.01],
               'TF_IDF__sublinear_tf':[True,False],
               'TF_IDF__norm':['l2'],
               'TF_IDF__smooth_idf':[True,False],
               'MultiNomial_NB__alpha':[0.2,0.4,0.5,0.6],
               'MultiNomial_NB__fit_prior':[True,False]}

# Grid Search CV with pipeline
model=GridSearchCV(estimator=my_pipeline,param_grid=param_grid,
                   scoring=scoring,cv=4,verbose=1,refit=False)

然而,由于数据高度不平衡,我想将权重传递给管道中的MultinomialNB分类器。我知道我可以将权重传递给管道中的元素(如下所示):

model.fit(Data_Labeled['Clean-Merged-Final'], 
          Data_Labeled['Labels'],MultiNomial_NB__sample_weight=weights)

我的问题是如何在没有形状错误的情况下进行编译?因为权重仅传递给管道中的最终元素(MultiNomial_NB分类器),而CV分区进入管道的X / Y源。

1 个答案:

答案 0 :(得分:2)

GridSearchCV根据交叉验证迭代器处理sample_weights的相应分解。

GridSearchCV在数据内部调用_fit_and_score()方法并传递训练数据的索引。到目前为止,fit_params用于整个数据。现在这个函数依次调用函数_index_param_value,它处理sample_weight(或其他fit_params)的拆分 在这一行:

     ...
     return safe_indexing(v, indices)
     ...

这已在以下问题中讨论过: