PHP网站开发技术期末作品,健康门户网站建设内容,百度网站安全检测,做网站找王思奇#x1f31e;欢迎来到数据分析的世界 #x1f308;博客主页#xff1a;卿云阁 #x1f48c;欢迎关注#x1f389;点赞#x1f44d;收藏⭐️留言#x1f4dd; #x1f31f;本文由卿云阁原创#xff01; #x1f320;本阶段属于练气阶段#xff0c;希望各位仙友顺利完…欢迎来到数据分析的世界博客主页卿云阁欢迎关注点赞收藏⭐️留言本文由卿云阁原创本阶段属于练气阶段希望各位仙友顺利完成突破首发时间2025年12月20日✉️希望可以和大家一起完成进阶之路作者水平很有限如果发现错误请留言轰炸哦万分感谢目录引入为什么不能直接填数字 选手一OE (Ordinal Encoder) —— 简单粗暴的“排号员” 选手二QE (Quantile Encoder) —— 看人下菜碟的“分段王” 选手三LOOE (Leave-One-Out Encoder) —— 防作弊的“超级翻译” 最佳搭档RF (Random Forest 随机森林) 代码实战Python版 总结引入做数据挖掘或者机器学习的同学都知道模型Model其实是个“偏科生”。它数学很好但语文极差——它只认识数字根本不认识汉字或英文单词所以当我们拿到一份包含“性别男/女”、“城市北京/上海”、“原料猪粪/秸秆”这样的数据时第一步必须做的事就是当翻译官把这些文字“翻译”成数字这个过程就叫编码Encoding。今天我们就用最接地气的方式聊聊三种超好用的编码方式OE、QE、LOOE以及它们的好搭档随机森林RF。1. 为什么不能直接填数字很多人想“这还不简单男1女2北京1上海2广州3。”这就引出了第一种编码方式。 选手一OE (Ordinal Encoder) —— 简单粗暴的“排号员”就是给每个类别发个号牌。比如[小学, 初中, 高中, 大学]OE编码后变成[1, 2, 3, 4]这种方式非常的简单省内存。非常适合有“等级关系”的数据比如学历、尺码 S/M/L。因为4321正好对应 大学高中初中小学模型能理解这种“越来越大”的关系。但是对于没有等级关系的数据它会“误导”模型。比如[苹果, 香蕉, 西瓜] 变成 [1, 2, 3]。模型会以为“西瓜(3) 比苹果(1) 大/高级”但其实它们只是不同的水果而已。这时候用 OE 就不太好了。 选手二QE (Quantile Encoder) —— 看人下菜碟的“分段王”这个稍微高级一点。它不是随便给个号而是根据这个特征对应的**目标值Target也就是你要预测的结果的表现来打分。假设我们要预测”房价”特征是“地段”。OE做法一环1二环2...QE做法它不看你是几环它看这里的房子大部分卖多少钱。它会把所有地段按房价排序。房价最低的那一拨地段比如后25%编码为 1。房价中等的那一拨中间50%编码为 2。房价最高的那一拨前25%编码为 3。它的核心逻辑“我不关心你叫什么名字我只关心你属于哪个档次。”这能很好地处理异常值把数据变得更平滑。 选手三LOOE (Leave-One-Out Encoder) —— 防作弊的“超级翻译”这是很多高分论文包括很多 Kaggle 比赛里的秘密武器。它也是一种目标编码Target Encoding也就是用“结果”来代表“特征”。我们要预测一个学生期末考试能考多少分特征是“所在的班级”。如果直接用这个班的平均分来代表这个班级行不行比如 1班平均分90那就把“1班”编码成 90。问题如果在训练的时候你把这个学生自己的分数也算进平均分里了这不就是作弊吗模型会直接“记住”答案而不是学习规律。LOOE 的神操作Leave-One-Out 留一法在计算“1班”的编码值时把你当前样本的分数拿掉只算1班其他所有人的平均分作为你的编码值。优点既利用了“这个类别通常很强”的高级信息又完美避开了“自己预测自己”的作弊嫌疑。准确率通常比 OE 高一大截 最佳搭档RF (Random Forest 随机森林)把数据用上面三种方法编码好变成数字后就可以喂给模型了。在这个组合里随机森林是个绝佳的选择。随机森林就是“三个臭皮匠顶个诸葛亮”的究极版。它种了很多棵决策树Expert。来了一个新数据每棵树都通过上面的编码数字进行判断给出自己的预测。最后随机森林把所有树的结果取平均回归问题或者投票分类问题。为什么它和编码是绝配刚才 OE 编码里提到的“苹果(1) vs 西瓜(3)”的误导问题随机森林通过大量的树和随机性能一定程度上消化掉这种误差。你不需要把数字缩放到 0-1 之间随机森林不挑食直接喂刚才编码好的 1, 90, 513 这种数字它照样吃得香。 代码实战Python版import pandas as pd from sklearn.ensemble import RandomForestRegressor from category_encoders import OrdinalEncoder, LeaveOneOutEncoder, QuantileEncoder from sklearn.model_selection import train_test_split # 1. 准备数据 (假装这是你的实验数据) data pd.DataFrame({ 底物类型: [猪粪, 秸秆, 餐厨, 猪粪, 餐厨, 秸秆], # 分类特征 温度: [35, 37, 55, 35, 55, 37], 产气量: [100, 120, 500, 110, 520, 130] # 目标变量 (y) }) X data[[底物类型, 温度]] y data[产气量] # 2. 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) # 核心编码三剑客 # --- 方式 A: OE (简单排号) --- # oe OrdinalEncoder(cols[底物类型]) # X_train_enc oe.fit_transform(X_train) # X_test_enc oe.transform(X_test) # --- 方式 B: LOOE (留一法推荐) --- # 注意LOOE 训练时必须传入 y_train因为它要算平均值 looe LeaveOneOutEncoder(cols[底物类型]) X_train_enc looe.fit_transform(X_train, y_train) X_test_enc looe.transform(X_test) # 测试集直接用训练集算好的规则 print(编码后的数据长这样) print(X_train_enc) # 核心随机森林建模 # 3. 召唤随机森林 rf RandomForestRegressor(n_estimators100, random_state42) # 4. 训练 (喂入编码后的数据) rf.fit(X_train_enc, y_train) # 5. 预测 preds rf.predict(X_test_enc) print(f预测结果: {preds}) 总结编码方式核心逻辑适合场景比喻OE按顺序编号有等级关系的数据 (大/中/小)排队发号牌QE按目标值的分布分档需要减少噪音、处理异常值划分“优良中差”等级LOOE用除去自己外的平均目标值类别之间差异大想提升精度“看看大家都考多少分” (但不准看自己的)