python - 训练数据上的gridCV.score方法与gridCV.best_score_之间的区别
问题描述
我对 randomsearch.score 方法(得分 1)和 randomsearch.best_score_ 属性(得分 2)之间的区别有疑问。
特别是当 randomsearch.score 应用于 X_train 和 y_train 时。
我认为 randomsearchCV 会自动查找在训练集上得分最高的参数?我会假设 randomsearch.score(Xtrain, ytrain) 将与 randomsearch.best_params_ 分数相同?
from sklearn.model_selection import RandomizedSearchCV
def evaluate_model(model, param_grid, n_iter=100):
random_search = RandomizedSearchCV(model,
param_grid,
cv=5,
n_jobs=2,
verbose=1,
n_iter=n_iter)
random_search.fit(X_train, y_train)
print (random_search.score(X_train, y_train)) # Score 1
print (random_search.best_score_) # Score 2
print (random_search.score(X_test, y_test)) # Score 3
return random_search
rgr = GradientBoostingRegressor(n_estimators=50)
param_grid = {"max_depth": range(1,10,1)}
gradient_boosting = evaluate_model(rgr, param_grid)
而是返回
Score 1: 0.9585014239352219
Score 2: 0.7129331788310186
Score 3: 0.7530744077231204
解决方案
使用random_search.score(X_train, y_train)
,您正在测试用于训练的相同数据,因此得分如此之高。这是(几乎)完全没有意义的信息**,因为它不会告诉您模型在看不见的数据中的表现如何。
cv=5
表示您的数据针对每个超参数设置进行了 5 次分区,每个分区中 20% 的数据用于测试,80% 用于训练。然后对这 5 个测试集的结果进行平均。然后在所有可能的超参数设置中记录最高的此类平均值random_search.best_score_
。所以关键的区别是你没有评估用于训练的相同数据的性能,因此分数相对较低。
random_search.score(X_test, y_test)
与您在看不见的数据上评估模型相同best_score_
,但它是实际泛化性能的更好指标。但是,与您的模型不同score 2
的是,您的模型已使用 100% 的训练数据(而不是 80%)进行了训练。这是为什么score 3
优于的一种可能解释score 2
。
**如果这个值很低,你就知道你的模型是欠拟合的,应该尝试增加模型的复杂度,比如向 NN 添加更多的隐藏层,或者增加max_depth
决策树。
推荐阅读
- clipboard - 应用程序退出使用 GTK3 后,如何在系统剪贴板上存储文本?
- javascript - 如何水平放置我的元素以与 CSS 做出反应
- .net - EF Core FromSql 问题
- amazon-s3 - 使用从 S3 事件调用的 AWS Lambda 触发 Airflow DAG
- mongodb - Graphql创建两个查询之间的关系。初始化前错误无法访问
- r - 我想在 r 语言中查找和删除包含某些数据的行?
- kotlin - Kotlin - 从两个线程访问集合时如何锁定集合
- c# - 使用 DbConnection 初始化 EF Core DbContext 连接
- wordpress - 根据表单输入更改弹出消息
- javascript - React Hooks TypeScript 事件和状态类型