机器学习[1]:特征选择
2021-05-29

数据和特征 限定了机器学习性能的上限,优化 模型和算法 来逼近这个上限

特征处理

  • 预处理
  • 特征选择
  • 降维

特征选择的意义

  • 降低拟合度
  • 预测结果更精确
  • 减少模型训练时间

无关的特征会降低魔性的额准确度,尤其是线性算法(线性回归算法、逻辑回归算法)

特征选择的方法

  • 单变量特征选择
  • 递归特征消除 RFE
  • 主要成分分析 PCA
  • 特征重要性

单变量特征选择

  • 卡方检验法
  • 相关系数法
  • 互信息法

卡方检验法代码

#coding=utf-8
from pandas import read_csv
from numpy import set_printoptions
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

# 导入数据
filename = 'iris.data'
names = ['separ-length', 'separ-width', 'petal-length', 'petal-width', 'class']
data = read_csv(filename, names=names)
array = data.values

X = array[:, 0:4] # 输入数据
Y = array[:,4] # 输出结果

ret=SelectKBest(score_func=chi2, k=2).fit(X,Y)
print(ret.scores_) # 分数最高的那个属性 就是 最有决定性的特征
features = ret.transform(X)
print(features) # 查看分数最高的那K个属性 对应的数据
#print(fit.scores_)

递归特征消除

  • 线性回归
  • 逻辑回归

逻辑回归法代码

from pandas import read_csv
from sklearn.feature_selection import RFE 
from sklearn.linear_model import LogisticRegression

filename = "./iris.data"
names = ['separ-length', 'separ-width', 'petal-length', 'petal-width', 'class']
array = read_csv(filename, names=names).values

X=array[:,0:4]
Y=array[:,4]

model=LogisticRegression()
fit = RFE(model, 1).fit(X,Y)
print("所有特征:")
print(fit.n_features_)
print("被选中的特征:")
print(fit.support_)
print("特征排名")
print(fit.ranking_)

主要成分分析

  • PCA
  • LDA

PCA算法代码

from pandas import read_csv
from sklearn.decomposition import PCA

filename = "./iris.data"
names = ['separ-length', 'separ-width', 'petal-length', 'petal-width', 'class']
array = read_csv(filename,names=names).values

X = array[:,0:4]
Y = array[:,4]

fit = PCA(n_components=1).fit(X)
print(fit.components_)

特征重要性

  • 袋装决策树算法
  • 随机森林算法
  • 极端随机树算法

极端随机树算法代码

from pandas import read_csv
from sklearn.ensemble import ExtraTreesClassifier

filename = "./iris.data"
names = ['separ-length', 'separ-width', 'petal-length', 'petal-width', 'class']
array = read_csv(filename, names=names).values

X=array[:,0:4]
Y=array[:,4]

fit = ExtraTreesClassifier().fit(X,Y)
print(fit.feature_importances_)

总结

上述代码都可以评估出,蝴蝶花的花瓣长度 是最能确定蝴蝶花种类的属性。