import pandas as pd import numpy as np from sklearn.preprocessing import OrdinalEncoder, StandardScaler from sklearn.impute import SimpleImputer from sklearn.model_selection import train_test_split from factor_analyzer import FactorAnalyzer from factor_analyzer.factor_analyzer import calculate_kmo from xgboost import XGBClassifier import lightgbm as lgb from sklearn.metrics import classification_report # ====================== # 1. 数据读取与清洗 # ====================== def load_and_clean(data_path): # 读取数据 df = pd.read_csv(data_path) # 缺失值处理 num_imputer = SimpleImputer(strategy='median') cat_imputer = SimpleImputer(strategy='most_frequent') # 数值型字段 numeric_cols = ['付费金额', '活跃时长', '广告收入', '留存'] df[numeric_cols] = num_imputer.fit_transform(df[numeric_cols]) # 分类型字段 categorical_cols = ['设备价值档位', '用户初始广告档位'] df[categorical_cols] = cat_imputer.fit_transform(df[categorical_cols]) # 异常值处理 df['活跃时长'] = np.where(df['活跃时长'] > 24, 24, df['活跃时长']) df['付费金额'] = np.where( df['付费金额'] > df['付费金额'].quantile(0.99), df['付费金额'].quantile(0.95), df['付费金额'] ) return df # ====================== # 2. 特征工程 # ====================== def feature_engineering(df): # 构造复合特征 df['ARPU密度'] = df['付费金额'] / (df['活跃天数'] + 1) df['广告展示率'] = df['广告曝光次数'] / df['短剧观看次数'] df['内容互动指数'] = np.log1p(df['收藏数']*1 + df['分享数']*2 + df['评论数']*3) # 分类变量编码 encoder = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1) cat_cols = ['设备价值档位', '用户初始广告档位'] df[cat_cols] = encoder.fit_transform(df[cat_cols]) return df # ====================== # 3. 特征筛选与降维 # ====================== def feature_selection(df, target_col='付费意愿档位'): # 划分特征和目标 X = df.drop(columns=[target_col]) y = df[target_col] # 计算IV值筛选 from sklearn.feature_selection import mutual_info_classif iv_values = mutual_info_classif(X, y) iv_df = pd.DataFrame({'feature': X.columns, 'iv': iv_values}) selected_features = iv_df[iv_df['iv'] > 0.02]['feature'].tolist() X_selected = X[selected_features] # 因子分析降维 kmo_all, kmo_model = calculate_kmo(X_selected) if kmo_model > 0.6: fa = FactorAnalyzer(n_factors=5, rotation='varimax') fa.fit(X_selected) factor_scores = fa.transform(X_selected) factor_cols = [f'Factor_{i}' for i in range(1,6)] X_factors = pd.DataFrame(factor_scores, columns=factor_cols) else: X_factors = X_selected.copy() return X_factors, y # ====================== # 4. XGBoost特征筛选 # ====================== def xgb_feature_importance(X, y): # 训练XGBoost模型 model = XGBClassifier( objective='multi:softmax', eval_metric='mlogloss', use_label_encoder=False ) model.fit(X, y) # 获取特征重要性 importance = pd.DataFrame({ 'feature': X.columns, 'importance': model.feature_importances_ }).sort_values('importance', ascending=False) top10_features = importance.head(10)['feature'].tolist() return X[top10_features] # ====================== # 5. LightGBM建模预测 # ====================== def lgb_modeling(X, y): # 数据划分 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, stratify=y, random_state=42 ) # 模型训练 model = lgb.LGBMClassifier( num_leaves=31, max_depth=5, learning_rate=0.1, n_estimators=300, class_weight='balanced' ) model.fit(X_train, y_train) # 模型评估 y_pred = model.predict(X_test) print(classification_report(y_test, y_pred)) return model # ====================== # 主流程执行 # ====================== if __name__ == "__main__": # 数据路径 DATA_PATH = "user_data.csv" # 执行流程 df = load_and_clean(DATA_PATH) df = feature_engineering(df) X, y = feature_selection(df) X_top10 = xgb_feature_importance(X, y) final_model = lgb_modeling(X_top10, y) # 模型保存 final_model.booster_.save_model('user_value_model.txt')
时间: 2025-06-05 17:17:14 浏览: 46
<think>嗯,用户想优化他们的机器学习代码,里面用到了Pandas、NumPy、Scikit-learn、XGBoost和LightGBM。首先,我需要回忆一下这些库的常见优化方法。比如,Pandas的内存优化,可能涉及到数据类型转换,比如把category类型用上,或者用更节省内存的数据类型。然后,数据预处理部分,像缺失值处理,是否有更高效的方法?比如用SimpleImputer或者直接fillna。
接着是特征工程,用户有没有提到特征数量太多?可能需要降维,比如PCA或者特征选择方法,比如SelectKBest。还有,分类特征的处理,比如OneHotEncoder可能会增加维度,也许用OrdinalEncoder或者TargetEncoding更高效?
然后是模型训练部分,Scikit-learn的Pipeline可以整合预处理和模型,减少代码量,同时避免数据泄露。交叉验证的设置是否正确?比如用StratifiedKFold来处理类别不平衡。超参数优化方面,用户可能用的是GridSearchCV,但如果是参数空间大,可以考虑RandomizedSearchCV或者贝叶斯优化,这样更快。
XGBoost和LightGBM的参数设置有没有优化空间?比如调整n_estimators和learning_rate,或者使用早停法来防止过拟合。并行计算方面,XGBoost的n_jobs参数设置是否正确?LightGBM的categorical_feature参数有没有正确指定,避免重复编码?
代码结构方面,是否有重复的部分可以封装成函数?比如数据预处理和模型训练的部分。内存管理,比如删除不再使用的变量,或者使用gc.collect()来释放内存。还有,是否使用了最新的库版本,因为新版本可能有性能改进。
另外,评估指标是否合适?比如分类问题用AUC,回归问题用RMSE。模型解释性方面,可以用SHAP或LIME来增强可解释性。最后,代码的可读性和维护性,比如添加注释,使用有意义的变量名,模块化代码结构。
可能需要检查用户是否有提到具体的问题,比如运行速度慢,内存不足,或者准确率不高。根据不同的痛点,优化方向会不同。例如,如果内存不够,重点在数据类型的优化和降维;如果速度慢,可能需要并行处理或更高效的算法。另外,确保引用的库函数是最佳实践,比如使用fit_transform而不是分开fit和transform,避免冗余计算。
还要考虑数据量的大小,如果数据非常大,可能需要分块处理或者使用Dask来替代Pandas。对于模型部分,是否可以使用增量学习,或者更轻量级的模型。最后,验证优化效果,通过时间统计和内存使用情况对比,确保优化确实有效。</think>我将根据代码优化原则和机器学习最佳实践,分步骤分析可能存在的优化点并提供改进建议:
### 一、内存与数据处理优化
1. **数据类型优化**
使用`category`类型处理低基数特征可减少内存占用:
```python
cat_cols = ['gender', 'education_level']
df[cat_cols] = df[cat_cols].astype('category')
```
2. **高效缺失值处理**
推荐使用Scikit-learn的$SimpleImputer$进行统一处理:
```python
from sklearn.impute import SimpleImputer
num_imputer = SimpleImputer(strategy='median')
X[num_cols] = num_imputer.fit_transform(X[num_cols])
```
### 二、特征工程优化
3. **分类特征编码优化**
使用$OrdinalEncoder$替代独热编码减少维度爆炸:
```python
from sklearn.preprocessing import OrdinalEncoder
encoder = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1)
X[cat_cols] = encoder.fit_transform(X[cat_cols])
```
4. **特征选择**
使用方差阈值或互信息法筛选有效特征:
```python
from sklearn.feature_selection import SelectKBest, mutual_info_classif
selector = SelectKBest(mutual_info_classif, k=20)
X_selected = selector.fit_transform(X, y)
```
### 三、模型训练优化
5. **构建处理管道**
使用$Pipeline$整合预处理流程:
```python
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
preprocessor = ColumnTransformer([
('num', num_imputer, num_cols),
('cat', encoder, cat_cols)
])
pipeline = Pipeline([
('preprocessor', preprocessor),
('classifier', XGBClassifier())
])
```
6. **交叉验证优化**
推荐使用分层交叉验证:
```python
from sklearn.model_selection import StratifiedKFold
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
```
### 四、模型参数优化
7. **XGBoost/LightGBM参数调整**
设置早停法防止过拟合:
```python
xgb_params = {
'n_estimators': 2000,
'learning_rate': 0.05,
'early_stopping_rounds': 50,
'eval_metric': 'auc'
}
```
8. **并行计算设置**
充分利用多核CPU:
```python
lgbm_params = {
'num_threads': 8,
'device': 'gpu' # 如果支持GPU加速
}
```
### 五、代码结构优化
9. **内存管理**
及时释放无用变量:
```python
del train_df
import gc
gc.collect()
```
10. **版本检查**
确保使用优化后的库版本:
```python
import xgboost
print(xgboost.__version__) # 推荐 >=1.6.0
```
### 六、评估与监控
11. **添加评估指标**
推荐使用更全面的评估方法:
```python
from sklearn.metrics import RocCurveDisplay, classification_report
RocCurveDisplay.from_estimator(model, X_test, y_test)
print(classification_report(y_test, y_pred))
```
12. **特征重要性分析**
增强模型可解释性:
```python
import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)
```
### 优化效果验证建议
1. 使用$timeit$模块测量代码段执行时间
2. 通过$memory_profiler$监控内存使用
3. 采用超参数优化工具(如Optuna)进行自动调参[^2]
阅读全文
相关推荐


















