二、数据变换:简单函数、标准化和特征工程

目录

1、简单函数变换

 1.1、对数变换

1.2、指数变换

1.3、平方根变换

1.4、倒数变换

1.5、正切变换

1.6、双曲正切变换

2、标准化

2.1、z-score标准化

2.2、最小-最大标准化

2.3、单位向量标准化

2.4、Normalization标准化

3、特征工程

3.1、分类变量处理

3.1.1、独热编码(One-Hot Encoding)

3.1.2、标签编码(Label Encoding)

 3.1.3、二进制编码(Binary Encoding)

 3.2、特征选择

3.2.1、相关性分析

 3.2.1.1、皮尔逊相关系数

3.2.1.2、斯皮尔曼相关系数

3.2.1.3、普通相关性矩阵

3.2.2、卡方检验

3.2.3、岭回归

3.2.4、L2正则化


1、简单函数变换

简单函数变换是指将原始数据进行某种函数变换,以便更好地适应模型的要求。常见的简单函数变换包括对数变换、指数变换、平方根变换等。

 1.1、对数变换

对数据取对数,以便将数据的分布从非正态分布转换为更接近正态分布的形式。

import numpy as np

# 构造一个包含随机数据的数组
data = np.random.rand(100)
print(data)

# 对数据进行对数变换
transformed_data = np.log(data)
print(transformed_data)

1.2、指数变换

对数据进行指数运算,以便将数据的分布从左偏分布转换为右偏分布的形式。

import numpy as np

# 构造一个包含随机数据的数组
data = np.random.rand(100)
print(data)

# 对数据进行指数变换
transformed_data = np.exp(data)
print(transformed_data)

1.3、平方根变换

对数据进行平方根运算,以便将数据的分布从右偏分布转换为左偏分布的形式。

import numpy as np

# 构造一个包含随机数据的数组
data = np.random.rand(100)
print(data)

# 对数据进行平方根变换
transformed_data = np.sqrt(data)
print(transformed_data)

1.4、倒数变换

对数据取倒数,以便将数据的分布从右偏分布转换为左偏分布的形式。

import numpy as np

# 构造一个包含随机数据的数组
data = np.random.rand(100)

# 对数据进行倒数变换
transformed_data = 1 / data

1.5、正切变换

对数据取正切,以便将数据的分布从非对称分布转换为更对称的形式。

需要注意的是,正切变换可能会将某些数据映射到负无穷大或正无穷大,因此在使用时需要加以处理。

import numpy as np

# 构造一个包含随机数据的数组
data = np.random.rand(100)

# 对数据进行正切变换
transformed_data = np.tan(data)

1.6、双曲正切变换

对数据取双曲正切,以便将数据的分布从非对称分布转换为更对称的形式。

与正切变换类似,双曲正切变换也可能会将某些数据映射到负无穷大或正无穷大,需要加以处理。

import numpy as np

# 构造一个包含随机数据的数组
data = np.random.rand(100)

# 对数据进行双曲正切变换
transformed_data = np.tanh(data)

2、标准化

标准化是指将不同尺度的数据转换为相同的尺度,以便更好地进行比较。常见的标准化方法包括z-score标准化、最小-最大标准化和单位向量标准化。

需要注意,在标准化过程中可能会出现除以0的情况,需要进行特殊处理。

2.1、z-score标准化

z-score标准化适用于原始数据的分布近似为正态分布的情况。

z-score标准化是指将数据减去均值,再除以标准差,使得数据的均值为0,标准差为1。

import numpy as np

# 构造一个包含随机数据的数组
data = np.random.rand(100)
print(data)

# 对数据进行z-score标准化
mean = np.mean(data)
std = np.std(data)
transformed_data = (data - mean) / std
print(transformed_data)

2.2、最小-最大标准化

最大最小标准化(Min-Max Scaling)适用于数据分布没有明显边界的情况,即数据分布在一定范围内,但没有固定的上下限。在这种情况下,最大最小标准化可以将数据映射到固定的区间内,以便进行比较和分析。

最小-最大标准化是指将数据减去最小值,再除以最大值和最小值之差,使得数据的最小值为0,最大值为1。

import numpy as np

# 构造一个包含随机数据的数组
data = np.random.rand(100)

# 对数据进行最小-最大标准化
min_val = np.min(data)
max_val = np.max(data)
transformed_data = (data - min_val) / (max_val - min_val)

2.3、单位向量标准化

单位向量标准化 (Unit Vector Scaling) 适用于需要计算向量之间的相似度或距离的情况。

单位向量标准化是指将数据除以其范数,使得数据的范数为1。

import numpy as np

# 构造一个包含随机数据的数组
data = np.random.rand(100)

# 对数据进行单位向量标准化
norm = np.linalg.norm(data)
transformed_data = data / norm

2.4、Normalization标准化

标准化(Normalization)是将数据除以其范数(Norm),使得数据的范数为1的一种方法。

具体来说,对于一个n维向量x,标准化后的向量y为:

y = x / ||x||

其中,||x||是向量x的范数,可以是欧几里得范数(Euclidean Norm)或其他范数。欧几里得范数是指向量各元素平方和的平方根,即:

||x|| = sqrt(x1^2 + x2^2 + ... + xn^2)

标准化后的向量y的范数为1,可以看作是原始向量在单位球面上的投影。标准化可以消除数据的缩放影响,使得不同维度的数据具有相同的重要性,便于进行比较和分析。

需要注意的是,标准化可能会改变数据的分布,因此需要根据具体情况进行选择。如果数据分布不均匀,可以考虑使用其他的标准化方法。

import numpy as np

# 构造一个包含随机数据的数组
data = np.random.rand(100)

# 对数据进行标准化
norm = np.linalg.norm(data)
normalized_data = data / norm

需要注意的是,如果数据是一个矩阵,可以使用axis参数指定在哪个轴上计算范数。例如,对于一个n行m列的矩阵X,可以使用以下代码对每一列进行标准化:

import numpy as np

# 构造一个包含随机数据的矩阵
data = np.random.rand(100, 10)

# 对每一列进行标准化
norms = np.linalg.norm(data, axis=0)
normalized_data = data / norms

3、特征工程

3.1、分类变量处理

3.1.1、独热编码(One-Hot Encoding)

将每个分类变量转换为一个二进制向量,其中只有一个元素为1,其余元素为0。例如,对于一个包含三个不同颜色的汽车的数据集,可以将颜色变量编码为三个二进制向量,如下所示:

颜色转换后的编码
红色1        0        0
黄色0        1        0
蓝色0        0        1

在Python中,可以使用pandas库的get_dummies()函数进行独热编码:

import pandas as pd

df = pd.DataFrame({'颜色': ['红色', '黄色', '蓝色']})
df_encoded = pd.get_dummies(df)

print(df_encoded)

3.1.2、标签编码(Label Encoding)

将每个分类变量映射到一个整数值,从而将分类变量转换为数值变量。例如,对于一个包含三个不同颜色的汽车的数据集,可以将颜色变量编码为三个整数值,如下所示:

颜色转换后的编码
红色1
黄色2
蓝色3

在Python中,可以使用scikit-learn库的LabelEncoder类进行标签编码:

import pandas as pd

data = {'color': ['红色', '黄色', '蓝色']}
df = pd.DataFrame(data)

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
df['颜色'] = le.fit_transform(df['color'])

print(df)

 3.1.3、二进制编码(Binary Encoding)

将每个分类变量转换为一个二进制码,其中每个位表示一种取值。例如,对于一个包含三个不同颜色的汽车的数据集,可以将颜色变量编码为两个二进制码,如下所示:

颜色转换后的编码1转换后的编码2
红色01
黄色10
蓝色11

 在Python中,可以使用category_encoders库的BinaryEncoder类进行二进制编码:

import pandas as pd
import category_encoders as ce

data = {'color': ['红色', '黄色', '蓝色']}
df = pd.DataFrame(data)

encoder = ce.BinaryEncoder(cols=['color'])
df_encoded = encoder.fit_transform(df)

print(df_encoded)

 3.2、特征选择

3.2.1、相关性分析

通过计算特征与目标变量之间的相关系数或相关性矩阵,来评估每个特征与目标变量之间的关联程度。通常选择与目标变量相关性较高的特征作为重要特征。

 3.2.1.1、皮尔逊相关系数
import pandas as pd

# 读取数据集
data = pd.read_csv('data.csv')

# 计算皮尔逊相关系数
corr_matrix = data.corr(method='pearson')

# 查看与目标变量相关性最高的k个特征
k = 10
corr_matrix.nlargest(k, 'target')['target']
3.2.1.2、斯皮尔曼相关系数
import pandas as pd
import numpy as np

# 读取数据集
data = pd.read_csv('data.csv')

# 计算斯皮尔曼相关系数
corr_matrix = data.corr(method='spearman')

# 查看与目标变量相关性最高的k个特征
k = 10
corr_matrix.nlargest(k, 'target')['target']
3.2.1.3、普通相关性矩阵
import pandas as pd

# 读取数据集
data = pd.read_csv('data.csv')

# 计算相关性矩阵
corr_matrix = data.corr()

# 查看与目标变量相关性最高的k个特征
k = 10
corr_matrix.nlargest(k, 'target')['target']

3.2.2、卡方检验

卡方检验(Chi-Square Test)是一种用于统计分析分类数据的方法,用于评估两个分类变量之间的关联程度。卡方检验的原理是比较实际观测值和理论预期值之间的差异,从而判断两个变量之间是否存在显著关联。

import pandas as pd
from scipy.stats import chi2_contingency

# 读取数据集
data = pd.read_csv('data.csv')

# 将特征和目标变量分开
X = data.iloc[:, :-1]
y = data.iloc[:, -1]

# 使用卡方检验进行特征选择
# 在这里,选择与目标变量相关性最高的10个特征
k = 10
corr_list = []
for col in X.columns:
    contingency_table = pd.crosstab(X[col], y)
    stat, p_value, dof, expected = chi2_contingency(contingency_table)
    corr_list.append((col, p_value))
corr_list = sorted(corr_list, key=lambda x: x[1])
selected_features = [x[0] for x in corr_list[:k]]
X_new = X[selected_features]

需要注意的是,在进行卡方检验时需要注意一些潜在的问题,如样本量不足、频数过低等,需要进行特殊处理。此外,卡方检验只能用于处理分类数据,无法处理连续数据。

卡方检验在实际应用中有以下局限性:

  1. 样本量问题:卡方检验需要满足每个分类变量至少有5个观测值的要求,否则结果可能不可靠。如果样本量过小,卡方检验的结果可能不准确。

  2. 数据类型问题:卡方检验只能用于处理分类数据,无法处理连续数据。如果变量类型不是分类变量,卡方检验的结果可能不正确。

  3. 期望频数问题:卡方检验的结果依赖于期望频数的计算,如果期望频数过低,卡方检验的结果可能不可靠。

  4. 多重比较问题:如果进行多次卡方检验,可能会出现多重比较问题,导致错误发生率增加。

  5. 偏差问题:卡方检验的结果可能受到样本选择偏差的影响,因此需要进行特殊处理或者使用其他方法来处理偏差问题。

3.2.3、岭回归

岭回归是一种常用的线性回归方法,用于解决多重共线性问题。在岭回归中,通过引入L2正则化项来惩罚模型的复杂度,从而降低模型的方差,提高模型的泛化能力。具体来说,岭回归是将模型的损失函数中的平方和误差项加上L2正则化项,

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error

# 读取数据集并进行预处理
data = pd.read_csv('data.csv')
X = data.iloc[:, :-1]
y = data.iloc[:, -1]
# 对特征进行标准化处理
X = (X - X.mean()) / X.std()

# 将数据集分成训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 定义岭回归模型并进行训练
alpha = 1.0  # 正则化参数
ridge = Ridge(alpha=alpha)
ridge.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = ridge.predict(X_test)

# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print('MSE:', mse)

# 输出模型系数
coef = pd.Series(ridge.coef_, index=X.columns)
print('Coefficients:')
print(coef)

# 输出截距项
print('Intercept:', ridge.intercept_)

3.2.4、L2正则化

L2正则化是一种常用的正则化方法,也被称为岭回归(Ridge Regression)。在岭回归中,通过引入L2正则化项,对模型进行正则化,从而减少模型的复杂度,避免过拟合。

L2正则化的具体形式是将模型的损失函数中的平方和误差项加上L2正则化项。

在Python中,可以使用scikit-learn库中的Ridge类来实现L2正则化。以下是一个简单的示例代码:

from sklearn.linear_model import Ridge

# 定义岭回归模型并进行训练
alpha = 1.0  # 正则化参数
ridge = Ridge(alpha=alpha)
ridge.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = ridge.predict(X_test)

在这个示例代码中,我们首先定义了一个岭回归模型,并设置正则化参数为1.0,然后在训练集上进行训练。最后,我们在测试集上进行预测。需要注意的是,正则化参数的选择需要根据具体情况进行调优,以获得最优的模型效果。

波士顿房价样例:

from sklearn.linear_model import Ridge
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler

# 加载波士顿房价数据集
boston = load_boston()
X = boston.data
y = boston.target

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 对数据进行标准化处理
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 创建Ridge回归模型
ridge = Ridge(alpha=0.1)

# 在训练集上训练模型
ridge.fit(X_train, y_train)

# 在测试集上评估模型
y_pred = ridge.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print("MSE: ", mse)

在这个例子中,我们首先加载了波士顿房价数据集,并将其分为训练集和测试集。然后,我们使用StandardScaler类对数据进行标准化处理,以便更好地应用L2正则化。接着,我们使用scikit-learn库中的Ridge类创建了一个L2正则化的线性回归模型,其中alpha参数控制正则化的强度。在训练集上训练模型后,我们使用测试集评估了模型的性能,并计算了均方误差(MSE)作为评估指标。

需要注意的是,L2正则化的效果取决于alpha参数的值,如果alpha值太小,则可能无法有效地减少过拟合,如果alpha值太大,则可能会导致欠拟合。因此,在实际应用中,我们需要根据具体情况选择合适的alpha值。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值