2026/6/20 8:32:53
网站建设
项目流程
企业网站建设东莞,保定网站制作推广,软件工程的八个步骤,棋牌软件开发让我用一个 相亲匹配系统 的比喻来解释#xff0c;保证你秒懂#xff01;
1. 核心问题#xff1a;机器学习的“公平性”问题
场景#xff1a;相亲网站要预测两个人是否合适
我们有3个人的资料#xff1a;
# 原始数据
people_data [# 年龄, 身高(cm), 月薪(元), 城市等…让我用一个相亲匹配系统的比喻来解释保证你秒懂1. 核心问题机器学习的“公平性”问题场景相亲网站要预测两个人是否合适我们有3个人的资料# 原始数据 people_data [ # 年龄, 身高(cm), 月薪(元), 城市等级 [25, 165, 8000, 2], # 张三25岁165cm月薪8k二线城市 [30, 180, 50000, 1], # 李四30岁180cm月薪5w一线城市 [28, 172, 20000, 3] # 王五28岁172cm月薪2w三线城市 ]❌问题来了不公平比较月薪是万级别8000-50000身高是百级别165-180年龄是十级别25-30城市是单位数1-3机器学习会觉得哇月薪差异好大8000到50000这个特征肯定很重要身高差异好小165到180这个特征不太重要...但实际呢月薪差5000可能没什么比如8k vs 13k身高差5cm可能很重要比如160cm vs 165cm这就是为什么要 transform标准化2. 具体例子没有 transform 的灾难例子1距离计算时的问题KNN、SVMimport numpy as np # 两个人的数据 person1 np.array([25, 165, 8000]) # 张三 person2 np.array([30, 180, 50000]) # 李四 # 计算相似度欧式距离 distance np.sqrt((25-30)**2 (165-180)**2 (8000-50000)**2) print(f原始数据距离: {distance:,.2f}) print(分解看) print(f 年龄贡献: {(25-30)**2}) # 25 print(f 身高贡献: {(165-180)**2}) # 225 print(f 月薪贡献: {(8000-50000)**2:,}) # 1,764,000,000 print(\n结论距离完全被月薪主导其他特征被忽略了)输出原始数据距离: 42,000.02 分解看 年龄贡献: 25 身高贡献: 225 月薪贡献: 1,764,000,000 结论距离完全被月薪主导其他特征被忽略了例子2梯度下降时的问题神经网络想象你在爬山找宝藏月薪特征像一座高山坡度很陡身高特征像一个小土坡坡度很缓# 梯度下降比喻 print(梯度下降找宝藏遇到的问题) print(1. 月薪山太陡 → 容易‘冲过头’不稳定) print(2. 身高坡太平 → 走得很慢学得慢) print(3. 要设置很小的学习率适应月薪山) print(4. 但又会导致身高坡学得更慢) print(\n结果训练困难效果不好)3. Transform 如何解决问题解决方案把所有特征放到同一起跑线from sklearn.preprocessing import StandardScaler # 原始数据 data np.array([ [25, 165, 8000], # 张三 [30, 180, 50000], # 李四 [28, 172, 20000] # 王五 ]) scaler StandardScaler() scaled_data scaler.fit_transform(data) print(原始数据) print(data) print(\n标准化后) print(scaled_data) print(\n现在看看) print(f每列平均值: {scaled_data.mean(axis0).round(3)}) # 接近0 print(f每列标准差: {scaled_data.std(axis0).round(3)}) # 都是1输出原始数据 [[ 25 165 8000] [ 30 180 50000] [ 28 172 20000]] 标准化后 [[-1.069 -1.069 -0.951] [ 1.336 1.336 1.291] [-0.267 -0.267 -0.34 ]] 现在看看 每列平均值: [ 0. -0. -0.] 每列标准差: [1. 1. 1.]✅transform 后的好处# 重新计算距离 p1_scaled scaled_data[0] # 标准化后的张三 p2_scaled scaled_data[1] # 标准化后的李四 distance_scaled np.sqrt(sum((p1_scaled - p2_scaled)**2)) print(f\n标准化后的距离: {distance_scaled:.2f}) print(分解看) print(f 年龄贡献: {(p1_scaled[0]-p2_scaled[0])**2:.3f}) # 5.785 print(f 身高贡献: {(p1_scaled[1]-p2_scaled[1])**2:.3f}) # 5.785 print(f 月薪贡献: {(p1_scaled[2]-p2_scaled[2])**2:.3f}) # 5.027 print(\n✅ 现在三个特征贡献相当公平比较)4. 不同 transform 解决不同问题问题1特征尺度不同 → 标准化/归一化# 类比把不同货币换成美元比较 # 人民币、日元、欧元 → 全部换成美元 print(问题月薪(元)、身高(cm)、年龄(岁)单位不同) print(解决StandardScaler - 全部变成‘均值为0标准差1’)问题2特征分布偏斜 → 对数/幂变换# 收入数据大部分人5k-10k少数人100k-500k incomes np.array([5000, 8000, 10000, 120000, 350000]) print(\n问题收入数据严重偏斜少数人极高) print(原始分布大部分挤在左边长尾巴在右边) print(解决np.log1p() - 取对数压缩大值) print(f变换前: {incomes}) print(f取对数: {np.log1p(incomes).round(1)})问题3分类特征 → 独热编码# 城市北京、上海、广州 cities [北京, 上海, 广州, 北京, 广州] print(\n问题城市是文字但机器学习只懂数字) print(错误转换北京1, 上海2, 广州3) print( → 机器学习会以为‘广州(3) 上海(2) 北京(1)’) print(解决OneHotEncoder - 每个城市一列) print( 北京 → [1, 0, 0]) print( 上海 → [0, 1, 0]) print( 广州 → [0, 0, 1])问题4缺失值 → 填充# 调查问卷有人没填某些问题 survey np.array([ [25, 165, 8000], [30, np.nan, 50000], # 身高没填 [np.nan, 172, 20000] # 年龄没填 ]) print(\n问题数据有缺失NaN) print(解决SimpleImputer - 用平均值/中位数填充) print(f 身高缺失 → 用平均身高(169.0)填充) print(f 年龄缺失 → 用平均年龄(27.5)填充)5. 可视化对比transform 前后的区别import matplotlib.pyplot as plt # 创建模拟数据 np.random.seed(42) age np.random.randint(20, 40, 100) # 20-40岁 height np.random.randint(150, 190, 100) # 150-190cm salary np.random.exponential(10000, 100) # 指数分布的收入 data np.column_stack([age, height, salary]) # 标准化前后对比 scaler StandardScaler() scaled scaler.fit_transform(data) fig, axes plt.subplots(2, 3, figsize(12, 6)) # 原始数据分布 axes[0, 0].hist(data[:, 0], bins20, edgecolorblack) axes[0, 0].set_title(年龄原始) axes[0, 0].set_xlabel(岁) axes[0, 1].hist(data[:, 1], bins20, edgecolorblack) axes[0, 1].set_title(身高原始) axes[0, 1].set_xlabel(cm) axes[0, 2].hist(data[:, 2], bins20, edgecolorblack) axes[0, 2].set_title(月薪原始) axes[0, 2].set_xlabel(元) # 标准化后分布 axes[1, 0].hist(scaled[:, 0], bins20, edgecolorblack) axes[1, 0].set_title(年龄标准化后) axes[1, 0].set_xlabel(标准差) axes[1, 1].hist(scaled[:, 1], bins20, edgecolorblack) axes[1, 1].set_title(身高标准化后) axes[1, 1].set_xlabel(标准差) axes[1, 2].hist(scaled[:, 2], bins20, edgecolorblack) axes[1, 2].set_title(月薪标准化后) axes[1, 2].set_xlabel(标准差) plt.tight_layout() plt.show()看图你会发现原始数据三个特征尺度完全不同标准化后都变成均值为0、标准差1的分布现在模型可以公平对待每个特征6. 实际案例房价预测# 预测房价特征尺度差异巨大 house_features { 卧室数: [2, 3, 4, 5], # 2-5间 面积: [80, 120, 200, 350], # 80-350平米 建造年份: [1990, 2000, 2010, 2020], # 年份 距离地铁距离: [500, 1000, 1500, 3000] # 米 } print(房价预测问题) print(原始特征尺度) print( 卧室数: 2-5 (范围3)) print( 面积: 80-350 (范围270)) print( 年份: 1990-2020 (范围30)) print( 地铁距离: 500-3000 (范围2500)) print(\n如果不标准化) print( 模型会过度关注‘面积’和‘地铁距离’) print( 忽略‘卧室数’和‘年份’的影响) print(\n标准化后) print( 所有特征同等重要) print( 模型能学到真正的规律)7. 总结transform 的核心价值比喻奥运会公平竞赛print( 拳击比赛不同体重级) print( 原始60kg vs 100kg → 不公平) print( 解决分重量级轻量级、重量级) print( ↑ 这就是标准化) print(\n 田径比赛不同项目) print( 原始100米(秒) vs 马拉松(小时) → 无法比较) print( 解决都转换成‘标准分数’) print( ↑ 这就是归一化) print(\n 国际会议不同语言) print( 原始中文、英文、法文 → 无法沟通) print( 解决统一用英语或翻译) print( ↑ 这就是编码)最终结论问题不transform的后果transform的解决方案效果尺度不同模型偏见只关注大数值特征标准化/归一化公平比较分布偏斜模型被异常值带偏对数/Box-Cox变换分布更对称文字数据模型无法理解独热/标签编码计算机能懂缺失值模型报错或效果差填充/插值数据完整高维度计算慢过拟合PCA/特征选择降维提速一句话记住Transform 就是给数据统一度量衡让机器学习能公平、正确地学习