DC学院学习笔记 预测型数据分析:用特征选择方法优化模型

特征选择的定义:

  • 特征选择(Feature Selection)也称特征子集选择(Feature Subset Selection , FSS),或属性选择(Attribute Selection)。是指从已有的M个特征(Feature)中选择N个特征使得系统的特定指标最优化,是从原始特征中选择出一些最有效特征以降低数据集维度的过程,是提高学习算法性能的一个重要手段,也是模型识别中关键的数据预处理步骤。对于一个学习算法来说,好的学习样本是训练模型的关键。

特征选择的方法:

数据驱动:分析手上已有的训练数据,得出哪些x里面的特征对预测y最重要。主要的三大类方法如下:

  • 相关性:考察在我们已有的数据里面的特征x与预测值y的相关度
  • 迭代删除(增加):确定要使用哪个算法后,选择最合适的训练子集,从而使得模型的效果最好
  • 基于模型:通过随机森林等可以直接得出每个训练特征的重要性的模型;或者是在进行预测时加入的一些正则化调整,引起的对特征的筛选,从而挑选出最重要的特征

领域专家:通过相关领域专家知识,经验来挑选特征

相关性系数:皮尔逊系数

定义:

在统计学中,皮尔逊积矩相关系数(英语:Pearson product-moment correlation coefficient,又称作 PPMCC或PCCs, 文章中常用r或Pearson’s r表示)用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。在自然科学领域中,该系数广泛用于度量两个变量之间的相关程度。它是由卡尔·皮尔逊从弗朗西斯·高尔顿在19世纪80年代提出的一个相似却又稍有不同的想法演变而来的。这个相关系数也称作“皮尔森相关系数r”。

公式:

Python实现:

 

from scipy.stats.stats import pearsonr

pearsonr(x,y)

迭代特征选择

解决的问题:假设我们已经确定了要使用哪个算法后,我们怎么知道哪个X的子集合作为特征训练模型效果最好。

解决方案:

  • 暴力解法:把所有可能的特征组合都试一遍,用交叉检验来看哪个特征子集预测效果最好
  • 递增:
    初始化:X’ = 空集,X”=X
    For in X”:
     X’ +
    作为特征集合训练
    选所有
    中训练得到模型最好的x’
    X’ = X’ + x’
    X” = X” - x’

    蓝色部分迭代直到新加入任何特征模型性能都无提升

  • 递减:
    初始化:X’ = X
    For in X’:
     X’ -
    作为特征集合训练
    选所有
    中训练得到模型最好的x’
    X’ = X’ - x’

    蓝色部分迭代直到去除任何特征模型性能都会下降

迭代特征选择python实现:



 

import pandas

import numpy as np

from sklearn import linear_model

from sklearn.model_selection import cross_val_score

from sklearn.preprocessing import LabelEncoder

iris =pandas.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',header=None)

iris.columns=['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm','Species']

le = LabelEncoder()

le.fit(iris['Species'])

lm = linear_model.LogisticRegression()

features = ['PetalLengthCm','PetalWidthCm','SepalLengthCm','SepalWidthCm']

y = le.transform(iris['Species'])

selected_features = []

rest_features = features[:]

best_acc = 0

while len(rest_features)>0:

temp_best_i = ''

temp_best_acc = 0

for feature_i in rest_features:

temp_features = selected_features + [feature_i,]

X = iris[temp_features]

scores = cross_val_score(lm,X,y,cv=5 , scoring='accuracy')

acc = np.mean(scores)

if acc > temp_best_acc:

temp_best_acc = acc

temp_best_i = feature_i

print("select",temp_best_i,"acc:",temp_best_acc)

if temp_best_acc > best_acc:

best_acc = temp_best_acc

selected_features += [temp_best_i,]

rest_features.remove(temp_best_i)

else:

break

print("best feature set: ",selected_features,"acc: ",best_acc) 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值