如何在Scikit-Learn中为分类变量选择参考水平?
在Python中为GLM指定分类变量参考水平的实现方法
当然可以实现,不管是Scikit-Learn还是更偏向统计建模的Statsmodels库,都能自定义分类变量的参考水平,替代SAS中hpgenselect的CLASS语句功能。
一、使用Statsmodels(最贴近SAS语法)
Statsmodels的公式接口支持直接指定分类变量的参考类别,和SAS的CLASS逻辑高度一致:
- 导入所需模块:
import statsmodels.api as sm import statsmodels.formula.api as smf import pandas as pd
- 构造示例数据:
data = pd.DataFrame({ 'y': [1, 2, 3, 4, 5], 'cat_var': ['A', 'B', 'C', 'A', 'B'], 'num_var': [10, 20, 30, 40, 50] })
- 在公式中指定参考水平:
使用C()函数的Treatment对比方式,传入想要作为基准的类别(比如指定'A'为cat_var的参考水平):
model = smf.glm(formula='y ~ C(cat_var, Treatment(reference="A")) + num_var', data=data, family=sm.families.Gaussian()) result = model.fit() print(result.summary())
输出结果里,cat_var的B和C类别都会以A为基准做对比,对应系数就是相对于参考类别的差异。
二、使用Scikit-Learn
Scikit-Learn的OneHotEncoder支持自定义丢弃指定类别作为参考,配合ColumnTransformer可以对不同分类变量设置不同参考水平:
- 导入模块:
from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder from sklearn.linear_model import LinearRegression from sklearn.pipeline import Pipeline import pandas as pd
- 定义每个分类变量的参考类别:
# 假设我们要指定cat_var的参考类别为'A',另一个分类变量other_cat的参考类别为'X' drop_dict = {'cat_var': 'A', 'other_cat': 'X'}
- 构建预处理管道:
preprocessor = ColumnTransformer( transformers=[ ('cat', OneHotEncoder(drop=drop_dict, sparse_output=False), ['cat_var', 'other_cat']), ('num', 'passthrough', ['num_var']) ]) # 构建GLM模型(这里用线性回归作为示例,对应高斯族GLM) pipeline = Pipeline(steps=[ ('preprocessor', preprocessor), ('model', LinearRegression()) ]) # 拟合模型 pipeline.fit(data, data['y'])
这样处理后,每个指定的参考类别会被编码为0(即不生成对应的哑变量),其他类别则生成对比哑变量,和SAS的逻辑一致。
内容的提问来源于stack exchange,提问作者Felippe Trigueiro
相关产品推荐
相关产品推荐

