📜  Y 模型验证的加扰

📅  最后修改于: 2022-05-13 01:55:12.422000             🧑  作者: Mango

Y 模型验证的加扰

Y Scrambling 是一种可以用来测试模型做出的预测是否不是偶然做出的方法。它用于验证多元线性回归 QSPR 模型。它有许多名称,Y-Scramble、Y-Randomization、Y-Permutation 等。这个过程执行起来非常简单,我们将详细了解它。

Y-Scramble的步骤:

Y-Scrambling 背后的直觉非常简单,首先您在原始数据上训练模型并注意其性能指标。接下来要做的是对目标列进行混洗,以便正确的特征-目标对现在被新的不正确的特征-目标对替换。现在您需要根据这些数据训练模型并记下其性能指标。您重新洗牌目标列并重复这些步骤。我们期望该模型在原始数据上表现良好,而在混洗数据上表现不佳。如果情况并非如此,并且指标变化不大,则意味着预测不可靠。分步过程如下:-

  1. 在原始特征-目标对上训练模型。
  2. 注意性能指标。
  3. 重复直到一定的迭代次数
    • 随机播放目标列。
    • 在新的特征-目标对上训练模型。
    • 注意性能指标
  4. 分析原始对与洗牌对的度量。

实施 Y 加扰:

在本教程中,我将使用 sklearn 的数据集模块中存在的波士顿房屋定价数据集,该数据集将返回一个字典,其中的特征将出现在数据键下,目标出现在目标键下。让我们从导入数据开始:-

import numpy as np
from sklearn.datasets import load_boston

data = load_boston()
X = data.data
Y = data.target

现在我们有了特征和目标,让我们执行 Y 加扰的前两个步骤,即训练模型并注意性能指标。

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

reg = LinearRegression()
reg.fit(X,Y)

ypred = reg.predict(X)
original_r2 = r2_score(Y,ypred)
print(original_r2)

original_r2 结果是0.74064。至此,我们已经完成了前两个步骤。现在我们将继续下一步,即对目标数组进行混洗、训练模型并将性能指标存储在循环中。必须重复这些步骤。我在本教程中将其作为 100 的迭代次数。需要注意的一件事是



shuffled_r2 = []
from tqdm.notebook import trange
for i in trange(100):
    np.random.shuffle(Y)
    
    reg = LinearRegression()
    reg.fit(X,Y)
    
    ypred = reg.predict(X)
    shuffled_r2.append(r2_score(Y,ypred))

如果您打印 shuffled_r2,您会看到该模型的表现很糟糕。 shuffled_r2 的前几个值如下:-

>>> shuffled_r2[:20]
[0.015336761335013271,
 0.0176654793204013,
 0.01740534118134418,
 0.02319807700450416,
 0.018487786525668626,
 0.02251746334707183,
 0.03766952947632973,
 0.01854475963361435,
 0.03570134149232318,
 0.022607830815118635,
 0.016603896471999002,
 0.0386838401376941,
 0.024355424374905343,
 0.04058673452547956,
 0.014581835385169217,
 0.03193842111822809,
 0.03366492627548756,
 0.02274120932669821,
 0.04335824299249236,
 0.02665799106621214]

代码:

Python3
import numpy as np
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
  
# LOADING THE DATA
data = load_boston()
X = data.data
Y = data.target
  
#TRAINING OVER ORIGINAL TARGET
reg = LinearRegression()
reg.fit(X,Y)
  
ypred = reg.predict(X)
original_r2 = r2_score(Y,ypred)
print(original_r2)
  
# TRAINING OVER SHUFFLED TARGET
shuffled_r2 = []
  
for i in range(100):
    np.random.shuffle(Y)
      
    reg = LinearRegression()
    reg.fit(X,Y)
      
    ypred = reg.predict(X)
    shuffled_r2.append(r2_score(Y,ypred))
  
print(shuffled_r2[:20])