数据预处理流程(Pipeline):
- 读数据
- 处理缺失数据
- 解析分类数据
- 数据集拆分
- 特征缩放
1. 导入库
import numpy as np
import pandas as pd
2. 读数据(通常为csv文件)
# pd.read_csv()返回类型为DataFrame
dataset = pd.read_csv('data.csv')
# .iloc进行按位置序号索引,此处数据为二维,.values可将其转化成numpy数组
X = dataset.iloc[:, :-1].values
Y = dataset.iloc[:, -1].values
3. 处理丢失数据(nan,此处X中存在nan):
利用sklearn.impute库中
的SimpleImputer
from sklearn.impute import SimpleImputer
'''
参数及默认,mean意为以该列平均值进行填充
SimpleImputer(missing_values=nan, strategy='mean',fill_value=None,verbose=0,copy=True,add_indicator=False)
使用方法:定义、fit、transfrom
'''
# strategy默认为mean,即用平均值进行替换,此外还有:median, most_frequent, constant
imputer_mean = SimpleImputer(strategy='mean', axis=0)
imputer = imputer_mean.fit(X[:, 1:]) # 只能接受数值型数据,根据数据fit出应该填充的数据
X[:, 1:3] = imputer.transform(X[:, 1:]) # 进行填充
4. 解析分类数据
对于分类结果,源数据常常为Yes或No,不适应计算,应将其转化为数字1或0,另外数据的部分输入属性也非数据,可转化成数据
利用sklearn.preprocessing
的LabelEncoder, OneHotEncoder
from sklearn.preprocessing import LabelEncoder
le_y = LabelEncoder()
Y = le_y.fit_transform(Y) # fit_transform将fit和transform两操作结合起来
'''
原本Y为
['No', 'Yes', 'No', 'No', 'Yes', 'Yes', 'No', 'Yes', 'No', 'Yes']
转换后为
[0, 1, 0, 0, 1, 1, 0, 1, 0, 1]
LabelEncoder().classes_保存着两者的对应表,此处的le_y.classes_为 ['No', 'Yes']
'''
5. 数据集拆分(成测试集和训练集)
利用sklearn.model_selection
的train_test_split()
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)
# test_size用于设置拆分比例,0.2即20%的训练集,可增加参数shuffle,用于设置拆分前是否对数据进行混洗,默认为True,random_state设置随机数种子
6. 特征缩放
不同特征在幅度、、取值范围、单位上变化很大。计算距离时,高幅度的特征比低幅度的特征占据更大权重。
6.1 标准正态缩放
将数据缩放为均值为0,方差为1
from sklearn.preprocessing import scale
X_scale = scale(X_train)
6.2 标准缩放
使得数据集具有相同的均值和方差。经过fit
之后可以记住训练数据的均值和方差,然后通过transform
将其它数据也缩放为具有相同均值和方差的数。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)
6.3 区间缩放
将数据缩放到固定区间之类可采用MinMaxScaler