Pandas线性回归:仅对非分类特征使用StandardScaler标准化
仅对指定非分类特征标准化的实现方法
针对你的需求,这里提供两种可靠的实现方式,分别适配不同场景:
方法一:使用ColumnTransformer(推荐,适合规范流程)
这是Scikit-learn官方推荐的多列差异化处理方案,能清晰区分需要标准化的列和保持原样的列,尤其适合后续扩展更多特征处理逻辑的场景。
操作步骤:
- 保留DataFrame结构:拆分特征与目标时,不要将数据转为numpy数组,保留DataFrame格式以便通过列名精准指定处理对象。
- 定义列转换器:明确仅对
bmi列应用标准化,其余列直接原样保留。 - 拟合转换数据:用训练集拟合标准化器,再分别转换训练集和测试集(测试集仅做转换,不重新拟合)。
代码示例:
# 修正特征与目标的拆分(保留DataFrame格式) y = dataset['value'] X = dataset.drop('value', axis=1) # 拆分训练集与测试集 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=0) # 导入所需工具 from sklearn.compose import ColumnTransformer from sklearn.preprocessing import StandardScaler # 指定需要标准化的列 numeric_cols = ['bmi'] # 构建列转换器:对目标列做标准化,其余列直接传递 preprocessor = ColumnTransformer( transformers=[ ('scaler', StandardScaler(), numeric_cols) ], remainder='passthrough' # 未指定的列不做处理,原样保留 ) # 拟合训练集并转换 X_train_scaled = preprocessor.fit_transform(X_train) # 转换测试集 X_test_scaled = preprocessor.transform(X_test)
方法二:手动处理(适合简单场景,易于理解)
如果已经将特征转为numpy数组,可通过索引定位目标列,单独完成标准化后替换回原数组。
操作步骤:
- 定位目标列索引:根据你的数据列顺序,
bmi位于第3列(索引为2,从0开始计数)。 - 单独提取并拟合标准化器:仅用训练集的
bmi数据拟合scaler,避免影响其他列。 - 转换并替换:将训练集和测试集的
bmi列转换后,替换回原数组对应位置。
代码示例:
# 假设已完成训练集与测试集拆分(X_train、X_test为numpy数组) from sklearn.preprocessing import StandardScaler # 定位bmi列的索引(根据你的数据结构,此处为2) bmi_index = 2 # 提取训练集的bmi列,转为二维数组适配scaler要求 X_train_bmi = X_train[:, bmi_index].reshape(-1, 1) # 拟合标准化器 scaler = StandardScaler() scaler.fit(X_train_bmi) # 转换训练集和测试集的bmi列 X_train_bmi_scaled = scaler.transform(X_train_bmi) X_test_bmi_scaled = scaler.transform(X_test[:, bmi_index].reshape(-1, 1)) # 替换回原数组 X_train_scaled = X_train.copy() X_train_scaled[:, bmi_index] = X_train_bmi_scaled.flatten() X_test_scaled = X_test.copy() X_test_scaled[:, bmi_index] = X_test_bmi_scaled.flatten()
内容的提问来源于stack exchange,提问作者wiwa1978
相关产品推荐
相关产品推荐

