Neo Anderson's Blog

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

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

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