机器学习数据预处理:数据转换
机器学习数据预处理数据转换超通俗完整版数据转换是把原始数据“改造”成模型能轻松学习的格式是建模前必做的核心步骤几乎所有数据分析、机器学习项目都会用到。一、什么是数据转换一句话理解把不规整、难处理的数据变成规整、好计算、符合模型要求的数据。比如数值差距太大收入 10001000 万是文字而不是数字男/女、好/中/差分布歪歪扭扭严重右偏连续值不想用具体数字只想分等级都要靠数据转换来解决。二、7 种最常用的数据转换方法超详细1. 标准化Z-Score作用把数据变成均值0标准差1的标准分布。公式zixi−μσz_i \frac{x_i - \mu}{\sigma}ziσxi−μμ均值σ标准差适用场景线性回归、逻辑回归、SVM、PCA、神经网络等对尺度敏感的模型。优点对异常值相对稳定让特征权重公平不被大数带偏2. 归一化Min-Max Scaling作用把数据缩到[0,1]或[-1,1]区间。公式xi′xi−xminxmax−xminx_i \frac{x_i - x_{min}}{x_{max} - x_{min}}xi′xmax−xminxi−xmin适用场景KNN、K-Means、神经网络、图像像素0-255 → 0-1。优点范围固定直观提升距离计算的稳定性3. 对数转换Log Transform作用压缩大数差距把右偏分布变对称。公式x′log(1x)x \log(1x)x′log(1x)适用场景房价、收入、销量、金额等跨度极大的数据。优点削弱极端值影响让线性模型更容易拟合4. Box-Cox 变换作用比对数更通用把任意分布转成近似正态分布。公式x′{xλ−1λλ≠0log(x)λ0 x \begin{cases} \frac{x^\lambda -1}{\lambda} \lambda \neq 0 \\ \log(x) \lambda 0 \end{cases}x′{λxλ−1log(x)λ0λ0适用场景统计建模、需要严格正态分布的任务。5. 分箱Binning作用把连续数字 → 离散类别。两种常用方式等宽分箱按区间宽度均分等频分箱按样本数量均分例子年龄 22、35、58 → 青年、中年、老年适用场景决策树、业务规则建模、提升鲁棒性。6. One-Hot 编码独热编码作用把分类文字 → 数字向量让模型能看懂。例子颜色红、蓝、绿→ 红(1,0,0)、蓝(0,1,0)、绿(0,0,1)优点不引入虚假大小关系如 红1蓝2 这种错误缺点类别多的时候会维度爆炸。7. PCA 主成分分析降维转换作用把高维特征线性投影保留主要信息降低维度。步骤计算协方差矩阵求特征值与特征向量保留前 k 个主成分适用场景特征冗余高、维度太高、需要加速训练时。三、7 种方法一张表速查方法核心作用适用场景标准化均值0标准差1线性模型、神经网络、SVM归一化缩到 [0,1]KNN、聚类、图像对数转换修正偏态、压缩大数房价、收入、金额Box-Cox转为近似正态统计建模分箱连续→离散决策树、业务解释One-Hot分类→数值向量所有不支持类别输入的模型PCA降维、去冗余高维特征、加速训练四、完整实战代码房价预测数据集包含对数转换、标准化、分箱、One-Hot、PCA、建模评估直接复制可运行。importpandasaspdimportnumpyasnpimportmatplotlib.pyplotaspltimportseabornassnsfromsklearn.preprocessingimportStandardScaler,MinMaxScalerfromsklearn.decompositionimportPCAfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportRidgefromsklearn.metricsimportmean_squared_errorfromscipy.statsimportskew# # 1. 加载数据# datapd.read_csv(./train.csv)# 从Kaggle下载House Prices数据print(data.shape)# # 2. 查看偏态数据需要对数转换# numeric_featsdata.select_dtypes(include[np.number]).columns skewed_featsdata[numeric_feats].apply(lambdax:skew(x.dropna()))skewed_featsskewed_feats[skewed_feats1].sort_values(ascendingFalse)print(高偏度特征)print(skewed_feats[:10])# # 3. 对数转换# data_logdata.copy()forfeatinskewed_feats.index:data_log[feat]np.log1p(data_log[feat])# # 4. 标准化# data_log[numeric_feats]data_log[numeric_feats].fillna(data_log[numeric_feats].median())scalerStandardScaler()scaled_valsscaler.fit_transform(data_log[numeric_feats])scaled_dfpd.DataFrame(scaled_vals,columnsnumeric_feats)# # 5. 分箱房龄分箱# data_log[YearBuiltBin]pd.cut(data_log[YearBuilt],bins[1870,1900,1950,2000,2010],labels[VeryOld,Old,Modern,New])# # 6. One-Hot 编码# cat_cols[YearBuiltBin,Neighborhood,HouseStyle]forcincat_cols:data_log[c]data_log[c].fillna(data_log[c].mode()[0])onehot_dfpd.get_dummies(data_log[cat_cols],drop_firstTrue)# 合并数值 编码特征final_dfpd.concat([scaled_df,onehot_df],axis1)# # 7. PCA 降维# pcaPCA(n_components0.95)X_pcapca.fit_transform(final_df)print(原维度,final_df.shape[1])print(PCA后维度,X_pca.shape[1])# # 8. 建模预测房价回归# ynp.log1p(data_log[SalePrice])X_train,X_test,y_train,y_testtrain_test_split(X_pca,y,test_size0.2,random_state42)modelRidge(alpha1.0)model.fit(X_train,y_train)y_predmodel.predict(X_test)rmsenp.sqrt(mean_squared_error(y_test,y_pred))print(RMSE对数空间,round(rmse,4))# # 9. 预测结果可视化# plt.figure(figsize(8,6))plt.scatter(np.expm1(y_test),np.expm1(y_pred),alpha0.7,color#ff6666)plt.plot([0,800000],[0,800000],k--)plt.title(真实房价 vs 预测房价)plt.xlabel(真实价格)plt.ylabel(预测价格)plt.grid()plt.show()五、数据转换的优缺点优点让模型更容易学习大幅提升精度加速收敛梯度下降更快更稳削弱异常值提高鲁棒性文字转数字让分类特征可用降维减噪节省计算资源缺点可能丢失原始语义尤其 PCA转换不当会破坏数据规律增加预处理代码与调试成本对树模型决策树、XGBoost收益不大六、什么时候必须做数据转换用线性模型、SVM、神经网络、KNN→ 必须标准化/归一化数据严重偏态、有极端大值→ 对数转换特征是文字类别→ One-Hot / 目标编码特征维度太高、冗余多→ PCA想把数字变成业务等级→ 分箱七、总结面试/笔记万能版数据转换 把原始数据改成模型友好格式7 大核心方法标准化、归一化、对数、Box-Cox、分箱、One-Hot、PCA距离/线性模型必做缩放树模型可不做偏态数据用对数分类数据用One-Hot高维数据用PCA