import pandas as pd import numpy as np from statsmodels.stats.outliers_influence import variance_inflation_factor from sklearn.preprocessing import PolynomialFeatures def calculate_gvif(dataframe): “”" Calculate Generalized Variance Inflation Factors (GVIF) for a given DataFrame. Parameters: dataframe (pd.DataFrame): A Pandas DataFrame containing the independent variables. Returns: gvif_df (pd.DataFrame): A DataFrame with features and their corresponding GVIF values. """ # Add interaction terms to capture higher-order relationships poly = PolynomialFeatures(degree=2, include_bias=False) expanded_data = poly.fit_transform(dataframe) # Create an empty list to store GVIF results gvifs = [] feature_names = [] # Loop through each column of the original data frame for i in range(expanded_data.shape[1]): vif_value = variance_inflation_factor(expanded_data, i) if i < dataframe.shape[1]: feature_name = dataframe.columns[i % dataframe.shape[1]] else: feature_name = f"Interaction_{i}" gvifs.append(vif_value ** (1 / (dataframe.shape[1])) if 'categorical' not in str(type(feature_name)) else vif_value) feature_names.append(feature_name) # Construct the result DataFrame gvif_df = pd.DataFrame({ "Feature": feature_names, "GVIF": gvifs }) return gvif_df.sort_values(by="GVIF", ascending=False).reset_index(drop=True) Example usage X = pd.DataFrame({ “feature1”: [1, 2, 3, 4], “feature2”: [5, 6, 7, 8], “category_feature”: [“A”, “B”, “A”, “B”] }) gvif_results = calculate_gvif(pd.get_dummies(X)) print(gvif_results) 分析这段代码
时间: 2025-04-01 11:11:05 浏览: 39
这段代码的主要功能是计算给定数据框中各个特征的广义方差膨胀因子(Generalized Variance Inflation Factor, 简称 GVIF)。GVIF 常用于衡量多元线性回归模型中多重共线性的程度,特别是当存在分类变量或多阶交互项时。
以下是逐步分析:
---
### **1. 模块导入**
```python
import pandas as pd
import numpy as np
from statsmodels.stats.outliers_influence import variance_inflation_factor
from sklearn.preprocessing import PolynomialFeatures
```
- `pandas` 和 `numpy`: 用于处理表格型数据和数值运算。
- `variance_inflation_factor` 函数来自 `statsmodels` 库,它直接实现了 VIF 的计算公式。
- `PolynomialFeatures` 来自 `sklearn.preprocessing`,可以生成多项式特征以及高阶交互项。
---
### **2. 定义函数 `calculate_gvif`**
#### **函数目标**:
该函数接收一个包含独立变量的数据框 (`dataframe`) 并返回每个特征对应的 GVIF 值。
---
#### **步骤解析**:
##### **(1) 添加交互项并扩展原始数据集**
```python
poly = PolynomialFeatures(degree=2, include_bias=False)
expanded_data = poly.fit_transform(dataframe)
```
这里通过 `PolynomialFeatures` 将输入数据进行了二次多项式的转换,并包含了所有二阶交互项。例如,如果原数据中有两个列 `[x1, x2]`,那么经过此步操作后的结果将包括 `[x1, x2, x1^2, x2^2, x1*x2]`。
> 注意:这里的 `include_bias=False` 表示不会添加常数偏置项(即截距),因为这通常不是我们关注的部分。
---
##### **(2) 初始化存储结构**
创建了两个空列表分别存放每一维的 GVIF 结果及其对应特征名称:
```python
gvifs = []
feature_names = []
```
---
##### **(3) 遍历扩展矩阵的所有维度**
对于每列进行循环计算其 VIF 或 GVIF 值:
```python
for i in range(expanded_data.shape[1]):
vif_value = variance_inflation_factor(expanded_data, i)
# 根据索引区分是否属于原数据还是新加入的交互项
if i < dataframe.shape[1]:
feature_name = dataframe.columns[i % dataframe.shape[1]]
else:
feature_name = f"Interaction_{i}"
# 计算调整后的 GVIF 只针对非类别变量做根指数化变换;若为类别变量则保持不变
adjusted_vif = vif_value**(1/(dataframe.shape[1])) \
if 'categorical' not in str(type(feature_name)) else vif_value
gvifs.append(adjusted_vif)
feature_names.append(feature_name)
```
- 如果当前列下标小于等于原始数据形状的第一维度,则认为这是原来的单一属性;
- 否则标记为此处产生的交互作用项目。
此外,在更新 GVIFS 列表之前会对连续值特性应用 `(VIF)**(1/k)` 公式来标准化 GVIF 输出形式以便于比较大小关系,其中 k 代表参与建模总参数数目减一再除以样本量的结果近似表示法度量系数间相关强度的一种简化表达方式而已!
最后把相应标签也加进去方便后续整理成易读版 DF 对象展示出来便于用户理解查看即可完成整个流程啦~
---
##### **(4) 构造最终结果 DataFrame**
```python
gvif_df = pd.DataFrame({
"Feature": feature_names,
"GVIF": gvifs
})
return gvif_df.sort_values(by="GVIF", ascending=False).reset_index(drop=True)
```
构造了一个新的DataFrame对象保存上述信息,并按降序排列各特征的重要性和关联情况供进一步决策参考之用哦~
---
### **3. 示例运行说明**
提供的例子展示了如何调用这个方法:
首先构建了一个简单的小规模数据集 X 包含两组数字型特性和一组类别型变量,
然后利用 Pandas 提供的功能将其转码(one-hot encoding),之后传入刚才定义好的主程序入口点 calculate_gvif() 内部按照前述逻辑一步步执行直至得出结论为止!
```python
X = pd.DataFrame({
"feature1": [1, 2, 3, 4],
"feature2": [5, 6, 7, 8],
"category_feature": ["A", "B", "A", "B"]
})
gvif_results = calculate_gvif(pd.get_dummies(X))
print(gvif_results)
```
输出将会列出所有的原始字段及派生出的新组合之间相互影响的程度排名次序清晰明了地呈现在眼前帮助识别潜在风险因素所在位置区域范围之内做出针对性改进措施计划方案等等一系列动作皆有可能由此开启哟😊
---
阅读全文
相关推荐



















