python - 如何为回归计算训练 VS 测试调整后的 R^2
问题描述
对于训练和测试集的调整后 R^2 的计算,我有点困惑。在为我的训练和测试数据集计算调整后的 R^2 系数 ( n )时,我应该使用多少个观察值?
这是调整后的 R2 公式,其中:
- n表示数据中的点(行)数
- k表示独立回归变量的数量(不包括响应变量的列)
我的问题是,在训练和测试数据上计算调整后的 R^2 时使用的n是多少?
我使用了此处提到的另一个问题的公式(从 sklearn 获得了 r2)函数。
adj_r2 = 1 - (1-r2)*(len(X)-1)/(len(X)-X.shape[1]-1)
其中 X 是 X_train 或 X_test。
对于X_train
和X_test
,k
相同但n
不同。以 80-20 分割为例,得到 8 个训练行和 2 个测试行。计算调整后的 R^2 时是否使用相应的 train/test n
?
我觉得使用不同n
会导致调整后的 R^2 发生巨大差异,从而导致测试 R^2 受到更多惩罚。
解决方案
是的,您应该分别使用每个数据集中的观察次数。即:n_train = len(X_train)
和n_test = len(X_test)
。
你是对的,这可能会导致调整后的 R2 值发生剧烈变化,但前提是你的模型不稳定。这就是将数据拆分为训练和测试数据集背后的全部想法:您希望您的模型能够很好地概括以前看不见的数据。如果您的模型是稳定的,它将在所有数据集中具有相似的性能指标。
如果您的 R2 系数变化很大,这表明您的模型对训练数据过度拟合。您的目标是通过调整模型的超参数、转换或删除某些变量等来最小化这种差异。
推荐阅读
- string - MarkLogic 字符串查询 NOT NOT_IN 逻辑
- c# - CsvHelper - 映射到非默认构造函数,忽略构造函数中不包含的属性
- javascript - ReactJs - 调用第二个函数参数
- regex - oracle中的常规exp
- python - 所有圆列表的边界框
- docker - 我的容器化 tomcat Web 应用程序看不到配置的 log4j2.xml
- python - Python keras:to_categorical indexerror
- javascript - 是否可以覆盖时钟功能,以便我可以更改它的时间?
- c# - 限制对 Logs 文件夹的访问
- vue.js - 切换到移动视图后VueJs滚动条消失