BLOG

个人博客,记录学习与生活

数据预处理

Published Dec. 1, 2019, 10:53 p.m. by kkk

数据预处理流程(Pipeline):

  • 读数据
  • 处理缺失数据
  • 解析分类数据
  • 数据集拆分
  • 特征缩放

导入库

import numpy as np
import pandas as pd

读数据(通常为csv文件)

dataset = pd.read_csv('data.csv')
# pd.read_csv()返回类型为DataFrame,默认增加的行索引
X = dataset.iloc[:, :-1].values
# .iloc进行按位置序号索引,此处数据为二维,.values可将其转化成ndarray(即矩阵或者向量)
Y = dataset.iloc[:, -1].values

处理丢失数据(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
'''
imputer_mean = SimpleImputer() # 默认值即可
imputer = imputer_mean.fit(X[:, 1:]) # 只能接受数值型数据,根据数据fit出应该填充的数据
X[:, 1:3] = imputer.transform(X[:, 1:]) # 进行填充

解析分类数据

对于分类结果,源数据常常为Yes或No,不适应计算,应将其转化为数字1或0,另外数据的部分输入属性也非数据,可转化成数据

利用sklearn.preprocessingLabelEncoder, 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']
'''

数据集拆分(成测试集和训练集)

利用sklearn.model_selectiontrain_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设置随机数种子

特征缩放

不同特征在幅度、取值范围、单位上变化很大。计算距离时,高幅度的特征比低幅度的特征占据更大权重。可通过特征标准化或Z值归一化进行处理,下面采用标准特征化(即让各个特征取值大小差不多)。

from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.fit_transform(X_test)

Share this post
< Pre: 方差分析 Pos: 一元线性回归 >
No comments
Similar posts
Add a new comment