You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Scikit-Learn中为分类变量选择参考水平?

在Python中为GLM指定分类变量参考水平的实现方法

当然可以实现,不管是Scikit-Learn还是更偏向统计建模的Statsmodels库,都能自定义分类变量的参考水平,替代SAS中hpgenselect的CLASS语句功能。

一、使用Statsmodels(最贴近SAS语法)

Statsmodels的公式接口支持直接指定分类变量的参考类别,和SAS的CLASS逻辑高度一致:

  1. 导入所需模块:
import statsmodels.api as sm
import statsmodels.formula.api as smf
import pandas as pd
  1. 构造示例数据:
data = pd.DataFrame({
    'y': [1, 2, 3, 4, 5],
    'cat_var': ['A', 'B', 'C', 'A', 'B'],
    'num_var': [10, 20, 30, 40, 50]
})
  1. 在公式中指定参考水平:
    使用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可以对不同分类变量设置不同参考水平:

  1. 导入模块:
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
  1. 定义每个分类变量的参考类别:
# 假设我们要指定cat_var的参考类别为'A',另一个分类变量other_cat的参考类别为'X'
drop_dict = {'cat_var': 'A', 'other_cat': 'X'}
  1. 构建预处理管道:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:12:33