目录

  • 项目背景
  • 技术栈
  • 实现
    • 数据
    • 代码
  • 总结

项目背景

无论是对于什么数据都存在两个非常经典的问题:问题一是,数据与标签之间,数据与数据之间的一些实际关系很难搞清楚。有些时候特征A,特征B可能都与标签存在正向关系。然而实际上的关系却可能是标签与特征A,B的乘积存在实际关系;问题二,在不同机器学习的模型中,特征的最佳选择往往并不一致。比如当模型选择为模型model1的时候,特征可能为特征ABC,而当模型变为model2的时候,最佳特征可能就变为了ACD。

为了解决这两个问题,有一个比较成熟的自动化方案可供我们使用。那就是多项式特征生成与自动特征选择。

这里我们借助sklearn中的多项式特征生成(sklearn.preprocessing.PolynomialFeatures)与RFECV(sklearn.feature_selection.RFECV,递归式特征消除)来解决这个问题。前者的作用是自动生成多项式特征,如,x1,x2,生成特征为x1**x1,x1*x2,x2**x2等。而递归式特征消除,则是一种利用模型进行特征消除的方法,需要模型本身带有特征的重要程度这一项,之后则不断地递归调用自身,将不重要的特征去除,直到去除某个特征后,模型的预测效果下降为止。

技术栈

  • Python3
  • scikit-learn
  • pandas
  • numpy
  • matplotlib

实现

数据

特征的自由组合有时会带来性能提升,但并不一定一定是有效的。更多的时候我们需要要考虑的是实际业务的需要。这里我们选择UCI的红酒质量数据集进行处理,从实际业务上来说,红酒质量数据集中的特征都是单项的红酒指标,但是实际上红酒的评分本就并非直接与单项数据成正比,有些则是与特征之间的组合或者特征的几次方成有效关系。因此我们这里就是用多项式特征生成与递归特征消除来自动获取符合实际业务的模型。

该数据的下载可以前往:http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv

代码

首先加载有关类库

import numpy as np
from sklearn.feature_selection import RFECV
from sklearn.linear_model import LassoCV
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

之后创建数据加载的方法,并调用数据;要注意的是我们这里使用的train_test_split方法进行数据的分割,其中test_size=0.30,表示分割出百分之三十的数据作为测试数据集,随机数种子为random_state=531,为随机数种子赋值后我们将

def GetDataByPandas():import pandas as pdwine = pd.read_csv("/home/fonttian/Data/dataset/wine/wine.csv")y = np.array(wine.quality)X = np.array(wine.drop("quality", axis=1))columns = np.array(wine.columns)return X, y, columns
X, y, wineNames = GetDataByPandas()
scalar = StandardScaler()
X = scalar.fit_transform(X)train_data, test_data, train_labels, test_labels = train_test_split(X, y, test_size=0.30, random_state=531)

之后首先使用多项式特征生成方法进行特征的自动生成,具体代码如下:

from sklearn.preprocessing import PolynomialFeaturespoly = PolynomialFeatures(2)
print("原始数据的形状:")
print(train_data.shape)
train_data_new = poly.fit_transform(train_data)
test_data_new = poly.fit_transform(test_data)
print("生成多项式特征之后的数据形状:")
print(train_data_new.shape)
原始数据的形状:
(1119, 11)
生成多项式特征之后的数据形状:
(1119, 78)

此处参数2表示,特征生成的程度,如果需要生成3程度(也就是三次方和三个特征自由组合),只需要设置参数为3即可。另外还有一个参数interaction_only,表示是否只生成交互特征,如果为True,将不会生成特征与自身交互产生的特征(也就是几次方之类的),该参数默认为False。
之后我们需要选择一个模型进行数据的预测,同时为了方便观察以及避免超参数带来的偶然性。我们这里选择LassoCV方法进行建模,该方法会使用交叉验证自动选择Lasso的最佳超参数alpha,这样可以很大程度避免默认超参数对实际结果的影响。具体代码如下:

%matplotlib inline
def LassoCV_plot(model):import matplotlib.pyplot as plotplot.figure()plot.plot(model.alphas_, model.mse_path_, ':')plot.plot(model.alphas_, model.mse_path_.mean(axis=-1),label='Average MSE Across Folds', linewidth=2)plot.axvline(model.alpha_, linestyle='--',label='CV Estimate of Best alpha')plot.semilogx()plot.legend()ax = plot.gca()ax.invert_xaxis()plot.xlabel('alpha')plot.ylabel('Mean Square Error')plot.axis('tight')plot.show()# print out the value of alpha that minimizes the Cv-errorprint("alpha Value that Minimizes CV Error  ", model.alpha_)print("Minimum MSE  ", min(model.mse_path_.mean(axis=-1)))# Call LassoCV from sklearn.linear_model
lcv_1 = LassoCV(cv=10,n_jobs=-1)
wineModel = lcv_1.fit(train_data, train_labels)
LassoCV_plot(wineModel)
lcv_2 = LassoCV(cv=10,n_jobs=-1)
wineModel_new = lcv_2.fit(train_data_new, train_labels)
LassoCV_plot(wineModel_new)estimator = LassoCV(cv=10,n_jobs=-1)
selector = RFECV(estimator, step=1, cv=5,n_jobs=-1)
selector = selector.fit(X, y)selector_train_data = selector.fit_transform(train_data, train_labels)
test_data_selector = selector.transform(test_data)

alpha Value that Minimizes CV Error   0.005057237342969403
Minimum MSE   0.42849753501285

alpha Value that Minimizes CV Error   0.0061927974491236
Minimum MSE   0.4236178162163108

从最终结果来看,我们直接使用生成的67种特征+原11种特征进行建模的效果并不好于直接使用原11种特征,这是必然是因为产生了大量的无用特征的缘故。下一步我们就需要借助递归式特征消除进行特征选择,将真正有效的特征选择出来。

print("使用特征选择,并进行效果对比:")estimator = LassoCV(cv=10,n_jobs=-1)
selector = RFECV(estimator, step=1, cv=5,n_jobs=-1)
selector = selector.fit(X, y)selector_train_data = selector.fit_transform(train_data, train_labels)
test_data_selector = selector.transform(test_data)print("特征选择之后数据的shape:",selector_train_data.shape)
wineModel = lcv_1.fit(selector_train_data, train_labels)
print("alpha Value that Minimizes CV Error  ", wineModel.alpha_)
print("Minimum MSE  ", min(wineModel.mse_path_.mean(axis=-1)))selector_train_data_new = selector.fit_transform(train_data_new, train_labels)
test_data_new_selector = selector.transform(test_data_new)print("特征选择之后数据的shape:",selector_train_data_new.shape)
wineModel_new = lcv_2.fit(selector_train_data_new, train_labels)
print("alpha Value that Minimizes CV Error  ", wineModel_new.alpha_)
print("Minimum MSE  ", min(wineModel_new.mse_path_.mean(axis=-1)))
使用特征选择,并进行效果对比:
特征选择之后数据的shape: (1119, 7)
alpha Value that Minimizes CV Error   0.0008837665882418426
Minimum MSE   0.427181140352486
特征选择之后数据的shape: (1119, 38)
alpha Value that Minimizes CV Error   0.00038256145886961614
Minimum MSE   0.4002180554706169

上面即是进行特征选择后的实际结果,可以很明显的看到,如果仅仅对原始数据进行特征选择,那么大概能够降低0.00413的平均误差以及0.001的最小MSE;但是在对生成的多项式特征进行特征选择之后,其结果则得到的极大的下降(0.00588,0.234)。而且各位重要的是进行特征选择后的多项式数据集的拟合结果已经明显高于原有数据集的拟合结果。但是除了拟合结果之外更好地应该是预测结果的变化,下面的代码则是预测结果的变化:

# 输出预测值
def show_prediction(model, X, y):prediction = model.predict(X)print("RMSE", np.sqrt(mean_squared_error(y, prediction)))print("MSE", mean_squared_error(y, prediction))show_prediction(lcv_1, test_data_selector, test_labels)
show_prediction(lcv_2, test_data_new_selector, test_labels)
RMSE 0.6440234501860966
MSE 0.4147662043896037
RMSE 0.6390612669439588
MSE 0.40839930290801785

总结

从预测结果看,很明显经过多项式特征生成与递归特征消除的模型效果依旧要好于原有模型很多。同时更重要的地方在于,目前对于模型效果具有正面效果的数据很有可能是有意义的特殊特征组合。利用该方法我们也可以快速的获得一个可能有用特殊意义的特征组合的集合,并引导我们发现这些特殊特征组合的现实意义。

利用多项式特征生成与递归特征消除解决特征组合与特征选择问题相关推荐

  1. 特征选择之支持向量机递归特征消除(SVM-RFE)

    支持向量机递归特征消除(下文简称SVM-RFE)是由Guyon等人在对癌症分类时提出来的,最初只能对两类数据进行特征提取.它是一种基于Embedded方法. 支持向量机 支持向量机广泛用于模式识别,机 ...

  2. 使用RFECV、递归特征消除 (Recursive Feature Elimination)进行特征筛选详解及实战

    使用RFECV.递归特征消除 (Recursive Feature Elimination)进行特征筛选详解及实战 包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征. 所 ...

  3. 使用特征_R语言-使用caret包实现特征选择:递归特征消除(RFE)算法

    在caret(short for classification and regression training)包中有多个函数可以实现特征选择,总的分为封装法和过滤法.封装法,将特征选择过程与训练过程 ...

  4. python卡方检验筛选特征原理_基于Python的遥感特征筛选—递归特征消除(RFE)与极限树(Extra-Trees)...

    引言 基于前几篇文章关于筛选方法的介绍,本篇同样给大家介绍两种python封装的经典特征降维方法,递归特征消除(RFE)与极限树(Extra-Trees, ET).其中,RFE整合了两种不同的超参数, ...

  5. R语言基于递归特征消除RFE(Recursive Feature Elimination)进行特征筛选(feature selection)

    R语言基于递归特征消除RFE(Recursive Feature Elimination)进行特征筛选(feature selection) 对一个学习任务来说,给定属性集,有些属性很有用,另一些则可 ...

  6. RFE递归式特征消除

    RFE递归式特征消除 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 RFE递归式特征消除简介 RFE(Recursive F ...

  7. 递归特征消除和K折交叉验证(以决策树回归为例)

    与特征选择不同的是递归特征消除后不会输出权值 导入相应模块 import matplotlib.pyplot as plt import numpy as np import pandas as pd ...

  8. 随机森林模型进行递归特征消除的python实现

    核心代码: import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.metrics im ...

  9. python3中多项式创建_机器学习入门之机器学习之路:python 多项式特征生成PolynomialFeatures 欠拟合与过拟合...

    本文主要向大家介绍了机器学习入门之机器学习之路:python 多项式特征生成PolynomialFeatures  欠拟合与过拟合,通过具体的内容向大家展现,希望对大家学习机器学习入门有所帮助. 分享 ...

最新文章

  1. VCL 中的 Windows API 函数(6): BeginDeferWindowPos
  2. SAP MM 标准的采购订单预付款功能介绍
  3. h5如何动态获取键盘高度_动态获取键盘高度
  4. Asp.Net Core(.net内核)
  5. JavaScript对象的chapterI
  6. 【图像配准】基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA、SATD算法
  7. 闪回flashback table配合flashback versions query的注意事项
  8. Kylin Cube构建优化
  9. tns-03505: 无法解析名称_在 Azure上购买域名并进行域名解析
  10. 苹果开发者被盯上了!Xcode又双叒叕被攻击了
  11. 解决libxml2不支持中文的问题
  12. 利用51单片机输出PWM波
  13. springboot+基于Web的开关柜综合监测信息查询系统的设计与实现 毕业设计-附源码191550
  14. SMILES 与 SELFIES 的转换代码
  15. 湖南计算机前十大学,湖南计算机专业学校排名
  16. 如何下载IEEE论文
  17. FAT文件系统原理(一)
  18. 为什么牛逼程序员都秃顶了....?
  19. TCP:利用Socket编程技术实现客户端向服务端上传一个图片。
  20. 东方博宜OJ 1002 - 【入门】编程求解1+2+3+...+n

热门文章

  1. [组合数]求组合数的几种方法总结
  2. Java多线程:捕获线程异常
  3. Spring 中策略模式的 2 个经典应用,可以用来怼面试官了
  4. 来自十年互联网人的大厂等级晋升攻略
  5. 刷道谷歌泄漏的面试题:面试官想从中考察你什么?
  6. 云VS本地,一言难尽的ERP
  7. 【报错】ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds t
  8. C语言 计算2-4+6-8+.....+98-100的结果
  9. 下列设备中 微型计算机系统必须具备的是,计算机应用基础题库
  10. 中国联通华东云数据中心—电气培训