孤立森林排除“异常值”可以提高模型效能?

server/2025/2/11 13:42:42/

孤立森林排除“异常值”可以提高模型效能的论证

排除异常值可以让数据集的分布相对更加集中,更有利于算法的拟合,所以,设想是适当地去掉异常值,可以提高模型的效能。

为了证明以上的设想,使用两个数据集来分别在排除异常值前后构建模型并评估效能。

结果

第一个数据集效能降了;第二个数据集效能持平

结论

孤立森林排除异常值对提高模型效能似乎并没有作用,看来起初的猜想有些想当然了,后者还是要具体考察。

讨论

说实话,在验证之前我觉得排除异常值应该能够提高模型效能,并且是十拿九稳的,结果确实出乎意料,一时还真想不到什么样的理由来解释这个事情。

一种可能性是,数据集不存在异常值,因为孤立森林是按照比例删除数据,或许是降低了样本量导致效能下降。

另一种可能性,数据量过小,如果原始数据集本身的数据量就比较小,使用孤立森林排除异常值可能会进一步减少有效数据量,导致模型可学习的信息不足,无法充分捕捉数据的特征和规律,进而影响模型的效能。但是使用的两个数据集分别是900和300,应该算不上很小。

附:相关的代码

一、排除“异常值”前

from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import RFE
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
# 对object类型数据进行编码
categorical_cols = data.select_dtypes(include=['object']).columns
for col in categorical_cols:le = LabelEncoder()data[col] = le.fit_transform(data[col])# 划分特征和目标变量
X = data.drop('HeartDisease', axis=1)
y = data['HeartDisease']# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)rf = RandomForestClassifier(n_estimators=100, random_state=42)# 使用选择的特征进行建模和预测rf.fit(X_train, y_train)
y_pred = rf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('使用选择的特征的模型准确率:', accuracy)
#使用选择的特征的模型准确率: 0.8804347826086957

二、排除“异常值”

from sklearn.ensemble import IsolationForest# # 对object类型数据进行编码
# categorical_cols = data.select_dtypes(include=['object']).columns
# for col in categorical_cols:
#     le = LabelEncoder()
#     data[col] = le.fit_transform(data[col])# 初始化 Isolation Forest 模型
isolation_forest = IsolationForest(n_estimators=100, contamination=0.05, random_state=42)# 拟合模型并预测异常值
data['is_outlier'] = isolation_forest.fit_predict(data)# 去除异常值
data_cleaned = data[data['is_outlier'] == 1].drop('is_outlier', axis=1)print('原始数据行数和列数:', data.shape)
print('去除异常值后数据的行数和列数:', data_cleaned.shape)

三、排除“异常值后”

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score# 划分特征和目标变量
X = data_cleaned.drop('HeartDisease', axis=1)
y = data_cleaned['HeartDisease']# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 
# 创建随机森林分类器
rf = RandomForestClassifier(n_estimators=100, random_state=42)# 在训练集上训练模型
rf.fit(X_train, y_train)# 在测试集上进行预测
y_pred = rf.predict(X_test)# 计算准确率
accuracy = accuracy_score(y_test, y_pred)print(f'随机森林模型的准确率:{accuracy:.2%}')
#随机森林模型的准确率:85.71%

http://www.ppmy.cn/server/166761.html

相关文章

唯一值校验的实现思路(续)

本文接着上一篇文章《唯一值校验的实现思路》,在后端实现唯一值校验。用代码实现。 /*** checkUniqueException[唯一值校验]** param entity 新增或编辑的学生实体* param insert 是否新增,如果是传入true;反之传入false* return void* date…

Python3命令行交互不能使用方向键

个人博客地址:Python3命令行交互不能使用方向键 | 一张假钞的真实世界 自定义安装Python3后在命令行使用方向键时出现以下问题: $ python3 Python 3.7.4 (default, Dec 11 2019, 17:40:08) [GCC 7.4.0] on linux Type "help", "copyri…

PyCharm结合DeepSeek-R1

PyCharm结合DeepSeek-R1,打造专属 AI 编程助手 在程序员的日常工作中,提高编程效率、快速解决代码问题是重中之重。今天给大家分享一个强强联合的组合 ——PyCharm 插件 Continue 与 DeepSeek-R1,它们能帮你打造出强大的个人 AI 编程助手。 …

基于单片机的高精度智能电子秤设计

标题:基于单片机的高精度智能电子秤设计 内容:1.摘要 摘要:本文介绍了一种基于单片机的高精度智能电子秤设计。该电子秤采用了高精度传感器和先进的信号处理技术,能够实现快速、准确的称重。设计中还融入了智能化功能,如数据存储、单位换算、…

RsAbC CTF解密工具

在 CTF(Capture The Flag)竞赛中,加密题是不可或缺的一部分,而 RSA 加密作为最常见的加密算法之一,常常出现在各类题目中。和大家分享一款我在 CTF 备赛过程中发现工具RsAbC,它能帮助我们解决基本RSA 加密相…

Ubuntu禁止内核自动更新

在Ubuntu中,内核的自动更新有时会导致系统不稳定,特别是在运行关键任务的服务器上。因此,禁用内核的自动更新是一个重要的操作。下面是详细的步骤,帮助您在Ubuntu系统中禁用内核自动更新。 一、锁定内核版本 通过锁定内核版本&a…

[LeetCode] day19 454. 四数相加 II

题目链接 题目描述 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&…

深度学习-利用Tacotron 2 和 WaveGlow 模型 进行语音合成

以下是一个利用 Tacotron 2 和 WaveGlow 模型进行语音合成的详细代码实现。Tacotron 2 用于将输入文本转换为梅尔频谱,而 WaveGlow 则根据梅尔频谱生成最终的语音波形。 步骤 1:安装依赖库 首先,确保你已经安装了以下必要的 Python 库: pip install torch numpy scipy l…