Y 模型验证的加扰
Y Scrambling 是一种可以用来测试模型做出的预测是否不是偶然做出的方法。它用于验证多元线性回归 QSPR 模型。它有许多名称,Y-Scramble、Y-Randomization、Y-Permutation 等。这个过程执行起来非常简单,我们将详细了解它。
Y-Scramble的步骤:
Y-Scrambling 背后的直觉非常简单,首先您在原始数据上训练模型并注意其性能指标。接下来要做的是对目标列进行混洗,以便正确的特征-目标对现在被新的不正确的特征-目标对替换。现在您需要根据这些数据训练模型并记下其性能指标。您重新洗牌目标列并重复这些步骤。我们期望该模型在原始数据上表现良好,而在混洗数据上表现不佳。如果情况并非如此,并且指标变化不大,则意味着预测不可靠。分步过程如下:-
- 在原始特征-目标对上训练模型。
- 注意性能指标。
- 重复直到一定的迭代次数
- 随机播放目标列。
- 在新的特征-目标对上训练模型。
- 注意性能指标
- 分析原始对与洗牌对的度量。
实施 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])