特征筛选:从原始数据中筛选出对预测变量有较大权重的特征,重点训练
特征筛选的方法有很多,今天我们简要介绍有:F检验,PCA, 递归特征消除 (RFECV), hyper-parameter。
1. F检验
导入Scikit_Learn的feature_selection库,使用F检验(f_regression)给出各个特征的F值和P值,从而筛选变量(选择F值大、P值小的特征)
from sklearn.linear_model import LogisticRegression as LR
from sklearn.linear_model import RandomizedLogisticRegression as RLR
rlr = RLR()
rlr.fit(x,y)
rlr.get_support() # 也可以通过.scores_方法获得各特征的分数
lr = LR()
lr.fit(x, y )
lr.score(x, y)# 给出模型的平均正确率
逻辑回归本质上还是一种线性模型,因此这里的有效性检验本质上在做线性相关性检验,选出来的变量说明跟结果有较强的线性相关性。但是被筛选掉的变量不一定就跟结果没有关系,因为他们之间有可能存在非线性关系。对于非线性关系的变量筛选方法包括:决策树、神经网络等。
2. PCA
主成分分析: 用较少的变量去解释数据中的大部分变量,即将许多相关性很高的变量转化成彼此独立或不相关的变量。
主成分分析是一种用于连续属性的数据降维方法,它构造一个正交变换,新空间的基底去除了原始空间基底下数据的相关性,只需少数新变量就能解释原始数据中的大部分变量。这些能代表大部分特征的变量就叫主成分,用它们来建模。
from sklearn.decomposition import PCA
pca = PCA()
PCA(n_components=None, copy=True, whiten = False)
参数说明:
- n_components: 要保留的主成分个数,默认为None,保留全部
- copy: 训练时是否保留原始数据一份 ,默认True
- whiten: 白化,使每个特征具有相同的方差,默认False
from sklearn.decomposition import PCA
pca = PCA()
pca.fit(data)
pca.components_ # 各个模型的特征向量
pca.explained_variance_ratio_ #各个特征的方差百分比(贡献率)
3. 递归特征消除
RFE的主要思想是反复构建模型(如SVM和回归)然后选出最好的或最差的特征,把选出来的特征放一边,然后在剩余的特征上重复过程,直到遍历所有特征。这个过程中特征被消除的次序就是特征的排序。因此这是一种寻找最优特征子集的贪心算法。sklearn
提供了RFECV,可以通过交叉验证来对特征进行排序。
from sklearn.tree import DecisionTreeClassifier as DTC # 以决策树为例
from sklearn.model_selection import RFECV
RFECV(DTC(), step=1, cv=N, scoring='accuracy')
# step=1, 每次迭代消除1个特征
该函数返回一个调优后的模型,可以应用fit()
, fit_transform()
,predict()
等等方法,还有诸如n_features_
, support_
, ranking_
等属性。
这个模型会自动把传入的X修整为调优后数据的特征规格,然后再预测。
4. hyper-parameter
主要用到GridSearchCV()
函数。
from sklearn.tree import DecisionTreeClassifier as DTC # 以决策树为例
from sklearn.model_selection import GridSearchCV
para_grid = {
'criterion': ['gini', 'entropy'],
'max_depth': [2, 4, 6, 8],
'random_state': [0],
'max_leaf_nodes': [10, 50, 100]
}
tuned_model = GridSearchCV(DTC(), param_grid = para_grid,
scoring='roc-auc', cv=N)
简单地说,就是对模型应用para_grid
中的不同参数组合,按criterion
标准选择最优特征,返回模型。
小白探路,难免有误,希望大家指正,谢谢你的浏览~