Machine learning GridSearchCV+;TFIDF情况下的层状褶皱

Machine learning GridSearchCV+;TFIDF情况下的层状褶皱,machine-learning,scikit-learn,cross-validation,tf-idf,grid-search,Machine Learning,Scikit Learn,Cross Validation,Tf Idf,Grid Search,我正在研究一个分类问题,需要预测文本数据的类别。我需要对我的分类模型进行超参数调整,我正在考虑使用GridSearchCV。我也需要做分层折叠,因为我的数据不平衡。我知道,GridSearchCV在内部使用StratifiedKFold,如果我们有多类分类 我已经了解到,在TfidfVectorizer的情况下,我们将fit_transform应用于训练数据,而仅对测试数据进行转换。 这就是我在下面使用StratifiedKFold所做的 skf = StratifiedKFold(n_spli

我正在研究一个分类问题,需要预测文本数据的类别。我需要对我的分类模型进行超参数调整,我正在考虑使用
GridSearchCV
。我也需要做分层折叠,因为我的数据不平衡。我知道,
GridSearchCV
在内部使用
StratifiedKFold
,如果我们有多类分类

我已经了解到,在
TfidfVectorizer
的情况下,我们将
fit_transform
应用于训练数据,而仅对测试数据进行转换。

这就是我在下面使用
StratifiedKFold
所做的

skf = StratifiedKFold(n_splits=5, random_state=5)

for train_index, test_index in skf.split(X, y):
    iteration = iteration+1
    print(f"Iteration number {iteration}")
    X_train, y_train = X.iloc[train_index], y.iloc[train_index]
    X_test, y_test = X.iloc[test_index], y.iloc[test_index]

    train_tfid = tfidf_vectorizer.fit_transform(X_train.values.astype('U'))
    test_tfid = tfidf_vectorizer.transform(X_test.values.astype('U'))

    svc_model = linear_model.SGDClassifier()
    svc_model.fit(train_tfid, y_train.values.ravel())
我得到的精度/f1不好,因此考虑使用GridSearchCV进行超参数调整。 在GridSearchCV中,我们是这样做的

c_space = np.logspace(-5, 8, 15) 
param_grid = {'C': c_space} 

# Instantiating logistic regression classifier 
logreg = LogisticRegression() 

# Instantiating the GridSearchCV object 
logreg_cv = GridSearchCV(logreg, param_grid, cv = 5) 

logreg_cv.fit(X, y) 
根据我的说法,
logreg\u cv.fit(X,y)
将在
X\u序列中对X进行内部分割,
X\u测试
k次,然后进行预测,以给出最佳估计值

在我的情况下,X应该是什么?如果是在
fit_变换
后生成的X,那么在内部,当X被分解为训练和测试时,测试数据已经经历了
fit_变换
,但理想情况下,它应该只经历变换

我关心的是,在我的案例中,
GridSearchCV
如何控制
fit_transform
仅应用于训练数据,而transform应用于测试数据(验证数据)


因为如果它在内部对整个数据应用fit_transform,那么这不是一个好的做法。

这正是您应该在
GridSearchCV
中使用
Pipeline
的场景。首先,使用数据预处理、特征选择和模型等必要步骤创建管道。在此管道上调用
GridSearchCV
后,它将仅对训练折叠进行数据处理,然后与模型匹配

阅读了解更多关于sklearn中型号选择模块的信息

从sklearn.dataset导入fetch\u 20newsgroups
从sklearn.feature\u extraction.text导入countvectorier
从sklearn.pipeline导入管道
从sklearn.employ导入随机林分类器
从sklearn.linear_模型导入逻辑回归
从sklearn.model_selection导入列车测试_split,GridSearchCV
将numpy作为np导入
猫=['alt.athesis','sci.space']
新闻组\u train=fetch\u 20新闻组(subset='train',
删除=(“页眉”、“页脚”、“引号”),
类别(猫)
十、 y=新闻组\u train.data,新闻组\u train.target
X_列车,X_试验,y_列车,y_试验=列车试验(
十、 y,测试尺寸=0.1,分层=y)
我的管道=管道([
('vectorizer',CountVectorizer(stop_words='english')),
('clf',logisticsregression())
])
参数={'clf_u_C':np.logspace(-5,8,15)}
网格搜索=网格搜索CV(我的管道,参数网格=参数,
cv=10,n_作业=-1,得分='准确性')
网格搜索.fit(X\u列,y\u列)
打印(网格搜索。最佳参数)
#{'clf_uuuc':0.439970560760795}
网格搜索得分(X\u测试,y\u测试)
# 0.8981481481481481