我对比较最佳GridSearchCV模型和基准模型有点困惑。
例如,我们有一个分类问题。
作为基准,我们将使用默认设置拟合一个模型(假设是逻辑回归):
from sklearn.linear_model import LogisticRegressionfrom sklearn.metrics import accuracy_scorebaseline = LogisticRegression()baseline.fit(X_train, y_train)pred = baseline.predict(X_train)print(accuracy_score(y_train, pred))
因此,基准模型使用整个训练样本来计算准确率。
接下来是GridSearchCV:
from sklearn.model_selection import cross_val_score, GridSearchCV, StratifiedKFoldX_val, X_test_val,y_val,y_test_val = train_test_split(X_train, y_train, test_size=0.3, random_state=42)cv = StratifiedKFold(n_splits=5, random_state=0, shuffle=True)parameters = [ ... ]best_model = GridSearchCV(LogisticRegression(parameters,scoring='accuracy' ,cv=cv))best_model.fit(X_val, y_val)print(best_model.best_score_)
这里,我们基于验证样本来计算准确率。
我的问题是:
- 这些准确率分数可以比较吗?一般来说,比较GridSearchCV和没有进行交叉验证的模型是否公平?
- 对于基准模型,是否也应该使用验证样本(而不是整个训练样本)?
回答:
不,它们不可比较。
你的基准模型使用X_train
来拟合模型。然后你用拟合后的模型来评分X_train
样本。这就像作弊,因为模型已经看到了数据,评估时会表现得最好。
网格搜索模型处于劣势,因为:
- 它使用的数据较少,因为你已经分割了
X_train
样本。 - 再加上由于5折交叉验证,它训练时使用的数据更少(每折仅使用
X_val
的4/5)。
因此,网格搜索的得分会比基准模型差。
现在你可能会问,“那么best_model.best_score_
有什么用?”这个分数用于比较在搜索最优超参数时使用的所有模型,但在任何情况下都不应用于与在网格搜索环境之外训练的模型进行比较。
那么,如何进行公平的比较呢?
- 为两个模型分割你的训练数据。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
- 使用
X_train
来拟合你的模型。
# 拟合基准模型baseline.fit(X_train, y_train)# 使用网格搜索拟合best_model.fit(X_train, y_train)
- 对
X_test
评估模型。
# 基准模型baseline_pred = baseline.predict(X_test)print(accuracy_score(y_test, baseline_pred))# 网格搜索grid_pred = best_model.predict(X_test)print(accuracy_score(y_test, grid_pred))