1. 数据挖掘五大流程
数据挖掘有4大步骤,分别为
- 获取数据
- 数据预处理
- 特征工程
-
建模
其中特征工程是指将原始数据转换为更能代表预测模型的潜在问题的特征的过程,通过挑选特征、提取特征以及创造特征来实现。其中创造特征又经常以降维算法的方式实现。
下面总结下特征工程的知识点以及相关代码
2. sklearn的数据预处理和特征工程
2.1 数据无量纲化
将不同规格的数据转换到同一量纲范围
数据的无量纲化可以是线性的,也可以是非线性的,线性的无量纲化包括中心化处理和缩放处理。中心化的本质是让所有记录减去一个固定值,让数据样本数据平移到某个位置。缩放的本质是除以一个固定值,将数据固定在某个范围之中,取对数也算是一种缩放处理
2.1.1 sklearn中的归一化
processing.MinMaxScaler的使用
当数据按照最小值中心化后,再按极差(最大值 - 最小值)缩放,数据移动了最小值个单位,并且会被收敛到[0,1]之间,而这个过程,就叫做数据归一化Normalization。
x_ = (x - min(x)) / (max(x) - min(x))在sklearn中,我们使用preprocessing.MinMaxScaler实现这个功能,MinMaxScaler有一个重要参数feature_range,控制我们需要把数据压缩到的范围,默认是[0,1]
2.1.2 代码示例
from sklearn.preprocessing import MinMaxScaler # 导入MinMaxScaler
import pandas as pd
data = [[5,6],[-4,6],[10,1],[-1,1.8]]
pd.DataFrame(data)
# 实现归一化
scaler = MinMaxScaler() # 实例化
result_ = scaler.fit_transform(data) # fit 本质是生成min(x)和max(x) 通过trensform接口导出结果
# 数据归一化到[5,10]
scaler = MinMaxScaler(feature_range=[5,10])
result = scaler.fit_transform(data) # 训练和导出结果一步达成
#当x中的特征数量非常多的时候,fit会报错并表示,此时使用partial_fit作为训练接口
#scaler = scaler.partial_fit(data)
2.2 数据标准化
当数据x按均值μ中心化后,再按标准差σ缩放,数据就会服从均值为0,方差为1的分布【注意,不会改变原数据分布】,而这个过程就叫做数据标准化,又称Z-score-normalization
标准化公式:x_ = (x - μ) / σ
2.2.1 sklearn中的数据标准化
使用StandardScaler来完成数据的标准化
StandardScaler(copy=True, with_mean=True, with_std=True),默认情况下参数都为True,因此不需要输入参数进调整
2.2.2 代码示例
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler() # 实例化
x = scaler.fit_transform(data) # 导出标准化结果
# 重要接口
scaler.mean_ # 查看标准化所使用的均值
scaler.var_ # 查看标准化所使用的标准差
scaler.inverse_transform(x_std) # 逆标准化
2.3 缺失值
一般来说,pandas和numpy都可以处理缺失值(dropna 和 fillna ) ,sklearn中也有填充缺失值的功能
在sklearn中使用impute.SimpleImputer来填充缺失值
2.3.1 sklearn中的缺失值处理
impute.SimpleImputer,有missing_values、strategy、fill_value、copy四个参数
- missing_values:缺失值,默认是np.nan
-
strategy:填充缺失值的方法
- mean:均值填充
- median:中值填充
- most_frequent:众数填充
- constant:参考参数fill_value中的值
- fill_value: 当strategy为constant时可用,输入要填充的值,常用0
- copy: 默认为True,创建特征矩阵的副本
2.3.2 代码示例
from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer()
"""
imp_median = SimpleImputer(strategy="median")
imp_median = SimpleImputer(strategy="constant",fill_value=0)
imp_mean = imp_mean.fit_transform(data) # 完成调取结果
"""
3. 处理分类特征
3.1 处理文字型特征
特征很多时候包含文字,比如性别:男女 ,我们在建模前需要将这些带文字的特征量化,转化为数值型
3.1.1 标签专用 LabelEncoder
在sklearn中,使用preprocessing.LabelEncoder来将分类标签转换为分类数值
from sklearn.preprocessing import LabelEncoder
# data.iloc[:,-1]为标签
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])
3.1.2 特征专用 OrdinalEncoder
在sklearn中,使用OrdinalEncoder将分类特征转换为分类数值
from sklearn.preprocessing import OrdinalEncoder
# data_.iloc[:,1:-1]表示特征
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_ # 用于查看特征中都有哪些类
data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
3.2 创建哑变量
- 名义变量:取值之间完全没有联系,比如A门、B门、C门
- 有序变量:取值之间完全独立,有顺序关系,但是不可以计算 高中>初中>小学
-
有距变量:各取值之间有联系,而且可以相互计算 120kg - 45kg = 75kg
我们把分类转换成数字的时候,忽略了数字中自带的数学性质,会给算法传达了一些不准确的信息,这会影响我们的建模。对于名义变量,我们需要使用哑变量进行处理
在sklearn库中,使用OneHotEncoder来创建哑变量
from sklearn.processing import OneHotEncoder
# 选取特征
x = data.iloc[:,1:-1]
result = OneHotEncoder(categories="auto").fit_transform(x).toarry()
# 还原
pd.DataFrame(enc.inverse_transform(result))
enc.get_feature_names() # 返回哑变量特征矩阵对于的列标题
3.3 连续型变量划分为分类变量
比如,有时候我们需要将不同年龄段的人分为不同的群体,这时候我们就需要将连续型变量划分为分类变量
在sklearn中,使用KBinsDiscretizer来进行此操作
KBinsDiscretizer有以下三个重要参数
- n_bins:分箱的个数
- encode: 编码方式,默认是onehot
- strategy: 定义箱宽的方式 默认是quantile
from sklearn.preprocessing import KBinsDiscretizer
x = data.iloc[:,0].values.reshape(-1,1)
est = KBinsDiscretizer(n_bins=3,encode='onehot',strategy='uniform')
est.fit_transform(x).toarry() # 查看转换后分的箱
特征选择和降维算法部分请看<数据处理和特征工程 (二) >