机器学习模型性能提升教程(特征工程和模型优化)
特征工程和模型优化是提升机器学习模型性能的核心步骤,以下从特征工程和模型优化两个维度,结合具体案例展开说明:
一、特征工程
特征工程的核心目标是从原始数据中提取更有价值的信息,常见方法包括特征选择、特征构造和特征转换。
1. 特征选择
目标:减少冗余特征,降低模型复杂度,提升训练效率。
-
方法1:基于统计指标
-
案例:房价预测中,计算特征与目标变量(房价)的相关性系数,选择相关性高的特征。
-
代码示例:
import pandas as pd from sklearn.feature_selection import SelectKBest, f_regression # 假设df为数据集,'PRICE'为目标变量 X = df.drop('PRICE', axis=1) y = df['PRICE'] # 选择与目标变量相关性最高的5个特征 selector = SelectKBest(score_func=f_regression, k=5) X_new = selector.fit_transform(X, y) selected_features = X.columns[selector.get_support()] print("Selected Features:", selected_features)
-
-
方法2:基于树模型的重要性评分
-
案例:使用随机森林或XGBoost模型,根据特征重要性得分筛选特征。
-
代码示例:
from xgboost import XGBRegressor import matplotlib.pyplot as plt model = XGBRegressor() model.fit(X, y) # 绘制特征重要性 importance = model.feature_importances_ plt.barh(X.columns, importance) plt.xlabel('Importance') plt.title('Feature Importance') plt.show()
-
2. 特征构造
目标:通过组合或变换原始特征,生成新的特征,提升模型表达能力。
-
案例1:时间特征提取
-
场景:预测用户购买行为时,从时间戳中提取“星期几”、“是否节假日”等特征。
-
代码示例:
import pandas as pd df['timestamp'] = pd.to_datetime(df['timestamp']) df['day_of_week'] = df['timestamp'].dt.dayofweek df['is_holiday'] = df['timestamp'].dt.date.isin(holidays_list).astype(int)
-
-
案例2:交互特征
-
场景:预测房价时,构造“房间数×面积”作为新特征。
-
代码示例:
python复制代码 df['room_area'] = df['RM'] * df['LSTAT'] # 示例字段
-
3. 特征转换
目标:将非线性关系转换为线性关系,或标准化特征分布。
-
案例1:对数变换
-
场景:目标变量(如房价)呈右偏分布时,对目标变量取对数。
-
代码示例:
import numpy as np df['log_price'] = np.log1p(df['PRICE'])
-
-
案例2:独热编码(One-Hot Encoding)
-
场景:分类特征(如“房屋类型”)转换为数值特征。
-
代码示例:
python复制代码 df = pd.get_dummies(df, columns=['HOUSE_TYPE'], drop_first=True)
-
二、模型优化
模型优化的核心目标是提升模型预测精度和泛化能力,常见方法包括超参数调优、模型融合和正则化。
1. 超参数调优
目标:通过调整模型参数,找到最优配置。
-
方法1:网格搜索(Grid Search)
-
案例:调整随机森林的树数量和最大深度。
-
代码示例:
from sklearn.model_selection import GridSearchCV from sklearn.ensemble import RandomForestRegressor param_grid = { 'n_estimators': [100, 200, 300], 'max_depth': [None, 10, 20] } grid_search = GridSearchCV(RandomForestRegressor(), param_grid, cv=5) grid_search.fit(X, y) print("Best Parameters:", grid_search.best_params_)
-
-
方法2:贝叶斯优化
- 工具:使用
Optuna或Hyperopt进行更高效的超参数搜索。
- 工具:使用
2. 模型融合
目标:结合多个模型的预测结果,提升稳定性。
-
案例1:Bagging(集成学习)
-
场景:使用随机森林或梯度提升树(如XGBoost)。
-
代码示例:
from sklearn.ensemble import RandomForestRegressor model = RandomForestRegressor(n_estimators=100, random_state=42) model.fit(X, y)
-
-
案例2:Stacking(堆叠)
-
场景:结合多个模型(如线性回归、随机森林、XGBoost)的预测结果。
-
代码示例:
from mlxtend.regressor import StackingCVRegressor from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor from xgboost import XGBRegressor model1 = LinearRegression() model2 = RandomForestRegressor() model3 = XGBRegressor() sreg = StackingCVRegressor(regressors=(model1, model2, model3), meta_regressor=LinearRegression(), cv=5) sreg.fit(X, y)
-
3. 正则化
目标:防止模型过拟合,提升泛化能力。
-
案例1:L1/L2正则化
-
场景:在线性回归中添加正则化项。
-
代码示例:
from sklearn.linear_model import Ridge, Lasso ridge_model = Ridge(alpha=1.0) lasso_model = Lasso(alpha=0.1)
-
-
案例2:XGBoost正则化
-
场景:调整
lambda和alpha参数控制L2和L1正则化。 -
代码示例:
python复制代码 xgb_model = XGBRegressor(reg_lambda=1.0, reg_alpha=0.1)
-
三、综合案例:房价预测
步骤1:特征工程
- 提取时间特征(如“建造年份”)。
- 构造交互特征(如“房间数×面积”)。
- 对目标变量取对数。
步骤2:模型优化
- 使用网格搜索调整XGBoost的超参数。
- 结合随机森林和XGBoost进行模型融合。
代码示例:
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
# 数据分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 模型训练与融合
xgb_model = XGBRegressor(n_estimators=200, max_depth=10, learning_rate=0.1)
rf_model = RandomForestRegressor(n_estimators=100, max_depth=20)
xgb_model.fit(X_train, y_train)
rf_model.fit(X_train, y_train)
# 预测与评估
y_pred_xgb = xgb_model.predict(X_test)
y_pred_rf = rf_model.predict(X_test)
y_pred_final = (y_pred_xgb + y_pred_rf) / 2
print("MSE:", mean_squared_error(y_test, y_pred_final))
以下是特征工程和模型优化的进一步扩展内容,结合更多高级技巧和实际应用场景,帮助更全面地提升模型性能:
四、特征工程进阶
1. 特征缩放(Scaling)
目标:将特征值缩放到特定范围,避免因量纲差异导致模型训练不稳定。
-
方法1:标准化(Standardization)
-
场景:适用于梯度下降优化的模型(如线性回归、神经网络)。
-
代码示例:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X)
-
-
方法2:归一化(Normalization)
-
场景:适用于距离度量敏感的模型(如KNN、SVM)。
-
代码示例:
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() X_normalized = scaler.fit_transform(X)
-
2. 特征降维
目标:减少特征维度,降低计算复杂度,同时避免维度灾难。
-
方法1:主成分分析(PCA)
-
场景:保留数据的主要变化方向,适用于高维数据。
-
代码示例:
from sklearn.decomposition import PCA pca = PCA(n_components=10) # 保留10个主成分 X_pca = pca.fit_transform(X)
-
-
方法2:线性判别分析(LDA)
- 场景:监督降维,适用于分类任务。
3. 特征重要性分析
目标:深入理解特征对模型预测的贡献。
-
方法1:SHAP值
-
场景:解释模型预测结果,评估特征的全局和局部重要性。
-
代码示例:
import shap import xgboost as xgb model = xgb.XGBClassifier() model.fit(X_train, y_train) explainer = shap.Explainer(model) shap_values = explainer(X_test) shap.summary_plot(shap_values, X_test)
-
-
方法2:Permutation Importance
- 场景:通过随机打乱特征值,评估特征对模型性能的影响。
五、模型优化进阶
1. 自动化超参数调优
目标:通过自动化工具高效搜索最优参数。
-
工具1:Optuna
-
场景:支持贝叶斯优化,适用于复杂模型。
-
代码示例:
import optuna from xgboost import XGBClassifier def objective(trial): param = { 'max_depth': trial.suggest_int('max_depth', 3, 10), 'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3), 'n_estimators': 100 } model = XGBClassifier(**param) model.fit(X_train, y_train) return -model.score(X_test, y_test) # Optuna最小化目标函数 study = optuna.create_study(direction='minimize') study.optimize(objective, n_trials=50) print("Best Parameters:", study.best_params)
-
-
工具2:HyperOpt
- 场景:支持随机搜索和TPE算法。
2. 模型集成(Ensemble Learning)
目标:结合多个模型的预测结果,提升稳定性和准确性。
-
方法1:Boosting
-
场景:通过逐步修正前一个模型的错误,提升性能。
-
代码示例:
from sklearn.ensemble import GradientBoostingClassifier model = GradientBoostingClassifier(n_estimators=100, learning_rate=0.1) model.fit(X_train, y_train)
-
-
方法2:Stacking(堆叠)
- 场景:结合不同类型模型(如树模型和线性模型)的预测结果。
- 代码示例(参考前文StackingCVRegressor)。
3. 模型正则化与剪枝
目标:防止模型过拟合,提升泛化能力。
-
方法1:决策树剪枝
-
场景:通过限制树的深度或最小样本数,减少过拟合。
-
代码示例:
from sklearn.tree import DecisionTreeClassifier model = DecisionTreeClassifier(max_depth=5, min_samples_split=10) model.fit(X_train, y_train)
-
-
方法2:神经网络Dropout
- 场景:在训练过程中随机丢弃神经元,防止过拟合。
六、综合案例:用户流失预测
背景:某电信公司希望预测用户是否会流失,以制定挽留策略。
步骤1:特征工程
- 时间特征:提取用户最近一次登录时间间隔、活跃天数等。
- 行为特征:计算用户通话时长、短信发送频率等。
- 交互特征:构造“通话时长×短信频率”作为新特征。
- 降维:使用PCA将高维行为特征降维至10个主成分。
步骤2:模型优化
- 超参数调优:使用Optuna调整XGBoost的
max_depth和learning_rate。 - 模型融合:结合XGBoost和逻辑回归的预测结果。
- 正则化:在逻辑回归中添加L2正则化。
代码示例:
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.decomposition import PCA
from xgboost import XGBClassifier
from sklearn.ensemble import StackingClassifier
# 特征工程与模型流水线
pca = PCA(n_components=10)
xgb = XGBClassifier(use_label_encoder=False, eval_metric='logloss')
lr = LogisticRegression(C=1.0, penalty='l2')
# 模型融合
stacking_model = StackingClassifier(estimators=[('xgb', xgb), ('pca_lr', Pipeline([('pca', pca), ('lr', lr)]))], final_estimator=lr)
stacking_model.fit(X_train, y_train)
# 评估
accuracy = stacking_model.score(X_test, y_test)
print("Accuracy:", accuracy)
七、注意事项
- 数据质量:特征工程的前提是高质量的数据,需处理缺失值、异常值和重复值。
- 特征相关性:避免高度相关的特征,可能导致模型不稳定。
- 过拟合与欠拟合:通过交叉验证和学习曲线调整模型复杂度。
- 业务理解:特征工程需结合业务场景,避免盲目堆砌特征。
通过以上方法,结合实际业务需求,可以显著提升模型性能。特征工程和模型优化是迭代过程,需不断尝试和调整,找到最适合当前问题的解决方案。

浙公网安备 33010602011771号