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
相关产品推荐
相关产品推荐

