将 Sklearn GridSearchCV 与 Pipeline 一起使用时如何传递权重
Posted
技术标签:
【中文标题】将 Sklearn GridSearchCV 与 Pipeline 一起使用时如何传递权重【英文标题】:How to pass weights when using Sklearn GridSearchCV with Pipeline 【发布时间】:2018-10-24 07:03:35 【问题描述】:我正在研究文本分类模型,我正在使用Pipeline
和GridSearch 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 馈送进行分区。
【问题讨论】:
你是说你没有得到任何你应该得到的错误? @VivekKumar 是的,我的理解是 fit 方法将数据分成 4 折,每次保留一组,而 weights 参数直接进入管道末端的分类器,导致形状不一致。或者也许我错过了什么...... 【参考方案1】:GridSearchCV 根据交叉验证迭代器处理适当的 sample_weights 分解。
GridSearchCV 在数据内部调用_fit_and_score()
方法并传递训练数据的索引。到目前为止,fit_params 是针对整个数据的。现在这个函数依次调用函数_index_param_value
,它处理sample_weight
(或其他fit_params)的拆分
在这一行:
...
return safe_indexing(v, indices)
...
这已在此处的问题中进行了讨论:
https://github.com/scikit-learn/scikit-learn/issues/2879 https://github.com/scikit-learn/scikit-learn/issues/9203【讨论】:
以上是关于将 Sklearn GridSearchCV 与 Pipeline 一起使用时如何传递权重的主要内容,如果未能解决你的问题,请参考以下文章
GridSearchCV/RandomizedSearchCV 与 sklearn 中的 partial_fit
SKLEARN // 将 GridsearchCV 与列变换和管道相结合
我从 GridSearchCV 获得的 R^2 分数与我从 cross_val_score 获得的分数非常不同,为啥? (sklearn,python)