带有单独训练和验证集的GridSeachCV错误地考虑了最终选择最佳模型的训练结果

2024-04-25 13:02:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由3500个观测值x 70个特征组成的数据集,这是我的训练集,我还有一个600个观测值x 70个特征的数据集,这是我的验证集。目标是将观测值正确分类为0或1。在

我使用Xgboost,我的目标是在分类threshold=0.5处尽可能高的精度。在

我正在进行网格搜索:

import numpy as np
import pandas as pd
import xgboost

# Import datasets from edge node
data_train = pd.read_csv('data.csv')
data_valid = pd.read_csv('data_valid.csv')

# Specify 'data_test' as validation set for the Grid Search below
from sklearn.model_selection import PredefinedSplit
X, y, train_valid_indices = train_valid_merge(data_train, data_valid)
train_valid_merge_indices = PredefinedSplit(test_fold=train_valid_indices)

# Define my own scoring function to see
# if it is called for both the training and the validation sets
from sklearn.metrics import make_scorer
custom_scorer = make_scorer(score_func=my_precision, greater_is_better=True, needs_proba=False)

# Instantiate xgboost
from xgboost.sklearn import XGBClassifier
classifier = XGBClassifier(random_state=0)

# Small parameters' grid ONLY FOR START
# I plan to use way bigger parameters' grids 
parameters = {'n_estimators': [150, 175, 200]}

# Execute grid search and retrieve the best classifier
from sklearn.model_selection import GridSearchCV
classifiers_grid = GridSearchCV(estimator=classifier, param_grid=parameters, scoring=custom_scorer,
                                   cv=train_valid_merge_indices, refit=True, n_jobs=-1)
classifiers_grid.fit(X, y)

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。在

train_valid_merge-指定我自己的验证集:

我想用我的训练集(data_train)对每个模型进行训练,并用我的一个不同/单独的验证集(data_valid)进行超参数调整。为此,我定义了一个名为train_valid_merge的函数,它将我的训练集和我的验证集连接起来,以便它们可以被馈送到GridSeachCV中,我还使用PredefineSplit来指定哪个是训练,哪个是这个合并集中的验证集:

^{pr2}$

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。在

custom_scorer-指定我自己的评分标准:

我定义了我自己的评分函数,它只是返回精度,只是看看是否同时调用了训练集和验证集:

^{3}$

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。在

时,{cd11>会打印出以下内容:

600
600
3500
600
3500
3500

这意味着对训练集和验证集都调用了评分函数。但我已经测试过,评分函数不仅被调用,而且它来自训练集和验证集的结果都被用来从网格搜索中确定最佳模型(即使我已经指定它只使用验证集结果)。

例如,对于我们的3个参数值('n_estimators': [150, 175, 200]),它考虑了训练和验证集(2个集)的得分,因此它产生了(3个参数)x(2个集)=6个不同的网格结果。因此,它从所有这些网格结果中挑选出最佳的超参数集,从而最终从训练集的结果中选出一个,而我只想考虑验证集(3个结果)。

但是,如果我在my_precision函数中添加类似的内容来绕过训练集(通过将其所有精度值设置为0):

# Remember that the training set has 3500 observations
# and the validation set 600 observations
if(len(y_true>600)):
    return 0

然后(就我的测试而言)我肯定会找到符合我的规格的最佳模型,因为训练集的精度结果太小了,因为它们都是0到。在

我的问题如下:

为什么自定义评分函数同时考虑训练集和验证集来选择最佳模型,而我已经用我的train_valid_merge_indices指定网格搜索的最佳模型只应根据验证集选择?

当模型的选择和排序将要完成时,我如何使GridSearchCV只考虑验证集和模型在其中的得分?


Tags: csvthe函数from模型import网格data
1条回答
网友
1楼 · 发布于 2024-04-25 13:02:23

I have one distinct training set and one distinct validation set. I want to train my model on the training set and find the best hyperparameters based on its performance on my distinct validation set.

那么您肯定不需要PredefinedSplit也不需要GridSearchCV

import pandas as pd
from xgboost.sklearn import XGBClassifier
from sklearn.metrics import precision_score

# Import datasets from edge node
data_train = pd.read_csv('data.csv')
data_valid = pd.read_csv('data_valid.csv')

# training data & labels:
X = data_train.iloc[:, :-1].values
y = data_train.iloc[:, -1].values   

# validation data & labels:
X_valid = data_valid.iloc[:, :-1].values
y_true = data_valid.iloc[:, -1].values 

n_estimators = [150, 175, 200]
perf = []

for k_estimators in n_estimators:
    clf = XGBClassifier(n_estimators=k_estimators, random_state=0)
    clf.fit(X, y)

    y_predict = clf.predict(X_valid)
    precision = precision_score(y_true, y_predict, average='binary')
    perf.append(precision)

并且perf将包含您在验证集中各自分类器的性能。。。在

相关问题 更多 >

    热门问题