数据归一化
一、理论知识
什么是数据归一化?
数据归一化是将不同范围的数据转换到同一个特定范围内的过程。这在机器学习中非常重要,因为:
-
消除量纲影响:不同特征可能有不同的单位和尺度(如身高可能是厘米,体重可能是千克),归一化可以消除这些差异。
-
加速模型训练:归一化后的数据可以加快梯度下降等优化算法的收敛速度。
-
提高模型性能:某些算法(如K近邻、支持向量机)对特征的尺度非常敏感,归一化可以提高这些算法的性能。
常见的归一化方法
-
最小-最大归一化(Min-Max Scaling):将数据线性变换到指定范围,通常是[0,1]或[-1,1]。
公式:$$X_{normalized} = (X - X_{min}) (X_{max} - X_{min}) (max_{range} - min_{range}) + min_{range}$$
-
标准化(Standardization):将数据转换为均值为0,标准差为1的正态分布。
公式:$$X_{standardized} = (X - μ) / σ$$
在本例中,我们使用的是最小-最大归一化方法。
首先我们看一下我们处理的数据文件dating.txt:
milage,Liters,Consumtime,target
40920,8.326976,0.953952,3
14488,7.153469,1.673904,2
26052,1.441871,0.805124,1
75136,13.147394,0.428964,1
38344,1.669788,0.134296,1
72993,10.141740,1.032955,1
35948,6.830792,1.213192,3
......
可以看到,milage的数值大到几万,而Consumtime小到零点几,为了消除量纲的影响,提高模型训练效率,我们在将这些数据投喂给机器学习模型进行训练之前,有必要对这些数据进行数据归一化,将不同范围的数据转换到同一个特定范围内。
二、代码详解
1. 导入必要的库
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
这里导入了两个库:
pandas
:用于数据处理和分析的库,提供了DataFrame等数据结构,可以用于加载和处理数据。MinMaxScaler
:scikit-learn库中的最小-最大归一化工具
2. 导入数据集
data = pd.read_csv(dating.txt)
print(data)
这段代码从文件dating.txt中读取数据,并将其存储在pandas的DataFrame对象中。然后打印出数据内容,以便我们查看原始数据的样子。
从提供的数据文件可以看出,这是一个约会相关的数据集,包含以下几列:
milage
:表示里程数Liters
:表示油耗(升)Consumtime
:表示消费时间target
:目标变量,某种分类。如1:乡下;2:集镇;3:跨城
3. 创建一个归一化转换器
transfer = MinMaxScaler(feature_range=(0, 10))
这行代码创建了一个MinMaxScaler对象,设置归一化的目标范围为0到10。
feature_range=(0, 10)
:指定归一化后的数据范围,这里是将所有数据映射到0到10之间
4. 应用归一化转换
minmax_data = transfer.fit_transform(data[['milage','Liters', 'Consumtime']])
print("经过归一化处理之后的数据为\n", minmax_data)
这段代码执行了两个步骤:
data[['milage','Liters', 'Consumtime']]
:从DataFrame中选择三个特征列transfer.fit_transform()
:对这些特征进行归一化处理fit
部分计算每个特征的最小值和最大值transform
部分应用归一化公式将数据转换到指定范围
最后,打印出归一化后的数据,可以看到所有值都被映射到了0到10的范围内。
三、小结
在这个例子中,我们对约会数据集中的三个特征进行了归一化处理:
-
原始数据中,这三个特征可能有不同的范围:
milage
可能是几千到几万的范围Liters
可能是个位数到十几的范围Consumtime
可能是0到几个小时的范围
-
通过归一化,我们将这三个特征都映射到了0到10的范围内,这样:
- 消除了不同特征之间的量纲差异
- 使得后续的机器学习算法能够公平地对待每个特征
- 避免了某些特征因为数值较大而主导模型的情况
-
归一化后的数据可以直接用于各种机器学习算法,如分类、聚类或回归分析
这种数据预处理是机器学习工作流程中的重要一步,能够显著提高模型的训练效率和预测性能。
四、完整代码
# 导入必要的库
from sklearn.preprocessing import MinMaxScaler
import pandas as pd # pandas用于数据处理和分析
# 从dating.txt文件中读取数据,并存储在pandas的DataFrame对象中
data = pd.read_csv("dating.txt")
# 打印原始数据,查看数据的基本情况
print("原始数据:")
print(data)
# 实例化一个最小-最大归一化转换器
# feature_range=(0, 10)表示要将数据映射到0到10之间
transfer = MinMaxScaler(feature_range=(0, 10))
# 选择'milage'、'Liters'和'Consumtime'三个特征列进行归一化
# fit_transform方法先计算每个特征的最小值和最大值,然后应用归一化公式
minmax_data = transfer.fit_transform(data[['milage', 'Liters', 'Consumtime']])
# 打印归一化后的数据
print("经过归一化处理之后的数据为:\n", minmax_data)
评论 (0)
暂无评论,来发表第一条评论吧!