数据挖掘——特征工程

特征工程(Feature Engineering)

  特征工程其本质上是一项工程活动,它的目的是最大限度地从原始数据中提取特征以供算法和模型使用。

  特征工程的重要性:

  • 特征越好,灵活性越强
  • 特征越好,模型越简单
  • 特征越好,性能越出色

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。特征工程的最终目的就是提升模型的性能。

特征工程包括:数据处理、特征选择、维度压缩三大方面的内容。

1、数据处理:量纲不一、虚拟变量、缺失值填充

1.1、量纲不一

量纲就是单位,特征的单位不一致就不能放在一起比较,可以使用数据标准化的方法来达到量纲一致的要求。

常用的数据标准化方法:0-1标准化、Z标准化、归一化

1.1.1  0-1标准化

  0-1标准化是对原始数据进行线性变化,将特征值映射成区间为[0,1]的标准值中。

  标准化值 = 

 导入一份含电影票房和豆瓣评分的数据如下

  基于sklearn包的0-1标准化:

scaler = MinMaxScaler()

data['票房0-1标准化'] = scaler.fit_transform(np.array(data['累计票房']).reshape(5, -5))
data['评分0-1标准化'] = scaler.fit_transform(np.array(data['豆瓣评分']).reshape(5, -5))

 

1.1.2 Z标准化

  Z标准化是基于特征值的均值和标准差进行数据的标准化,标准化后的变量围绕0上下波动,大于0说明高于平均水平,小于0说明低于平均水平。

  标准化值 = 

  基于sklearn包的Z标准化:

from sklearn.preprocessing import scale
data['票房z标准化'] = scale(data['累计票房'])
data['评分z标准化'] = scale(data['豆瓣评分'])

 

1.2、 虚拟变量

虚拟变量也叫哑变量或离散特征编码,可用来表示分类变量、非数量因素可能产生的影响。

 python中主要通过pandas包中的get_dummies方法进行特征变量的虚拟化。

 

1.3、缺失值

  缺失值产生的原因:有些信息暂时无法获取(单身人士的配偶、未成年人的收入等);有些信息被遗漏或错误的处理了

  缺失值处理方法:数据补齐;删除缺失值;不处理

from sklearn.preprocessing import Imputer
# mean, median, most_frequent 三种处理参数
imputer = Imputer(strategy='mean')
imputer.fit_transform(data2[['累计票房']])

 

2、 特征选择:

如何选择特征:考虑特征是否发散;考虑特征与目标相关性

以以下格式的数据为例,用不同方法得到特征

 

2.1 、方差选择法

先计算各个特征的方差,根据阈值,选择方差大于阈值的特征

基于sklearn包的方差选择获取特征的方法

from sklearn.feature_selection import VarianceThreshold
varianceThreshold = VarianceThreshold(threshold=10) #设置方差阈值,只选择方差大于10的特征
varianceThreshold.fit_transform(data[['累计票房', '豆瓣评分']])  

data[['累计票房', '豆瓣评分']].std() #计算两列各自的方差,其中豆瓣评分方差为1.79,低于10

varianceThreshold.get_support() #得到选择特征的列的序号

 

2.2、 相关系数法

先计算各个特征对目标值的相关系数,选择更加相关的特征

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_regression

selectbest =SelectKBest(f_regression, k=2) #设置通过回归的方法, 选择数量为2个的特征

feature = data1[['月份','季度','广告费用','客流量']]  #变量矩阵
bestfeature = selectbest.fit_transform(feature,data1['销售额']) #得到与销售额相关度最高的2个变量
feature.columns[selectbest.get_support()]  #获得特征列的名称

 

2.3、 递归特征消除法

使用一个基模型来进行多轮训练,经过多轮训练后,保留指定的特征数

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression

#选择线性回归模型, 保留2 个特征
rfe = RFE(estimator= LinearRegression(), n_features_to_select=2) 

sFesture = rfe.fit_transform(feature, data1['销售额'])

rfe.get_support()

 

2.4、 模型选择法

将建好的模型对象传入选择器,然后它会根据这个建好的模型,自动选择最好的特征值

from sklearn.feature_selection import SelectFromModel

lrmodel = LinearRegression()  #先创建一个线性回归对象
selectmodel = SelectFromModel(lrmodel)

selectmodel.fit_transform(feature,data1['销售额'])
feature.columns[selectmodel.get_support()]

 

3、 维度压缩

特征选择完成后,可以直接训练模型,但可能由于特征矩阵过大,导致计算量和计算时间大,因此需要降低矩阵维度。

主成分分析(PCA)就是最常用的数据降维方法:在减少数据维度的同时,保持对方差贡献最大的特征。

以iris数据集为例,将四维数据转化成三维、二维数据

from sklearn import datasets
iris = datasets.load_iris()
data_iris = iris.data
target = iris.target

from sklearn.decomposition import PCA
pca_3 = PCA(n_components=3) #创建一个维度为3维的PCA对象
data_pca_3 = pca_3.fit_transform(data_iris) #将iris数据集降至三维

将三维图形绘制出来

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

colors = {0:'r', 1:'b', 2:'k'}
markers = {0:'x', 1:'D', 2:'o'}
fig = plt.figure(1, figsize=(8, 6))
ax = Axes3D(fig, elev=-150, azim=110)

data_pca_gb = pd.DataFrame(data_pca_3).groupby(target)

for g in data_pca_gb.groups:
    ax.scatter(
        data_pca_gb.get_group(g)[0], 
        data_pca_gb.get_group(g)[1], 
        data_pca_gb.get_group(g)[2], 
        c=colors[g], 
        marker=markers[g],
        cmap=plt.cm.Paired)

得到如下的三维图形

将数据降至二维同理

pca_2 = PCA(n_components=2) 
data_pca_2 = pca_2.fit_transform(data_iris)    
data_pca_gb = pd.DataFrame(data_pca_2).groupby(target)

 

posted @ 2018-10-26 11:44  没有神保佑的瓶子  阅读(1819)  评论(0编辑  收藏  举报