Neo Anderson's Blog

构建信用评分卡模型通用步骤实现细节(四) - 特征的选择

字数统计: 568阅读时长: 2 min
2019/10/23
  • 特征选择目的

    • 减少特征数量/降维/模型泛华能力更强, 减少过拟合
    • 增强特征和特征值间的理解
  • sklearn 相关常用特征选择方法

    • 过滤法(Filter): 按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征
      • 移除低方差特征Removing features with low variance(适用于:特征值为离散变量)
        script
        1
        2
        3
        4
        from sklearn.feature_selection import VarianceThreshold
        x = [[0,2,0,3],[0,1,4,3],[0,1,1,3]]
        VarianceThreshold(threshold=1).fit_transform(x) # 移除方差阈值小于1的特征列
        [[0],[4],[1]]
      • 单变量特征选择Univariate feature selection :计算单特征统计学意义指标,判断指标重要度, 去除不重要指标
        • 分类问题(y分散): 卡方检验, f_classif(离散变量方差分析计算),mutual_info_classif(计算离散目标变量互信息),互信息  
          script
          1
          2
          3
          4
          5
          6
          7
          8
          9
          # 卡方校验
          from sklearn.feature_selection import chi2, SelectKBest,VarianceThreshold
          iris = load_iris()
          x, y = iris.data, iris.target
          SelectKBest(chi2, k=1).fit_transform(x, y) #使用卡方校验特征值, 返回k个排名靠前的特征


          # 互信息
          @todo
        • 回归问题(y连续): 皮尔逊相关系数, f_regression(连续变量方差分析计算), mutual_info_regression(计算连续变量互信息), 最大信息系数
          script
          1
          2
          3
          4
          5
          6
          7
          8
          9
          # 皮尔逊相关系数`(缺陷点: 线性关系敏感,非线性无法分辨关系)`
          from scipy.stats import pearson
          r, p = pearsonr(x, y) #x:自变量 y:因变量 得到相关系数r, 和p_value相关系数显著性(p-value在500个样本值以上有较高的可靠性)
          #或者
          pd.DataFrame.corr(df,method=('pearson/kendall/spearman'))
          # 要先检验相关系数的显著性,如果显著,证明相关系数有统计学意义,下一步再来看相关系数大小,

          # 距离相关系数
          @todo
        • 基于模型(机器学习算法)排序特征,并选择: 针对 每个单独的特征 和 响应变量建立预测模型。
          script
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          boston = (load_boston())
          X = boston.data
          Y = boston.target
          names = boston.feature_names
          names
          rf = RandomForestRegressor(n_estimators=20, max_depth=4)
          scores = []

          for i in range(X.shape[1]):
          score = cross_val_score(rf, X[:,i:i+1],Y, scoring="r2", cv=ShuffleSplit(len(X), 3, .3))
          scores.append((format(np.mean(score), '.3f'), names[i]))


          scores
    • 包装法(Wrapper): 根据目标函数(通常是预测效果分)筛选n个特征/排除n个特征
CATALOG
  1. 1. 特征选择目的
  2. 2. sklearn 相关常用特征选择方法