【发布时间】:2020-08-23 19:26:29
【问题描述】:
我正在研究一个分类问题,我需要预测文本数据的类别。我需要为我正在考虑使用GridSearchCV 的分类模型进行超参数调整。我也需要做StratifiedKFold,因为我的数据不平衡。我知道GridSearchCV 内部使用StratifiedKFold 如果我们有多类分类。
我读过here,在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_cv.fit(X, y) 会在内部将 X 拆分为 X_train、X_test k 次,然后进行预测以提供最佳估算器。
在我的情况下,X 应该是什么?如果是在fit_transform之后生成的X,那么在内部将X拆分为训练和测试时,测试数据已经经历了fit_transform,但理想情况下它应该只经历变换。
我担心的是,在我的情况下,在 GridSearchCV 内部,我如何能够控制 fit_transform 仅应用于训练数据而转换应用于测试数据(验证数据)。
因为如果它在内部将 fit_transform 应用于整个数据,那么这不是一个好习惯。
【问题讨论】:
标签: machine-learning scikit-learn cross-validation tf-idf grid-search