概述
数据预处理就是处理从数据中检测,纠正或删除损坏,不准确或不适用模型的记录的过程。 可能面对的问题有:数据类型不同,比如有的是文字,有的是数字,有的含时间序列,有的连续,有的间断,也有可能数据的质量不行,存在噪声,有异常,有缺失等。 数据预处理的目的就是让数据适应模型,匹配模型的需求。
特征工程是将原始数据转换为更能代表预测模型的潜在问题的特征的过程,可以通过挑选最相关的特征,提取特征以及创造特征来实现。其中创造特征又经常以降维算法的方式实现。 可能面对的问题有:特征之间有相关性,特征和标签无关,特征太多或太小,或者干脆就无法表现出应有的数据现象或无法展示数据的真实面貌。 特征工程的目的:1) 降低计算成本,2) 提升模型上限
数据预处理Preprocessing 和Impute
-
数据无量纲化 在实践中,将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的数据的需求就是数据无量纲化。 数据的无量纲化可以是线性的也可以是非线性的。线性的包括中心化处理和缩放处理。中心化的本质就是让所有记录减去一个固定值,即让数据平移到某个位置。缩放的本质是通过除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理。 -
preprocessing.MinMaxScaler 数据x按照最小值中心化后,再按极差(最大值-最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间,这个过程叫做数据归一化(Normallization)。归一化不是正则化。 在sklearn中,使用preprocessing.MinMaxScaler来实现归一化。MinMaxScaler的参数feature_range控制归一化的范围,默认是[0,1]. 相关代码即注释:
from sklearn.preprocessing import MinMaxScaler
import numpy as np
import pandas as pd
data = [[-1,2],[-0.5,6],[0,10],[1,18]]
scaler = MinMaxScaler()
scaler = scaler.fit(data)
result = scaler.transform(data)
scaler.inverse_transform(result)
scaler = MinMaxScaler(feature_range=[5,10])
result = scaler.fit_transform(data)
X = np.array(data)
X_nor = (X - X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))
X_nor
- 数据标准化preprocessing.StandardScaler
当数据按均值中心化后再按标准差缩放,数据就会服从均值为0,方差为1的正态分布,这个过程叫数据标准化。transform时缺失值忽略,之后还是缺失值,且导入数据是一维以上的。 相关代码操作和上边的类似
from sklearn.preprocessing import StandardScaler
standard = StandardScaler()
standard.fit(data)
standard.mean_
standard.var_
result = standard.transform(data)
standard.fit_transform(data)
standard.inverse_transform(result)
其他参数列表:
缺失值处理
用imput.SimpleImputer来填补缺失值,相关参数如下:
参数 | 含义和输入 |
---|
missing_values | 告诉数据中的缺失值长什么样,默认是np.nan | strategy | 填补缺失值的策略,默认均值。输入”mean“使用均值填补;输入”median“用中值填补;输入”most_frequent“用众数填补;输入”constant"用fill_value的值填补 | copy | 默认是True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。 |
一些代码操作:
from sklearn.impute import SimpleImputer
data = pd.read_csv("C:\\Users\\22003\\Desktop\\Narrativedata.csv",index_col=0)
Age = data.loc[:,'Age'].values.reshape(-1,1)
imp_mean = SimpleImputer()
imp_median = SimpleImputer(strategy='median')
imp_0 = SimpleImputer(strategy='constant',fill_value=0)
imp_mean = imp_mean.fit_transform(Age)
imp_median1 = imp_median.fit_transform(Age)
imp_0 = imp_0.fit_transform(Age)
data_ = pd.read_csv("C:\\Users\\22003\\Desktop\\Narrativedata.csv",index_col=0)
data_.loc[:,'Age'] = data_.loc[:,'Age'].fillna(data_.loc[:,'Age'].median())
data_.dropna(axis=0,inplace=True)
编码与哑变量
在机器学习算法中,大多数模型都只能处理数值型数据,然而有些训练数据含有文字信息,就需要将文字型数据转换成数值型数据,就是对数据进行编码。
-
preprocessing.LabelEncoder,将标签转换为数值 y = data.iloc[:,-1]
le = LabelEncoder()
le = le.fit(y)
label = le.transform(y)
le.classes_
data.iloc[:,-1] = label
-
preprocessing.OrdinalEncoder,为特征编码 from sklearn.preprocessing import OrdinalEncoder
oe = OrdinalEncoder()
data.iloc[:1:-1] = oe.fit_transform(data.iloc[:1:-1])
-
preprocessing.OneHotEncoder ,独热编码,创建哑变量 当变量是相互独立的时候,不能用0,1,2这种有大小关系的编码表示,可以用[0,0,1],[0,1,0],[1,0,0]这样的哑变量来表示 from sklearn.preprocessing import OneHotEncoder
X = data_.iloc[:,1:-1]
enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()
enc.get_feature_names()
连续数据处理:二值化与分段
- sklearn.prepricessing.Binarizer
根据阈值将数据二值化(将特征值设置为0和1),用于处理连续型变量。大于阈值的值映射为1,小于的映射为0.二值化常对文本计数数据使用,还可以用作考虑布尔随机变量的估计器的预处理步骤。
参数 | 含义 |
---|
threshold | 阈值 | 其他参数 | 和前边用到的基本相同 |
- preprocessing.KBinsDiscretizer
将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码。 重要参数:
参数 | 含义 |
---|
n_bins | 每个特征中分箱的个数,默认5,一次被运用到所有导入的特征 | encode | 编码的方式,默认“onehot” ;“onehot”:做哑变量,之后返回一个稀疏矩阵,每一列是一个特征中的一个类别,含有该类别的样本表示为1,不含的表示为0 ;“ordinal”:每个特征的每个箱都被编码为一个整数,返回每一列是一个特征,每个特征下含有不同整数编码的箱的矩阵;“onehot-dense”:做哑变量,之后返回一个密集数组。 | strategy | 用来定义箱宽的方式,默认"quantile" ;“uniform”:表示等宽分箱,即每个特征中的每个箱的最大值之间的差为(特征.max() - 特征.min())/(n_bins) ;“quantile”:表示等位分箱,即每个特征中的每个箱内的样本数量都相同;“kmeans”:表示按聚类分箱,每个箱中的值到最近的一维k均值聚类的簇心得距离都相同 |
|