图解说明LM317驱动白光LED电路设计方法
2026/1/12 6:51:14
项目分析流程 ├─ 数据加载 ├─ 数据预处理(Data Preprocessing) │ └─ 数据清洗(重复值、缺失值、异常值处理)、数据格式标准化 ├─ 探索性数据分析(EDA) │ ├─ 描述性统计分析 │ ├─ 单变量分布可视化 │ ├─ 双变量关系分析(统计检验为主) │ │ └─ 统计检验方法汇总表、检验代码实现与结果输出 │ └─ 多变量关系分析(可选) ├─ 特征工程(Feature Engineering) │ ├─ 特征筛选 │ │ ├─ 有监督特征筛选(基于EDA统计检验结果) │ │ └─ 无监督特征筛选(无目标变量/前置降噪) │ ├─ 特征类型区分(类别型/数值型) │ ├─ 缺失值/异常值处理(进阶) │ ├─ 数据分桶 │ ├─ 特征构造(可选) │ ├─ 特征转换/编码 │ └─ 特征降维(可选) └─ 模型构建与评估 ├─ 数据集划分 ├─ 模型选择与训练 ├─ 模型评估指标计算 ├─ 模型调优 └─ 模型解释与落地(可选)# 大文件分块加载示例chunks=[]forchunkinpd.read_csv(path,chunksize=xxx):chunks.append(chunk)chunks_df=pd.concat(chunks)数据预处理为独立大模块,核心目标是解决数据“可用性”问题,对全量数据做通用、基础的清洗,让数据满足后续分析的基本要求。
data_train.duplicated().sum()data_train.isnull().sum()/ 缺失率计算EDA为独立大模块,核心目标是理解数据特征,挖掘变量分布、变量间关系,为后续特征工程和建模提供依据。
data_train.describe()(连续变量:均值、中位数、标准差、分位数)data_train.describe(include='object')(分类变量:频数、唯一值数量)| 分类序号 | 分析场景(变量类型) | 常用检验方法 | 适用条件 | 原假设(H₀) | 核心用途 |
|---|---|---|---|---|---|
| 1 | 两个分类变量的关系(如:性别 vs 是否违约) | 卡方检验 | 列联表中大部分单元格频数 ≥ 5 | 两个分类变量相互独立,无关联 | 筛选与目标分类变量相关的分类特征 |
| 1 | 两个分类变量的关系 | Fisher精确检验 | 列联表中存在单元格频数 < 5(小样本) | 两个分类变量相互独立,无关联 | 卡方检验的补充,小样本场景下的分类特征筛选 |
| 2 | 单分类变量(两组) vs 连续变量(如:是否违约 vs 收入) | 独立样本t检验 | 连续变量正态分布、方差齐、样本独立 | 两组连续变量的均值无差异 | 筛选与目标二分类变量相关的连续特征 |
| 2 | 单分类变量(两组) vs 连续变量 | Welch’s t检验 | 连续变量正态分布、方差不齐、样本独立 | 两组连续变量的均值无差异 | t检验的修正版,方差不齐时的替代方案 |
| 2 | 单分类变量(两组) vs 连续变量 | Mann-Whitney U检验 | 连续变量非正态分布、样本独立(非参数检验) | 两组连续变量的分布无差异 | 不满足正态分布时,替代t检验的特征筛选 |
| 3 | 单分类变量(多组) vs 连续变量(如:学历等级 vs 收入) | 单因素方差分析(ANOVA) | 连续变量正态分布、方差齐、样本独立 | 多组连续变量的均值全部相等 | 筛选与目标多分类变量相关的连续特征 |
| 3 | 单分类变量(多组) vs 连续变量 | Kruskal-Wallis H检验 | 连续变量非正态分布、样本独立(非参数检验) | 多组连续变量的分布无差异 | 不满足正态分布时,替代ANOVA的特征筛选 |
| 4 | 两个连续变量的关系(如:年龄 vs 贷款金额) | Pearson相关分析 | 两个连续变量均服从正态分布 | 两个连续变量无线性相关 | 筛选与目标连续变量线性相关的连续特征 |
| 4 | 两个连续变量的关系 | Spearman秩相关分析 | 两个连续变量非正态分布(非参数检验) | 两个连续变量无秩相关 | 不满足正态分布时,替代Pearson的特征筛选 |
特征工程的核心目标是提升数据“有效性”,针对筛选后的特征,结合业务逻辑和模型特性做定制化优化,让数据更适配建模需求。
feature_importances_、线性模型系数);fromsklearn.ensembleimportRandomForestClassifier# 训练随机森林模型,获取特征重要性rf=RandomForestClassifier(n_estimators=100,random_state=42)rf.fit(X_train,y_train)# 特征重要性排序feature_importance=pd.DataFrame({'feature':X_train.columns,'importance':rf.feature_importances_}).sort_values(by='importance',ascending=False)# 筛选前N个重要特征(或按阈值筛选)top_features=feature_importance[feature_importance['importance']>0.01]['feature'].tolist()X_train_selected=X_train[top_features]X_test_selected=X_test[top_features]fromsklearn.feature_selectionimportVarianceThresholdimportpandasaspdimportnumpyasnp# 1. 缺失率筛选:删除缺失率>80%的特征missing_rate=X.isnull().sum()/len(X)X_filtered=X.loc[:,missing_rate<=0.8]# 2. 方差阈值筛选:删除常量/低方差特征vt=VarianceThreshold(threshold=0)# threshold=0 表示删除方差为0的特征X_filtered=vt.fit_transform(X_filtered)# 恢复列名(VarianceThreshold返回的是numpy数组)X_filtered=pd.DataFrame(X_filtered,columns=X.columns[vt.get_support()])# 3. 高相关性筛选:删除相关系数>0.9的冗余特征corr_matrix=X_filtered.corr().abs()# 构建上三角矩阵,避免重复计算upper_triangle=corr_matrix.where(np.triu(np.ones(corr_matrix.shape),k=1).astype(bool))# 找到相关系数>0.9的特征列to_drop=[columnforcolumninupper_triangle.columnsifany(upper_triangle[column]>0.9)]X_filtered=X_filtered.drop(columns=to_drop)| 维度 | 预处理阶段(基础清洗) | 特征工程阶段(进阶优化) |
|---|---|---|
| 处理目标 | 保证数据“可用”,填补空值即可 | 保证特征“有效”,填补值需适配业务/模型 |
| 处理粒度 | 全量特征统一策略(如所有数值特征用中位数填充) | 按特征重要性/业务含义定制策略 |
| 处理方法 | 通用统计方法(均值、中位数、众数) | 业务导向/模型导向方法 |
| 目标优先级 | 适用场景 | 处理程度 | 具体操作 | 耗时 |
|---|---|---|---|---|
| 效率优先 | 快速原型验证(POC)、1天内出demo、初步验证数据建模价值 | 极简处理(仅修正核心特征明显问题) | 1. 核心特征(Top3):按业务分组填充(如按职业填收入中位数); 2. 非核心特征:沿用预处理策略 | 10-20分钟 |
| 平衡效率与效果 | 企业常规业务建模(用户流失预测、销量预测等)、需保证模型可用且有一定精度 | 中等深度(聚焦核心特征优化) | 1. 核心特征(Top5):分箱填充/简单模型填充(随机森林单特征预测); 2. 非核心特征:分组填充/沿用预处理 | 1-2小时 |
| 效果优先 | 数据竞赛冲榜、高精度业务建模(风控、医疗、金融定价)、需极致模型精度 | 深度处理(全维度最小化信息损失) | 1. 核心特征:多模型融合填充+缺失标记(新增“是否缺失”特征); 2. 非核心特征:模型填充/分组填充 | 3-6小时 |
fromsklearn.ensembleimportRandomForestRegressor# 选择高重要性特征(如income)作为待填充特征# 分离有值和无值的样本train_income=X_filtered[X_filtered['income'].notnull()]test_income=X_filtered[X_filtered['income'].isnull()]# 用其他特征预测income的缺失值X_train=train_income.drop('income',axis=1)y_train=train_income['income']X_test=test_income.drop('income',axis=1)# 训练填充模型fill_model=RandomForestRegressor(n_estimators=100,random_state=42)fill_model.fit(X_train,y_train)# 预测并填充pred_income=fill_model.predict(X_test)X_filtered.loc[X_filtered['income'].isnull(),'income']=pred_income| 维度 | 预处理阶段(基础清洗) | 特征工程阶段(进阶优化) |
|---|---|---|
| 处理目标 | 消除统计极端值对EDA的干扰 | 消除异常值对模型拟合的负面影响 |
| 处理粒度 | 全量特征统一检测(如3σ法则) | 按特征业务含义/模型敏感度定制策略 |
| 处理方法 | 通用方法(删除、盖帽法) | 业务适配/模型适配方法 |
| 目标优先级 | 适用场景 | 处理程度 | 具体操作 | 耗时 |
|---|---|---|---|---|
| 效率优先 | 快速原型验证(POC)、1天内出demo、初步验证数据建模价值 | 极简处理(仅修正核心特征明显错误) | 1. 核心特征:简单业务规则修正(如年龄限0-100); 2. 非核心特征:轻度盖帽(99分位数) | 10-20分钟 |
| 平衡效率与效果 | 企业常规业务建模(用户流失预测、销量预测等)、需保证模型可用且有一定精度 | 中等深度(聚焦核心特征优化) | 1. 核心特征:业务适配处理(收入对数变换、金额缩尾); 2. 非核心特征:盖帽法(95/99分位数) | 1-2小时 |
| 效果优先 | 数据竞赛冲榜、高精度业务建模(风控、医疗、金融定价)、需极致模型精度 | 深度处理(精准识别+业务适配) | 1. 核心特征:异常检测(IQR+孤立森林)+ 业务适配处理; 2. 非核心特征:模型适配处理(线性缩尾、树模型保留) | 3-6小时 |
# 收入字段:对数变换降低极端值影响(保留高收入用户信息)X_filtered['income_log']=np.log1p(X_filtered['income'])# 年龄字段:错误值替换(150岁以上替换为100岁)X_filtered['age']=X_filtered['age'].apply(lambdax:100ifx>100elsex)fromsklearn.model_selectionimporttrain_test_split# 特征与目标变量分离X=data_train_filtered.drop('target',axis=1)y=data_train_filtered['target']# 划分训练集和测试集X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42,stratify=y# stratify保证目标变量分布一致)# 可选:划分验证集X_train,X_val,y_train,y_val=train_test_split(X_train,y_train,test_size=0.1,random_state=42,stratify=y_train)fromsklearn.ensembleimportRandomForestClassifierfromxgboostimportXGBClassifier# 基础模型训练(随机森林)rf_model=RandomForestClassifier(n_estimators=100,random_state=42)rf_model.fit(X_train,y_train)# 进阶模型训练(XGBoost)xgb_model=XGBClassifier(learning_rate=0.1,n_estimators=100,random_state=42)xgb_model.fit(X_train,y_train,eval_set=[(X_val,y_val)],early_stopping_rounds=10)fromsklearn.metricsimportaccuracy_score,precision_score,recall_score,f1_score,roc_auc_score,confusion_matrix# 模型预测y_pred=xgb_model.predict(X_test)y_pred_proba=xgb_model.predict_proba(X_test)[:,1]# 计算指标accuracy=accuracy_score(y_test,y_pred)precision=precision_score(y_test,y_pred)recall=recall_score(y_test,y_pred)f1=f1_score(y_test,y_pred)auc=roc_auc_score(y_test,y_pred_proba)conf_matrix=confusion_matrix(y_test,y_pred)print(f"准确率:{accuracy:.4f}")print(f"精确率:{precision:.4f}")print(f"召回率:{recall:.4f}")print(f"F1值:{f1:.4f}")print(f"AUC值:{auc:.4f}")print("混淆矩阵:\n",conf_matrix)fromsklearn.metricsimportmean_squared_error,mean_absolute_error,r2_score# 模型预测(回归)y_pred_reg=xgb_reg_model.predict(X_test)# 计算指标mse=mean_squared_error(y_test,y_pred_reg)rmse=mean_squared_error(y_test,y_pred_reg,squared=False)mae=mean_absolute_error(y_test,y_pred_reg)r2=r2_score(y_test,y_pred_reg)print(f"MSE:{mse:.4f}")print(f"RMSE:{rmse:.4f}")print(f"MAE:{mae:.4f}")print(f"R²:{r2:.4f}")fromsklearn.model_selectionimportGridSearchCV# 定义参数网格param_grid={'n_estimators':[50,100,200],'max_depth':[3,5,7],'learning_rate':[0.01,0.1,0.2]}# 网格搜索grid_search=GridSearchCV(estimator=XGBClassifier(random_state=42),param_grid=param_grid,cv=5,# 5折交叉验证scoring='roc_auc',# 分类任务以AUC为评分标准n_jobs=-1)grid_search.fit(X_train,y_train)print("最优参数:",grid_search.best_params_)print("最优交叉验证得分:",grid_search.best_score_)# 最优模型best_model=grid_search.best_estimator_importjoblib# 保存模型joblib.dump(best_model,'best_xgb_model.pkl')# 加载模型loaded_model=joblib.load('best_xgb_model.pkl')# 离线预测new_data_pred=loaded_model.predict(new_data)| 不规范的命名 | 规范的命名 | 归属层级 |
|---|---|---|
| 数据处理 | 数据预处理 | 独立大模块 |
| 缺失值处理 | 数据清洗 | 数据预处理的子模块 |
| 统计检验 | 探索性数据分析(EDA) | 独立大模块 |
| 特征筛选 | 特征工程 | 独立大模块 |
| 模型调参 | 模型调优 | 模型构建与评估的子模块 |
| 无监督降维 | 无监督特征筛选/特征降维 | 特征工程的子模块 |