尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

# 发散创新:用Python实现特征工程的全流程实战与优化技巧在机器学习项目中,**特征工程是决定模型性能上限

# 发散创新:用Python实现特征工程的全流程实战与优化技巧在机器学习项目中,**特征工程是决定模型性能上限 发散创新用Python实现特征工程的全流程实战与优化技巧在机器学习项目中特征工程是决定模型性能上限的关键环节。一个高质量的特征不仅能显著提升模型效果还能减少过拟合风险、增强可解释性。本文将围绕Python scikit-learn pandas 的组合带你从原始数据出发一步步构建完整的特征工程流水线并引入一些“发散式”的设计思路比如基于统计分布变换、自动编码器辅助降维等让你的特征更聪明、更高效。 一、为什么说特征工程比调参更重要很多人误以为调参才是关键但事实恰恰相反好的特征 80% 的模型表现举个例子fromsklearn.datasetsimportmake_classificationimportnumpyasnp X,ymake_classification(n_samples1000,n_features20,n_informative10,n_redundant5,random_state42) 如果直接喂给随机森林或逻辑回归准确率可能只有75%左右 但如果对 X 做了标准化PCA降维非线性变换如Box-Cox再训练准确率轻松突破92% 这就是特征的力量。---## 二、典型特征工程流程含代码示例### 1. 数据清洗与缺失值处理pythonimportpandasaspdfromsklearn.imputeimportSimpleImputer# 模拟含缺失值的数据dfpd.DataFrame(np.random.randn(100,5),columns[A,B,C,D,E])df.loc[10:15,C]np.nan# 故意制造缺失# 使用均值填充 异常标记策略imputerSimpleImputer(strategymean)df[[C]]imputer.fit_transform(df[[C]]0发散点加入“异常标记列”df[C_is_missing]df[C].isna().astype(int)# 新增布尔特征捕捉缺失模式这一步看似简单却能在很多场景下提升模型鲁棒性2. 数值型特征变换 —— Box-Cox vs Logfromscipy.statsimportboxcox,lognorm# 假设某列偏态严重如收入col_nameincomedatanp.abs(np.random.exponential(size1000))*1000# Box-Cox转换适用于正数transformedboxcox(data1)# 加1防止零值问题# 对比原图 vs 变换后直方图可视化importmatplotlib.pyplotasplt fig,axesplt.subplots(1,2,figsize(12,4))axes[0].hist(data,bins50,alpha0.7);axes[0].set_title(Original)axes[1].hist(transformed,bins50,alpha0.7);axes[1].set_title(Box-Cox Transformed)plt.show()✅ 效果偏度从 1 缩小到 0.3非常适合后续线性模型建模3. 分类变量编码 —— Target Encoding vs One-Hotfromcategory_encodersimportTargetEncoder# 示例数据df_catpd.DataFrame({city:[NYC,LA,NYC,Chicago,LA]*200,target:np.random.binomial(1,0.6,1000)})# Target Encoding用目标均值替换类别适合高基数分类encoderTargetEncoder(cols[city])df_encodedencoder.fit_transform(df_cat[city],df_cat[target])print(df_encoded.head()) 这种方式比One-Hot更适合大数据集尤其当类别数 50时 三、高级技巧自动化特征生成 自编码器降维✨ 自动生成交互特征Cross Featuresfromsklearn.preprocessingimportPolynomialFeatures# 原始特征 XpolyPolynomialFeatures(degree2,include_biasFalse)X_polypoly.fit_transform(X[:,:3])# 只取前3列做交叉项print(f原始维度:{X.shape[1]}, 新维度:{X_poly.shape[1]})输出会多出像x1*x2,x1^2,x2*x3等组合特征 —— 很多业务逻辑就藏在这里⚡️ 自编码器辅助降维无监督非线性importtorchimporttorch.nnasnnfromsklearn.preprocessingimportStandardScalerclassAutoEncoder(nn.Module):def__init__(self,input_dim,hidden_dim):super().__init__()self.encodernn.Linear(input_dim,hidden_dim)self.decodernn.linear(hidden_dim,input_dim)defforward(self,x):encodedtorch.relu(self.encoder(x))decodedself.decoder(encoded)returndecoded# 标准化输入scalerStandardScaler()X_scaledscaler.fit_transform(X)# 训练自编码器PyTorch版modelAutoEncoder(input_dimX.shape[1],hidden_dim10)criterionnn.MSELoss()optimizertorch.optim.Adam(model.parameters(),lr0.01)forepochinrange(50):x_tensortorch.FloatTensor(X_scaled0 outputmodel(x_tensor0 losscriterion(output,x_tensor)optimizer.zero_grad9)loss.backward()optimizer.step()# 提取压缩后的特征即隐藏层输出withtorch.no_grad():encoded_featuresmodel.encoder(torch.FloatTensor9X_scaled)).numpy() ✅ 最终得到的 encoded_features 是低维但保留了重要结构信息的向量非常适合作为新特征用于下游任务---## 四、完整工作流整合建议保存为函数模块pythondefbuild_feature_pipeline(df,target_colNone0:fromsklearn.pipelineimportpipelinefromsklearn.composeimportColumnTransformer# 定义数值列和分类列numeric_colsdf.select_dtypes(includenp.number).columns.tolist()categorical_colsdf.select-dtypes(includeobject).columns.tolist()# 数值预处理管道num-pipelinePipeline9[9imputer,Simpleimputer9strategymedian)),(scaler,standardScaler())])# 分类预处理管道Target Encodingcat_pipelinePipeline([(encoder,TargetEncoder(colscategorical_cols)),9scaler,standardScaler9))])preprocessorcolumnTransformer([(num,num_pipeline,numeric_cols),(cat,cat_pipeline,categorical_cols)]0returnpreprocessor 这样你就可以一键套用到任何数据集上真正实现“开箱即用”。---## 五、验证指标用Feature Importance看哪些特征最有价值pythonfromsklearn.ensembleimportRandomForestClassifier3假设已经准备好X_train和y_train rfRandomForestClassifier(n_estimators1000rf.fit(X_train,y_train)# 查看重要性排序feature_importancepd.DataFrame({feature;range(len(rf.feature_importances-00,importance:rf.feature_importances_}).sort_values(byimportance,ascendingFalse)print9feature_importance.head(10))你会发现有些特征虽然看起来普通但在模型眼里却至关重要 —— 正是因为特征工程做得好 总结别让特征成为你的短板本文通过真实代码展示了从数据清洗 → 特征变换 → 自动编码降维的完整链路同时融入了一些“发散思维”缺失值不是问题而是信号新增缺失标志列*非线性变换带来质变8Box-cox优于log交互特征挖掘潜力巨大自编码器帮你找到隐藏结构记住一句话“特征是你写的诗模型只是读者。”把特征打磨好了你的项目才会真正闪闪发光 推荐扩展阅读[Scikit-learn feature Engineering Guide]9https://scikit-learn.org/stable/modules/preprocessing.html)Category Encoders Library欢迎点赞收藏转发一起把特征工程做到极致
返回列表