在构建模型前要对数据进行预处理。数据转换是这个过程中最重要的任务之一,在数据集中,大多数时候存在不同大小、不同量纲的数据,为了更好的预测,此时就需要将不同的特征缩小到相同的幅度范围或某些特定的数据分布上
1. 什么情况下使用数据转换
- 不同特征的量纲差异大: 如果数据集中的不同特征具有不同的量纲(单位),则可能需要进行尺度变换,以消除这种差异,这样做有助于确保模型能够平衡地对待各个特征,而不是偏向于具有较大范围的特征
- 特征之间相关性强: 如果数据中存在高度相关的特征,可能需要对特征进行变换或组合,以减少多重共线性的影响。通过特征变换,可以减少特征之间的相关性,从而提高模型的稳定性和泛化能
- 数据分布偏斜: 如果数据不符合模型的假设(如线性回归假设数据服从正态分布),或者数据分布存在偏斜(如长尾分布),则可能需要对数据进行分布变换,以使其更符合模型的要求
- 异常值存在: 如果数据集中存在异常值,可能需要对数据进行异常值处理,以减少异常值对模型的影响。这可以通过数据变换或异常值检测方法来实现
- 模型对特征的要求: 某些模型对数据的要求比较严格,例如支持向量机(SVM)对特征的尺度敏感,神经网络对数据的分布敏感。在这种情况下,数据变换可以帮助满足模型的要求,提高模型的性能
2. 什么情况下不使用数据转换
不使用数据变换通常是在数据已经具有适合模型的尺度和分布、模型(如决策树等树形模型)不敏感于数据的尺度和分布、数据已经经过了必要的预处理、数据变换可能引入误差或丢失信息、数据量较小或任务较简单等情况下。在这些情况下,直接使用原始数据可能更为合适
3. 各种数据转换方法
3.1 标准化(Standardization)
3.1.1 标准化(Standardization) 公式及作用
标准化(Standardization)是一种常见的数据变换方法,它将数据转换为均值为0,标准差为1的标准正态分布,其公式如下:
其中 是原始数据集, 原始数据的均值, 是原始数据的标准差, 是标准化后的数据
标准化的主要作用是消除特征之间的量纲差异,提高模型的收敛速度,改善模型的性能,以及使得数据更易于解释
3.1.2 标准化(Standardization)代码实现
from sklearn.preprocessing import StandardScaler
import numpy as np
# 原始数据
data = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 创建StandardScaler对象
scaler = StandardScaler()
# 对数据进行标准化
standardized_data = scaler.fit_transform(data)
print("原始数据:\n", data)
print("标准化后的数据:\n", standardized_data)
3.2 归一化(Normalization)
3.2.1 归一化(Normalization) 公式及作用
归一化(Normalization)是一种常见的数据变换方法,其主要目的是将数据缩放到一个特定的范围内,通常是[0, 1]或[-1, 1],归一化的公式可以表示为:
其中
是原始数据集, 是数据最小值, 是数据最大值, 是归一化后的数据
归一化的主要作用是消除特征之间的量纲差异,提高模型的稳定性和收敛速度,以及改善模型的性能
3.2.2 归一化(Normalization) 代码实现
from sklearn.preprocessing import MinMaxScaler
import numpy as np
# 原始数据
data = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 创建 MinMaxScaler 对象
scaler = MinMaxScaler()
# 对数据进行归一化
normalized_data = scaler.fit_transform(data)
print("原始数据:\n", data)
print("归一化后的数据:\n", normalized_data)
在这里可以通过 feature_range 参数指定自定义的范围
# 创建 MinMaxScaler 对象,并指定自定义的范围为 [-1, 1]
scaler = MinMaxScaler(feature_range=(-1, 1))
3.3 Robust Scaler
3.3.1 Robust Scaler 公式及作用
Robust Scaler是一种用于数据缩放的方法,它使用中位数和四分位数而不是均值和方差,因此更适合处理存在异常值的数据,它的公式如下:
其中
是原始数据集, 是数据的第一个四分位数, 是数据的第三个四分位数, 是Robust Scaler缩放后的数据
Robust Scaler的主要特点是对存在异常值的数据具有鲁棒性的数据缩放方法且适用于非正态分布的数据(使用四分位数),还可以消除特征间的量纲差异,并提高模型的稳定性和泛化能力
3.3.2 Robust Scaler 代码实现
from sklearn.preprocessing import RobustScaler
import numpy as np
# 原始数据
data = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 创建 RobustScaler 对象
scaler = RobustScaler()
# 对数据进行 Robust 缩放
scaled_data = scaler.fit_transform(data)
print("原始数据:\n", data)
print("Robust 缩放后的数据:\n", scaled_data)
3.4 对数转换
3.4.1 对数转换 公式及作用
对数转换是一种常见的数据变换方法,它将原始数据应用对数函数进行转换,其公式如下:
其中 是原始数据, 是转换后的数据
对数转换的作用是降低数据的偏度(接近于正态分布)、减少异常值的影响、线性化关系,并使得数据更易于处理和建模
3.4.2 对数转换 代码实现
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
import warnings
# 忽略警告
warnings.filterwarnings("ignore")
# 生成偏斜的数据,使用对数转换后更加符合正态分布
np.random.seed(0)
data_skewed = np.random.gamma(shape=2, scale=2, size=1000) # 生成偏斜数据,使用 gamma 分布
# 绘制偏斜数据的正态分布图和 Q-Q 图
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
stats.probplot(data_skewed, dist="norm", plot=plt)
plt.title('Normal Distribution Plot (Skewed)')
plt.subplot(1, 2, 2)
plt.hist(data_skewed, bins=30, density=True, alpha=0.6, color='g')
plt.title('Histogram of Skewed Data')
plt.show()
# 对数据进行对数转换
data_log_skewed = np.log(data_skewed + 1) # 加1是为了避免对数变换中的零值
# 绘制转换后的数据的正态分布图和 Q-Q 图
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
stats.probplot(data_log_skewed, dist="norm", plot=plt)
plt.title('Normal Distribution Plot (Log Transformed)')
plt.subplot(1, 2, 2)
plt.hist(data_log_skewed, bins=30, density=True, alpha=0.6, color='b')
plt.title('Histogram of Log Transformed Skewed Data')
plt.show()
代码生成了一个偏斜的数据集,使用了 Gamma 分布来产生这个数据集。然后对这个偏斜数据进行了对数转换,并绘制了转换后数据的正态分布图和 Q-Q 图,可以发现经过对数转换后降低了原始数据的偏度,使得数据更接近于正态分布
对数还原为原始数据
np.exp(data\_log\_skewed) - 1 # 减1是为了还原对数转换前的数据
3.5 倒数转换
3.5.1 倒数 转换 公式及作用
倒数转换是一种数据变换方法,它将数据应用倒数函数进行转换,其公式如下:
其中
是原始数据,
是 转换后的数据
倒数转换的作用是减小数据的幅度、调整数据分布、降低数据间的相关性,并强调较小的数值
3.5.2 倒数 转换 代码实现
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
import warnings
# 忽略警告
warnings.filterwarnings("ignore")
# 生成偏斜的数据,使用对数转换后更加符合正态分布
np.random.seed(0)
data_skewed = np.random.gamma(shape=2, scale=2, size=1000) # 生成偏斜数据,使用 gamma 分布
# 绘制偏斜数据的正态分布图和 Q-Q 图
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
stats.probplot(data_skewed, dist="norm", plot=plt)
plt.title('Normal Distribution Plot (Skewed)')
plt.subplot(1, 2, 2)
plt.hist(data_skewed, bins=30, density=True, alpha=0.6, color='g')
plt.title('Histogram of Skewed Data')
plt.show()
# 对数据进行倒数转换
data_reciprocal = 1 / data_skewed
# 绘制倒数转换后的数据的正态分布图和 Q-Q 图
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
stats.probplot(data_reciprocal, dist="norm", plot=plt)
plt.title('Normal Distribution Plot (Reciprocal Transformed)')
plt.subplot(1, 2, 2)
plt.hist(data_reciprocal, bins=30, density=True, alpha=0.6, color='r')
plt.title('Histogram of Reciprocal Transformed Data')
plt.show()
3.6 平方根转换
3.6.1 平方根转换 公式及作用
平方根转换是一种常见的数据变换方法,它将原始数据应用平方根函数进行转换,其公式如下:
其中
是原始数据,
是 转换后的数据
平方根转换的作用是降低数据的幅度、调整数据分布、减小数据间的相关性,并强调较小的数值(平方根转换可能更适用于数据分布较为对称的情况,而倒数转换可能更适用于需要降低数据幅度且数据分布不对称的情况)
3.6.2 平方根转换 代码实现
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
import warnings
# 忽略警告
warnings.filterwarnings("ignore")
# 生成偏斜的数据,使用对数转换后更加符合正态分布
np.random.seed(0)
data_skewed = np.random.gamma(shape=2, scale=2, size=1000) # 生成偏斜数据,使用 gamma 分布
# 绘制偏斜数据的正态分布图和 Q-Q 图
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
stats.probplot(data_skewed, dist="norm", plot=plt)
plt.title('Normal Distribution Plot (Skewed)')
plt.subplot(1, 2, 2)
plt.hist(data_skewed, bins=30, density=True, alpha=0.6, color='g')
plt.title('Histogram of Skewed Data')
plt.show()
# 对数据进行平方根转换
data_sqrt = np.sqrt(data_skewed)
# 绘制平方根转换后的数据的正态分布图和 Q-Q 图
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
stats.probplot(data_sqrt, dist="norm", plot=plt)
plt.title('Normal Distribution Plot (Square Root Transformed)')
plt.subplot(1, 2, 2)
plt.hist(data_sqrt, bins=30, density=True, alpha=0.6, color='y')
plt.title('Histogram of Square Root Transformed Data')
plt.show()
3.7 Box Cox转换
3.7.1 Box Cox转换 公式及作用
Box-Cox 转换是一种用于处理数据的方法,它可以使数据更加接近正态分布,Box-Cox 转换的公式如下:
其中
是原始数据,
是 转换后的数据, 是转换参数(可以通过最大似然估计自动确定最适合的参数 )
Box-Cox 转换可以将数据调整为更接近正态分布的形式,以满足统计分析的假设,并提高数据的稳定性和准确性
3.7.2 Box Cox转换 代码实现
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
import warnings
# 忽略警告
warnings.filterwarnings("ignore")
# 生成偏斜的数据,使用对数转换后更加符合正态分布
np.random.seed(0)
data_skewed = np.random.gamma(shape=2, scale=2, size=1000) # 生成偏斜数据,使用 gamma 分布
# 绘制偏斜数据的正态分布图和 Q-Q 图
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
stats.probplot(data_skewed, dist="norm", plot=plt)
plt.title('Normal Distribution Plot (Skewed)')
plt.subplot(1, 2, 2)
plt.hist(data_skewed, bins=30, density=True, alpha=0.6, color='g')
plt.title('Histogram of Skewed Data')
plt.show()
# 进行 Box-Cox 转换
data_boxcox, _ = stats.boxcox(data_skewed)
# 绘制 Box-Cox 转换后的数据的正态分布图和 Q-Q 图
plt.figure(figsize=(10, 4))
plt.subplot(1, 2, 1)
stats.probplot(data_boxcox, dist="norm", plot=plt)
plt.title('Normal Distribution Plot (Box-Cox Transformed)')
plt.subplot(1, 2, 2)
plt.hist(data_boxcox, bins=30, density=True, alpha=0.6, color='k')
plt.title('Histogram of Box-Cox Transformed Data')
plt.show()
Box-Cox 转换是一个单向转换,不能直接将转换后的数据还原回原始数据,因为转换过程中丢失了信息。如果需要将转换后的数据还原回原始数据,可以尝试反向转换,但这需要知道转换时使用的参数 ,由于 Box-Cox 转换的参数通常是通过最大似然估计确定的,因此在实际应用中很难得到确切的参数值,因此,一般情况下不能直接将 Box-Cox 转换后的数据还原回原始数据
4. 总结
通过各种数据转换,可以消除数据量纲影响,调整数据的分布形态,减小数据的偏度,稳定数据的方差,使数据更加接近于正态分布,以满足统计分析的假设,提高模型的稳定性和准确性。这些转换方法包括标准化、归一化、对数转换、倒数转换、平方根转换、Box-Cox 转换等,它们各有特点,适用于不同类型的数据和不同的分析目的。但需要注意的是,在应用这些转换方法时,需要考虑数据的特点,选择合适的转换方法,并在转换后进行适当的验证和解释,以确保数据转换的有效性和合理性,另外要说明的一点是,这些转换不仅仅适用于特征,对于回归来说我们还可以将其应用到目标中来获得更好的表现,当然需要使用的方法最后能进行还原回原始数据
5. 往期推荐
特征选择(嵌入法)—— 递归特征消除 RFE、 RFE-CV
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
