目录
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 |
红色 | 0 | 1 |
黄色 | 1 | 0 |
蓝色 | 1 | 1 |
在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]
需要注意的是,在进行卡方检验时需要注意一些潜在的问题,如样本量不足、频数过低等,需要进行特殊处理。此外,卡方检验只能用于处理分类数据,无法处理连续数据。
卡方检验在实际应用中有以下局限性:
样本量问题:卡方检验需要满足每个分类变量至少有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值。