减少回归模型中一个变量对输出的影响

Posted

技术标签:

【中文标题】减少回归模型中一个变量对输出的影响【英文标题】:Diminishing the impact of one variable over output in a regression model 【发布时间】:2020-06-14 05:06:49 【问题描述】:

目前我正在实现一个高斯回归过程模型,并且在尝试将其应用于我的问题范围时遇到了一些问题。我的问题是我的模型有三个变量作为输入,其中一个值 (theta) 比其他两个值 (alpha1alpha2) 具有更大的影响。输入和输出具有以下值(只是几个值以便更好地理解):

# X (theta, alpha1, alpha2)
array([[ 9.07660169,  0.61485493,  1.70396493],
       [ 9.51498486, -5.49212002, -0.68659511],
       [10.45737558, -2.2739529 , -2.03918961],
       [10.46857663, -0.4587848 ,  0.54434441],
       [ 9.10133699,  8.38066374,  0.66538822],
       [ 9.17279647,  0.36327109, -0.30558115],
       [10.36532505,  0.87099676, -7.73775872],
       [10.13681026, -1.64084098, -0.09169159],
       [10.38549264,  1.80633583,  1.3453195 ],
       [ 9.72533357,  0.55861224,  0.74180309])

# y
array([4.93483686, 5.66226844, 7.51133372, 7.54435854, 4.92758927,
       5.0955348 , 7.26606153, 6.86027353, 7.36488184, 6.06864003])

可以看出,theta 显着改变了 y 的值,而 alpha1alpha2 的变化比 y 更微妙。

我面临的情况是,我正在将模型应用于我的数据,并且在该模型之外,我正在使用 Scipy 对模型进行最小化,将其中一个输入变量固定为该最小化。下面的代码可能会更好地说明:

# model fitting
kernel = C(1.0, (1e-3, 1e3))*RBF(10,(1e-2,1e2))
model = GaussianProcessRegressor(kernel = kernel, n_restarts_optimizer = 9,optimizer='fmin_l_bfgs_b')
model.fit(X,y)

# minimization
bnds = np.array([(theta,theta),
                 (alpha1.min(),
                  alpha1.max()),
                 (alpha2.min(),
                  alpha2.max())])

x0 = [theta,alpha1.min(),alpha2.min()]

residual_plant = minimize(lambda x: -model.predict(np.array([x])),
                          x0, method='SLSQP',bounds=bnds, 
                          options = 'eps': np.radians(5))

我的目标是我想将第一个变量 value 设置为固定值,并且我想研究其他两个变量 alpha1alpha2 对输出 y 的影响对于那个特定的theta 值。最小化背后的具体原因是,我想找到alpha t1alpha2 的组合,它们为我返回这个固定theta 的最佳y。因此,我想知道我该怎么做,因为我相信theta 一定会极大地影响我的其他两个变量对我的输出的影响,然后它可能会对我的模型对我的任务产生负面影响手,因为它的重量较重,并且会隐藏 alpha1alpha2 对我的模型的影响,但是,我不能真正忽略它或不将它输入到我的模型中,因为我想找到最佳的 y 值对于这个固定的theta,因此我仍然需要使用theta 作为输入。

我的问题是,如何处理这样的问题?是否有任何统计技巧可以消除或至少减少这种影响,而不必从我的模型中消除theta?有没有更好的方法来处理我的问题?

【问题讨论】:

您可以探索具有正则化的模型。通过增加正则化,变量的影响可能会扩散。当然,这将取决于数据。 你能提供你的数据集吗? 【参考方案1】:

首先,您是否在训练前对数据进行了归一化?

第二,听起来你想用常数theta来查看x和y之间的关系。

如果您获取数据集并按 theta 对其进行排序,您可以尝试找到一组 theta 相同或非常相似、方差低且变化不大的记录。您可以获取该组数据并形成一个新的数据框,然后删除 theta 列(因为我们选择了数据集的一部分,其中 theta 具有低方差,因此它不是很有用)。然后,您可以训练您的模型或仅对 alpha1 和 alpha2 数据进行一些数据可视化。

【讨论】:

是的,我把它标准化了。感谢您的提示,但是我会说这对于我的情况是不可能的,这就是我正在寻找替代方法的原因。通过这样做,我将没有足够的训练数据点,我的结果也不会发生太大变化。如果我尝试使用更宽的 theta 区间,我仍然会面临我在这里描述的同样问题 这真的很难。我会尝试在 3 维中可视化数据,看看是否有帮助。如果没有,请尝试以尽可能多的方式将其可视化,并尝试以您想要的方式理解它。【参考方案2】:

我对您的问题的总体理解是您想要实现两件事:

    研究α1和α2在将theta转为常数后的影响(即消除theta对模型的影响)。

    找到 alpha1 和 alpha2 的最佳组合,以返回此固定 theta 的最佳 y。

这可以在输入变量和目标变量之间的相关性研究下进行总结。

由于 Correlation 独立研究一个变量与另一个变量之间关系的变化,因此您可以很好地了解 alpha1、alpha2 和 theta 对 y 的影响。

存在两个有趣的相关性可以帮助您:

    Pearson 相关性:数值反映线性相关性的强度。 Spearman 相关性:数值反映单调相关性的强度(即等级,以防相关性不是线性的)。

让我们试一试:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame(columns=['theta', 'alpha1', 'alpha2', 'y'],
                  data=[[ 9.07660169,  0.61485493,  1.70396493, 4.93483686],
                       [ 9.51498486, -5.49212002, -0.68659511, 5.66226844],
                       [10.45737558, -2.2739529 , -2.03918961,  7.51133372],
                       [10.46857663, -0.4587848 ,  0.54434441, 7.54435854],
                       [ 9.10133699,  8.38066374,  0.66538822, 4.92758927],
                       [ 9.17279647,  0.36327109, -0.30558115, 5.0955348],
                       [10.36532505,  0.87099676, -7.73775872, 7.26606153],
                       [10.13681026, -1.64084098, -0.09169159, 6.86027353],
                       [10.38549264,  1.80633583,  1.3453195, 7.36488184],
                       [ 9.72533357,  0.55861224,  0.74180309, 6.06864003]])


plt.figure(figsize=(10, 8))
ax = sns.heatmap(df.corr(method="pearson"), annot=True)
plt.xticks(rotation = 90)
plt.title('Pearson Correlation Heatmap')
plt.show()

plt.figure(figsize=(10, 8))
ax = sns.heatmap(df.corr(method="spearman"), annot=True)
plt.xticks(rotation = 90)
plt.title('Spearman Correlation Heatmap')
plt.show()

如您所见,我们对 theta、alpha1 和 alpha2 彼此之间以及与 y 之间的关系有了很好的了解。

根据科恩的标准,我们可以得出结论:

Alpha1 和 Alpha2 与 y 具有中等相关性。 Theta 与 y 具有很强的相关性。 Alpha1 与 alpha2 线性相关性较弱,但单调相关性中等。 Alpha1 和 Alpha2 与 theta 具有中等相关性。

但是等一下,由于 alpha1 和 alpha2 与 y 具有中等相关性,但彼此之间的相关性较弱(至中等),我们可以利用方差来生成优化函数 L,它是 alpha1 和alpha2,如下:

mn为两个权重,根据优化函数L,最大化alpha1和alpha2特征与y的相关性:

m * alpha1 + n * alpha2

Ly 之间实现最大相关性的最佳系数mn 确实取决于alpha1、alpha2 和y 的方差。

我们可以由此得出以下优化方案:

m = [ ???(?,?) * ???(?,?) − ???(?,?) * ???(?) / ???(?,?) * ???(?,?) − ???(?,?) * ???(?) ] * n

其中abc分别对应alpha1、alpha2和y。

通过选择 mn 为 1 或 -1 ,我们可以找到设计新功能的最佳解决方案。

cov = df[['alpha1', 'alpha2', 'y']].cov()

# applying the optimization function: a = alpha1 , b = alpha2 and c = y
# note that cov of a feature with itself = variance
coef = (cov['alpha2']['y'] * cov['alpha1']['alpha2'] - cov['alpha1']['y'] * cov['alpha2']['alpha2']) / \
       (cov['alpha1']['y'] * cov['alpha1']['alpha2'] - cov['alpha2']['y'] * cov['alpha1']['alpha1'])
# let n = 1 --> m = coef --> L = coef * alpha1 + alpha2 :  which is the new feature to add
df['alpha12'] = coef * df['alpha1'] + df['alpha2']

如您所见,引入的 alpha12 的相关性有明显改善。

此外,与问题1相关,降低theta的相关性;并且由于相关性由下式给出:

Corr(theta, y) = Cov(theta, y) / [sqrt(Var(that)) * sqrt(Var(y))]

您可以增加 theta 的方差。为此,只需从某个分布中采样 n 个点,并将它们作为噪声添加到相应的索引中。 保存此噪声列表以备将来使用,以防您需要返回原始 theta,如下所示:

cov = df[['y', 'theta']].cov()
print("Theta Variance :: Before = ".format(cov['theta']['theta']))

np.random.seed(2020)  # add seed to make it reproducible for future undo
# create noise drawn from uniform distribution
noise = np.random.uniform(low=1.0, high=10., size=df.shape[0])
df['theta'] += noise  # add noise to increase variance
cov = df[['y', 'theta']].cov()
print("Theta Variance :: After = ".format(cov['theta']['theta']))

# df['theta'] -= noise to back to original variance

plt.figure(figsize=(15, 15))
ax = sns.heatmap(df.corr(method="spearman"), annot=True)
plt.xticks(rotation = 90)
plt.title('Spearman Correlation Heatmap After Reducing Variance of Theta\n')
plt.show()

plt.figure(figsize=(15, 15))
ax = sns.heatmap(df.corr(method="pearson"), annot=True)
plt.xticks(rotation = 90)
plt.title('Pearson Correlation Heatmap After Reducing Variance of Theta\n')
plt.show()

Theta 方差 :: Before = 0.3478030891329485

Theta 方差 :: After = 7.552229545792681

现在Alpha12领先,对目标变量y的影响最大。

【讨论】:

看起来很有趣。我不得不承认我还没有时间仔细阅读它。你有什么建议我可以在哪里阅读更多相关信息?【参考方案3】:

我会说 theta 对您的预测变量的影响不能隐藏其他变量的影响。其他变量的影响可能很小,但很可能就是这样。我会接受你的估计,并按原样优化 y 以获得恒定的 theta

【讨论】:

以上是关于减少回归模型中一个变量对输出的影响的主要内容,如果未能解决你的问题,请参考以下文章

怎么对多元线性回归模型的回归系数β做t检验和F检验

SPSS 多元线性回归结果中,系数模型下的1,B,t,Sig.分别啥意思。在线等!!急求高手解答!!

SPSS 多元线性回归结果中,系数模型下的1,B,t,Sig.分别啥意思。在线等!!急求高手解答!!

多元线性回归中自变量减少预测误差变大回归平方怎么变化

如何减少R中逻辑回归模型中的分类变量

逻辑回归和判别分析的区别