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