使用PowerTransformer处理数据提高朴素贝叶斯-高斯分类器的准确率

一、PowerTransformer介绍

        PowerTransformer是一个sklearn中的预处理模块,可以对数据进行变换,使其更符合高斯分布或者更加均匀分布。主要用于处理数据集中存在偏态分布的情况,常用于数据预处理。PowerTransformer提供了两种变换方法:Yeo-Johnson变换和Box-Cox变换。Yeo-Johnson变换可以处理任何形式的数据(正数、负数、零),而Box-Cox变换仅适用于正数数据。
PowerTransformer的操作流程如下:
        1. 通过fit方法对数据进行拟合以得到转换的参数。
        2. 通过transform方法对数据进行转换并返回转换后的数据。
        PowerTransformer还提供了inverse_transform方法来反转换数据,将转换后的数据恢复为原始数据。使用PowerTransformer可以有效地提高模型的准确性,特别是在使用线性模型时,可以提高模型的收敛速度和稳定性。

二、主要参数介绍

method 变化方法,可选,默认为yeo-johnson
standardize确定是否应标准化数据。默认是 True
copy默认为True,以避免更改原始输入



三、实例实现

代码实现:

import numpy as np
import pandas as pd
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.naive_bayes import GaussianNB
df = pd.read_csv('./indian_liver_patient_dataset.csv')
df.isna().sum()
df['gender'] = LabelEncoder().fit_transform(df['gender'])
# 查看类别计数
print(df['class'].value_counts())


# 对数据进行简单的过采样
df_2 = df[df['class'] == 2]
df = pd.concat([df, df_2])
df = pd.concat([df, df_2])
print(df['class'].value_counts())


X = df.iloc[:, :-1]  # 特征列
Y = df.iloc[:, -1:].values.ravel()  # 目标列

# 直接划分训练集与测试集进行分类
X_train, X_test, y1_train, y1_test = train_test_split(X, Y, test_size=0.2, random_state=0)
gnb1 = GaussianNB()
gnb1.fit(X_train,y1_train)
pre = gnb1.predict(X_test)
pre = pre.astype(np.int64)
acc_score = round(accuracy_score(pre, y1_test), 4)
print('未进行正态化处理的准确率:{}'.format(acc_score))

# 对数据进行正态化处理
from sklearn.preprocessing import PowerTransformer
powerTransformer = PowerTransformer()
powerTransformer.fit(X)
px = powerTransformer.transform(X)
px_train, px_test, y2_train, y2_test = train_test_split(px, Y, test_size=0.2, random_state=0)

# 对正态化处理的数据进行分类
gnb2 = GaussianNB()
gnb2.fit(px_train,y2_train)
pre = gnb2.predict(px_test)
pre = pre.astype(np.int64)
acc_score = round(accuracy_score(pre, y2_test), 4)
print('进行正态化处理准确率:{}'.format(acc_score))

结果:

未进行正太化处理的准确率:0.6739
进行正太化处理的准确率:0.7065

         可以看到正态化后的特征构造高斯贝叶斯模型,比直接使用高斯贝叶斯模型效果要稍好一点。虽然在许多情况下,对数据进行正态化处理可以提高高斯贝叶斯模型的准确率,但这并不是绝对的。在数据分布偏斜较大、存在离群点或者不符合正态分布假设的情况下,进行正态化处理可能会降低模型的准确率。因此,在实际应用中还需预先分析数据特征。

 

### 处理机器学习回归任务中数据分布不均衡问题 在机器学习的回归任务中,当面对数据分布不均的情况时,可能会遇到诸如预测偏差增大、模型泛化能力下降等问题。为了有效应对这些问题,可以从以下几个方面着手: #### 1. 数据处理方法 - **重采样技术**:通过对少数类样本进行过采样或将多数类样本欠采样来平衡训练集中各类别的比例。然而需要注意的是,在回归场景下直接应用这些方法可能不合适,因为它们原本设计用于分类任务。一种改进方案是对目标变量按照一定区间分箱后再执行上述操作[^1]。 - **特征工程**:引入更多有助于区分不同水平响应值的新特性;尝试变换现有输入属性(如取对数),使原始非均匀分布变得更加接近正态分布或其他更易于建模的形式[^2]。 ```python import numpy as np from sklearn.preprocessing import PowerTransformer # 假设X为特征矩阵,y为目标向量 pt = PowerTransformer(method='yeo-johnson') y_transformed = pt.fit_transform(y.reshape(-1, 1)) ``` #### 2. 修改损失函数 针对特定应用场景定制化的定义新的评价指标以及相应的优化准则。例如采用绝对误差平均百分比(APE)代替传统的均方根误差(RMSE),这样可以减少极端大数值带来的负面影响;或者考虑加入L1/L2正则项约束以防止过拟合现象发生的同时缓解因某些区域密度较高而导致局部最优解的问题[^3]。 ```python from sklearn.linear_model import HuberRegressor huber_reg = HuberRegressor(epsilon=1.35) huber_reg.fit(X_train, y_train) # 使用Huber loss替代普通的平方loss ``` #### 3. 应用集成学习算法 利用Bagging或Boosting框架下的多种弱监督器组合而成的强大预测器往往能够更好地适应复杂多变的实际状况。特别是像Gradient Boosting Machines (GBMs), XGBoost这类基于决策树结构构建起来的方法,在处理偏斜严重的连续型输出上有显著优势[^4]。 ```python import xgboost as xgb dtrain = xgb.DMatrix(X_train, label=y_train) params = { 'objective': 'reg:squarederror', 'eval_metric': ['rmse', 'mae'] } bst = xgb.train(params=params, dtrain=dtrain, num_boost_round=100) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值