机器学习输入数据集标准化最佳实践咨询(Python+多模型预测)
数据集标准化与数据准备最佳实践(针对线性回归、随机森林、XGBoost)
针对你提供的数据集,下面分步骤梳理数据准备的核心环节,以及不同模型对应的标准化策略:
一、基础数据类型修正
首先要把数据转换成模型能识别的格式:
- qty列:去掉千位分隔符,转为整数类型:
df['qty'] = df['qty'].str.replace(',', '').astype(int) - date列:转为datetime类型,再提取实用时间特征(时间特征对预测需求通常有很大帮助):
df['date'] = pd.to_datetime(df['date'], format='%m/%d/%y') df['year'] = df['date'].dt.year df['month'] = df['date'].dt.month df['quarter'] = df['date'].dt.quarter df['is_weekend'] = df['weekday'].isin(['sat', 'sun']).astype(int) - 数值列检查:确认
max_temp、min_temp是浮点/整数类型,若有异常值(比如不合理的温度值),用箱线图检测后删除或截断。
二、类别特征处理
针对weekday和type两个类别特征,不同模型的处理方式略有区别:
- weekday:属于有序类别(周一到周日有顺序),用标签编码直接转成数值即可:
from sklearn.preprocessing import LabelEncoder le_weekday = LabelEncoder() df['weekday_encoded'] = le_weekday.fit_transform(df['weekday']) - type:属于无序二分类特征,两种处理方式都可行:
- 映射为0/1:
df['type_encoded'] = df['type'].map({'casual': 0, 'member': 1}) - 独热编码(更适合线性回归):
pd.get_dummies(df['type'], prefix='type')
- 映射为0/1:
三、特征工程(可选但推荐)
新增衍生特征能提升模型性能:
- 计算温差:
df['temp_diff'] = df['max_temp'] - df['min_temp'],温度波动可能和qty相关 - 若有更多业务背景,还可以添加季节特征(比如12-2月为冬季等)
四、缺失值处理
先检查各列缺失情况:df.isnull().sum()
- 数值型特征(max_temp、min_temp):用中位数填充(避免均值受异常值影响)
- 类别特征(weekday、type):用众数填充
- date/holiday:若缺失可通过日历工具补全
五、标准化策略(核心差异点)
不同模型对特征尺度的敏感度完全不同,别做无用功:
1. 线性回归:必须标准化
线性回归基于最小二乘法或梯度下降,特征尺度不一致会直接影响系数权重,导致模型偏差。
- 仅对连续数值特征做标准化:
max_temp、min_temp、temp_diff - 标准化时机:先划分训练集/测试集,再用训练集拟合Scaler,避免数据泄露:
from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split X = df[['holiday', 'weekday_encoded', 'type_encoded', 'max_temp', 'min_temp', 'temp_diff', 'year', 'month']] y = df['qty'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) scaler = StandardScaler() numeric_cols = ['max_temp', 'min_temp', 'temp_diff'] X_train[numeric_cols] = scaler.fit_transform(X_train[numeric_cols]) X_test[numeric_cols] = scaler.transform(X_test[numeric_cols])
2. 随机森林/XGBoost:无需标准化
树模型是基于特征分裂规则进行训练,完全不依赖特征的尺度大小,标准化不会提升模型性能,反而增加计算成本。直接使用处理后的原始特征即可。
六、目标变量优化(针对线性回归)
如果qty的分布存在严重偏态(比如大部分值集中在低区间,少数极高值),可以对目标变量做对数变换:
import numpy as np y_train_log = np.log(y_train) y_test_log = np.log(y_test)
训练后再用指数转换还原预测值:np.exp(predicted_log_values)
内容的提问来源于stack exchange,提问作者Curiel
相关产品推荐
相关产品推荐

