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

Scikit Learn中能否为不同特征使用不同模型?附示例代码

当然可以!在Scikit-Learn里,你完全可以针对不同特征组搭配不同的回归模型——这种玩法叫做异质模型组合,刚好适配你说的场景:用线性回归处理中位数收入(毕竟收入和房价大概率是线性相关的),用KNN处理经纬度(空间特征用邻近样本的信息预测更合理)。

下面我给你整理了完整的可运行代码,还修正了你原代码里的语法小问题(比如列表推导式的括号、reshape的位置错误):

实现思路

核心是用ColumnTransformer把不同特征路由到对应的子模型,再通过Pipeline把整个流程串起来——如果需要,还可以加一个「元模型」来自动融合两个子模型的预测结果,比手动加权更灵活。

完整代码示例
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# ---------------------- 模拟数据(替换成你的真实数据即可) ----------------------
# 假设X_housing每行是 [中位数收入, 纬度, 经度],y_housing是房价标签
X_housing = np.random.rand(1000, 3)
y_housing = 2 * X_housing[:, 0] + 0.5 * X_housing[:, 1] - 0.3 * X_housing[:, 2] + np.random.randn(1000) * 0.1

# 拆分训练/测试集
X_train, X_test, y_train, y_test = train_test_split(X_housing, y_housing, test_size=0.2, random_state=42)

# ---------------------- 定义特征组与子模型 ----------------------
# 划分特征组:第0列是收入,第1、2列是经纬度
feature_groups = {
    'income_feature': [0],
    'geo_features': [1, 2]
}

# 收入特征的处理管道:直接用线性回归
income_pipeline = Pipeline([
    ('linear_reg', LinearRegression())
])

# 经纬度特征的处理管道:用KNN回归
geo_pipeline = Pipeline([
    ('knn_reg', KNeighborsRegressor(n_neighbors=5))
])

# ---------------------- 用ColumnTransformer分配特征到对应模型 ----------------------
# 这个步骤会把指定特征分别送到各自的子模型,输出每个子模型的预测结果
feature_model_transformer = ColumnTransformer([
    ('income_model', income_pipeline, feature_groups['income_feature']),
    ('geo_model', geo_pipeline, feature_groups['geo_features'])
], remainder='drop')  # 这里没有其他特征,所以drop掉未指定的部分

# ---------------------- 构建完整管道(可选:加元模型融合结果) ----------------------
# 用一个线性回归作为元模型,自动学习两个子模型预测结果的权重
full_pipeline = Pipeline([
    ('sub_models', feature_model_transformer),
    ('meta_regressor', LinearRegression())
])

# ---------------------- 训练与评估 ----------------------
full_pipeline.fit(X_train, y_train)
y_pred = full_pipeline.predict(X_test)

print(f"测试集均方误差: {mean_squared_error(y_test, y_pred):.4f}")
额外小技巧

如果你不想用元模型,也可以手动获取子模型的预测结果,自己组合:

# 获取子模型的预测输出
train_sub_predictions = feature_model_transformer.transform(X_train)
# train_sub_predictions的第一列是线性回归的结果,第二列是KNN的结果
# 比如手动加权:0.7*收入预测 + 0.3*地理预测
manual_pred = 0.7 * train_sub_predictions[:, 0] + 0.3 * train_sub_predictions[:, 1]

这样就能完美实现你想要的「不同特征用不同模型」的需求啦!

内容的提问来源于stack exchange,提问作者pgmcr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:52:41