精华内容
下载资源
问答
  • relie特征选择代码

    2018-03-08 14:32:35
    relie特征选择代码,可用于前期数据预处理。MATLAB代码,包含数据,可直接使用
  • 文件内有一个函数文件和CMFS.m文件,调用这两个即可。另外还有几个标准数据集用来测试。特征选择可以用来进行机器学习和数据挖掘,希望此资源可以帮助到大家,有不足之处,望指出并相互探讨。
  • 5-05特征选择代码

    2020-07-08 17:59:06
    from sklearn.tree import DecisionTreeRegressor X=data[:,0:3]#特征属性 Y=data[:,3]#标注 #引入特征选择思路的几个方法第一种是过滤思想第二种是包裹思想第三种是嵌入思想 from sklearn.feature_selection import...
    import numpy as np
    #pandas主要作用是表结构DataFrame,另外嵌入numpy纯数学
    import pandas as pd
    #scipy是基于numpy纯数学,他的区别是有数学模型(正太什么的,比较直接0
    import scipy.stats as ss
    df = pd.DataFrame({"A":ss.norm.rvs(size=10),"B":ss.norm.rvs(size=10),"C":ss.norm.rvs(size=10 ),"D":np.random.randint(low=0,high=2,size=10)})#最小值可以取到,但是最大值取不到D为标注
    print(df)
    data=df.values
    #引入SVR回归器
    from sklearn.svm import SVR
    #引入决策树回归器
    from sklearn.tree import DecisionTreeRegressor
    X=data[:,0:3]#特征属性
    Y=data[:,3]#标注
    
    #引入特征选择思路的几个方法第一种是过滤思想第二种是包裹思想第三种是嵌入思想
    from sklearn.feature_selection import SelectKBest,RFE,SelectFromModel
    #过滤思想
    skb = SelectKBest(k=2)#这里我猜测是选两个与标注关系最相关(这个过滤思想默认是F分布也就是方差分布)
    print(skb.fit(X,Y))#进行拟合
    print(skb.transform(X))#拟合过后进行转换
    
    #RFE思想
    rfe = RFE(estimator=SVR(kernel="linear"),n_features_to_select=2,step=1)#step是每次迭代删除一个属性
    print(rfe.fit_transform(X,Y))
    
    #嵌入思想
    sfm= SelectFromModel(estimator=DecisionTreeRegressor(),threshold=0.1)#低于阈值0.1被去掉(这里没有指定留下几个,去掉几个)
    print(sfm.fit_transform(X,Y))
    
    
    
    
    
    D:\anaconda\python.exe G:/pycharm/untitled/lesson1/BigData/2.py
              A         B         C  D
    0 -1.113453 -1.918568 -0.469903  1
    1  0.020019 -0.051674 -0.688106  1
    2  1.169084 -0.774108 -0.007191  1
    3  0.209859  1.060492 -1.378050  1
    4  0.942913 -0.574865  0.320743  0
    5 -1.764901 -0.582284 -0.822354  0
    6  1.803009 -0.411108 -1.571471  0
    7  0.272782  0.144740 -0.802366  0
    8 -0.183557  0.297150 -1.445777  0
    9 -0.173935 -0.306051  0.577133  0
    SelectKBest(k=2, score_func=<function f_classif at 0x00000224F6C1C5E8>)
    [[-1.11345295 -1.91856772]
     [ 0.02001948 -0.05167408]
     [ 1.16908433 -0.77410847]
     [ 0.2098592   1.06049168]
     [ 0.94291254 -0.57486482]
     [-1.76490117 -0.58228386]
     [ 1.80300906 -0.4111079 ]
     [ 0.2727825   0.1447399 ]
     [-0.18355694  0.29714988]
     [-0.173935   -0.30605105]]
    [[-1.11345295 -1.91856772]
     [ 0.02001948 -0.05167408]
     [ 1.16908433 -0.77410847]
     [ 0.2098592   1.06049168]
     [ 0.94291254 -0.57486482]
     [-1.76490117 -0.58228386]
     [ 1.80300906 -0.4111079 ]
     [ 0.2727825   0.1447399 ]
     [-0.18355694  0.29714988]
     [-0.173935   -0.30605105]]
    [[-1.91856772 -0.46990292]
     [-0.05167408 -0.6881059 ]
     [-0.77410847 -0.00719142]
     [ 1.06049168 -1.37804969]
     [-0.57486482  0.32074305]
     [-0.58228386 -0.82235441]
     [-0.4111079  -1.57147097]
     [ 0.1447399  -0.80236576]
     [ 0.29714988 -1.44577728]
     [-0.30605105  0.57713315]]
    展开全文
  • 特征选择很重要,除了人工选择,还...可以升维,更好的拟合曲线特征X升维X/X**2/效果验证,做回归加特征x**2之后的效果特征X1、X2升维X1/X2/X1X2/X1**2/X2**2/特征降维利用L1正则化做特征选择sparkmllib代码实现imp...

    特征选择很重要,除了人工选择,还可以用

    其他机器学习方法,如逻辑回归、随机森林、PCA、

    LDA等。

    分享一下逻辑回归做特征选择

    特征选择包括:

    特征升维

    特征降维

    特征升维

    如一个样本有少量特征,可以升维,更好的拟合曲线

    特征X

    升维X/X**2/

    效果验证,做回归

    20180110232825697116.png

    加特征x**2之后的效果

    20180110232825699069.png

    20180110232825700046.png

    特征X1、X2

    升维X1/X2/X1X2/X1**2/X2**2/

    特征降维

    利用L1正则化做特征选择

    20180110232825701999.png

    sparkmllib代码实现

    import java.io.PrintWriter

    import java.util

    import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NumericAttribute}

    import org.apache.spark.ml.classification.{BinaryLogisticRegressionTrainingSummary, LogisticRegressionModel, LogisticRegression}

    import org.apache.spark.mllib.classification.LogisticRegressionWithSGD

    import org.apache.spark.mllib.linalg.Vectors

    import org.apache.spark.rdd.RDD

    import org.apache.spark.sql.{SQLContext, DataFrame, Row}

    import org.apache.spark.sql.types.{DataTypes, StructField}

    import org.apache.spark.{SparkContext, SparkConf}

    object LogisticRegression {

    def main(args: Array[String]) {

    val conf = new SparkConf().setAppName("test").setMaster("local")

    val sc = new SparkContext(conf)

    val sql = new SQLContext(sc);

    val df: DataFrame = sql.read.format("libsvm").load("rl.txt")

    // val training = sc.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt")

    val Array(train, test) = df.randomSplit(Array(0.7, 0.3),seed = 12L)

    val lr = new LogisticRegression()

    .setMaxIter(10)

    .setRegParam(0.3)

    .setElasticNetParam(1)//默认0 L2 1---》L1

    // Fit the model

    val lrModel: LogisticRegressionModel = lr.fit(train)

    lrModel.transform(test).show(false)

    // Print the coefficients and intercept for logistic regression

    // coefficients 系数 intercept 截距

    println(s"Coefficients: ${lrModel.coefficients} Intercept: ${lrModel.intercept}")

    lrModel.write.overwrite().save("F:\\mode")

    val weights: Array[Double] = lrModel.weights.toArray

    val pw = new PrintWriter("F:\\weights");

    //遍历

    for(i

    //通过map得到每个下标相应的特征名

    //特征名对应相应的权重

    val str = weights(i)

    pw.write(str.toString)

    pw.println()

    }

    pw.flush()

    pw.close()

    }

    }

    样本lr.txt

    0 1:5.1 2:3.5 3:1.4 4:0.2

    0 1:4.9 2:3.0 3:1.4 4:0.2

    0 1:4.7 2:3.2 3:1.3 4:0.2

    0 1:4.6 2:3.1 3:1.5 4:0.2

    0 1:5.0 2:3.6 3:1.4 4:0.2

    0 1:5.4 2:3.9 3:1.7 4:0.4

    0 1:4.6 2:3.4 3:1.4 4:0.3

    0 1:5.0 2:3.4 3:1.5 4:0.2

    0 1:4.4 2:2.9 3:1.4 4:0.2

    0 1:4.9 2:3.1 3:1.5 4:0.1

    0 1:5.4 2:3.7 3:1.5 4:0.2

    0 1:4.8 2:3.4 3:1.6 4:0.2

    0 1:4.8 2:3.0 3:1.4 4:0.1

    0 1:4.3 2:3.0 3:1.1 4:0.1

    0 1:5.8 2:4.0 3:1.2 4:0.2

    0 1:5.7 2:4.4 3:1.5 4:0.4

    0 1:5.4 2:3.9 3:1.3 4:0.4

    0 1:5.1 2:3.5 3:1.4 4:0.3

    0 1:5.7 2:3.8 3:1.7 4:0.3

    0 1:5.1 2:3.8 3:1.5 4:0.3

    0 1:5.4 2:3.4 3:1.7 4:0.2

    0 1:5.1 2:3.7 3:1.5 4:0.4

    0 1:4.6 2:3.6 3:1.0 4:0.2

    0 1:5.1 2:3.3 3:1.7 4:0.5

    0 1:4.8 2:3.4 3:1.9 4:0.2

    0 1:5.0 2:3.0 3:1.6 4:0.2

    0 1:5.0 2:3.4 3:1.6 4:0.4

    0 1:5.2 2:3.5 3:1.5 4:0.2

    0 1:5.2 2:3.4 3:1.4 4:0.2

    0 1:4.7 2:3.2 3:1.6 4:0.2

    0 1:4.8 2:3.1 3:1.6 4:0.2

    0 1:5.4 2:3.4 3:1.5 4:0.4

    0 1:5.2 2:4.1 3:1.5 4:0.1

    0 1:5.5 2:4.2 3:1.4 4:0.2

    0 1:4.9 2:3.1 3:1.5 4:0.1

    0 1:5.0 2:3.2 3:1.2 4:0.2

    0 1:5.5 2:3.5 3:1.3 4:0.2

    0 1:4.9 2:3.1 3:1.5 4:0.1

    0 1:4.4 2:3.0 3:1.3 4:0.2

    0 1:5.1 2:3.4 3:1.5 4:0.2

    0 1:5.0 2:3.5 3:1.3 4:0.3

    0 1:4.5 2:2.3 3:1.3 4:0.3

    0 1:4.4 2:3.2 3:1.3 4:0.2

    0 1:5.0 2:3.5 3:1.6 4:0.6

    0 1:5.1 2:3.8 3:1.9 4:0.4

    0 1:4.8 2:3.0 3:1.4 4:0.3

    0 1:5.1 2:3.8 3:1.6 4:0.2

    0 1:4.6 2:3.2 3:1.4 4:0.2

    0 1:5.3 2:3.7 3:1.5 4:0.2

    0 1:5.0 2:3.3 3:1.4 4:0.2

    1 1:7.0 2:3.2 3:4.7 4:1.4

    1 1:6.4 2:3.2 3:4.5 4:1.5

    1 1:6.9 2:3.1 3:4.9 4:1.5

    1 1:5.5 2:2.3 3:4.0 4:1.3

    1 1:6.5 2:2.8 3:4.6 4:1.5

    1 1:5.7 2:2.8 3:4.5 4:1.3

    1 1:6.3 2:3.3 3:4.7 4:1.6

    1 1:4.9 2:2.4 3:3.3 4:1.0

    1 1:6.6 2:2.9 3:4.6 4:1.3

    1 1:5.2 2:2.7 3:3.9 4:1.4

    1 1:5.0 2:2.0 3:3.5 4:1.0

    1 1:5.9 2:3.0 3:4.2 4:1.5

    1 1:6.0 2:2.2 3:4.0 4:1.0

    1 1:6.1 2:2.9 3:4.7 4:1.4

    1 1:5.6 2:2.9 3:3.6 4:1.3

    1 1:6.7 2:3.1 3:4.4 4:1.4

    1 1:5.6 2:3.0 3:4.5 4:1.5

    1 1:5.8 2:2.7 3:4.1 4:1.0

    1 1:6.2 2:2.2 3:4.5 4:1.5

    1 1:5.6 2:2.5 3:3.9 4:1.1

    1 1:5.9 2:3.2 3:4.8 4:1.8

    1 1:6.1 2:2.8 3:4.0 4:1.3

    1 1:6.3 2:2.5 3:4.9 4:1.5

    1 1:6.1 2:2.8 3:4.7 4:1.2

    1 1:6.4 2:2.9 3:4.3 4:1.3

    1 1:6.6 2:3.0 3:4.4 4:1.4

    1 1:6.8 2:2.8 3:4.8 4:1.4

    1 1:6.7 2:3.0 3:5.0 4:1.7

    1 1:6.0 2:2.9 3:4.5 4:1.5

    1 1:5.7 2:2.6 3:3.5 4:1.0

    1 1:5.5 2:2.4 3:3.8 4:1.1

    1 1:5.5 2:2.4 3:3.7 4:1.0

    1 1:5.8 2:2.7 3:3.9 4:1.2

    1 1:6.0 2:2.7 3:5.1 4:1.6

    1 1:5.4 2:3.0 3:4.5 4:1.5

    1 1:6.0 2:3.4 3:4.5 4:1.6

    1 1:6.7 2:3.1 3:4.7 4:1.5

    1 1:6.3 2:2.3 3:4.4 4:1.3

    1 1:5.6 2:3.0 3:4.1 4:1.3

    1 1:5.5 2:2.5 3:4.0 4:1.3

    1 1:5.5 2:2.6 3:4.4 4:1.2

    1 1:6.1 2:3.0 3:4.6 4:1.4

    1 1:5.8 2:2.6 3:4.0 4:1.2

    1 1:5.0 2:2.3 3:3.3 4:1.0

    1 1:5.6 2:2.7 3:4.2 4:1.3

    1 1:5.7 2:3.0 3:4.2 4:1.2

    1 1:5.7 2:2.9 3:4.2 4:1.3

    1 1:6.2 2:2.9 3:4.3 4:1.3

    1 1:5.1 2:2.5 3:3.0 4:1.1

    1 1:5.7 2:2.8 3:4.1 4:1.3

    特征选择

    20180110232825704929.png

    第一个特征权重为0,可以忽略,选择2,3,4个特征

    展开全文
  • 特征选择很重要,除了人工选择,还...可以升维,更好的拟合曲线特征X升维X/X**2/效果验证,做回归加特征x**2之后的效果特征X1、X2升维X1/X2/X1X2/X1**2/X2**2/特征降维利用L1正则化做特征选择sparkmllib代码实现imp...

    特征选择很重要,除了人工选择,还可以用

    其他机器学习方法,如逻辑回归、随机森林、PCA、

    LDA等。

    分享一下逻辑回归做特征选择

    特征选择包括:

    特征升维

    特征降维

    特征升维

    如一个样本有少量特征,可以升维,更好的拟合曲线

    特征X

    升维X/X**2/

    效果验证,做回归

    20180110232825697116.png

    加特征x**2之后的效果

    20180110232825699069.png

    20180110232825700046.png

    特征X1、X2

    升维X1/X2/X1X2/X1**2/X2**2/

    特征降维

    利用L1正则化做特征选择

    20180110232825701999.png

    sparkmllib代码实现

    import java.io.PrintWriter

    import java.util

    import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NumericAttribute}

    import org.apache.spark.ml.classification.{BinaryLogisticRegressionTrainingSummary, LogisticRegressionModel, LogisticRegression}

    import org.apache.spark.mllib.classification.LogisticRegressionWithSGD

    import org.apache.spark.mllib.linalg.Vectors

    import org.apache.spark.rdd.RDD

    import org.apache.spark.sql.{SQLContext, DataFrame, Row}

    import org.apache.spark.sql.types.{DataTypes, StructField}

    import org.apache.spark.{SparkContext, SparkConf}

    object LogisticRegression {

    def main(args: Array[String]) {

    val conf = new SparkConf().setAppName("test").setMaster("local")

    val sc = new SparkContext(conf)

    val sql = new SQLContext(sc);

    val df: DataFrame = sql.read.format("libsvm").load("rl.txt")

    // val training = sc.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt")

    val Array(train, test) = df.randomSplit(Array(0.7, 0.3),seed = 12L)

    val lr = new LogisticRegression()

    .setMaxIter(10)

    .setRegParam(0.3)

    .setElasticNetParam(1)//默认0 L2 1---》L1

    // Fit the model

    val lrModel: LogisticRegressionModel = lr.fit(train)

    lrModel.transform(test).show(false)

    // Print the coefficients and intercept for logistic regression

    // coefficients 系数 intercept 截距

    println(s"Coefficients: ${lrModel.coefficients} Intercept: ${lrModel.intercept}")

    lrModel.write.overwrite().save("F:\\mode")

    val weights: Array[Double] = lrModel.weights.toArray

    val pw = new PrintWriter("F:\\weights");

    //遍历

    for(i

    //通过map得到每个下标相应的特征名

    //特征名对应相应的权重

    val str = weights(i)

    pw.write(str.toString)

    pw.println()

    }

    pw.flush()

    pw.close()

    }

    }

    样本lr.txt

    0 1:5.1 2:3.5 3:1.4 4:0.2

    0 1:4.9 2:3.0 3:1.4 4:0.2

    0 1:4.7 2:3.2 3:1.3 4:0.2

    0 1:4.6 2:3.1 3:1.5 4:0.2

    0 1:5.0 2:3.6 3:1.4 4:0.2

    0 1:5.4 2:3.9 3:1.7 4:0.4

    0 1:4.6 2:3.4 3:1.4 4:0.3

    0 1:5.0 2:3.4 3:1.5 4:0.2

    0 1:4.4 2:2.9 3:1.4 4:0.2

    0 1:4.9 2:3.1 3:1.5 4:0.1

    0 1:5.4 2:3.7 3:1.5 4:0.2

    0 1:4.8 2:3.4 3:1.6 4:0.2

    0 1:4.8 2:3.0 3:1.4 4:0.1

    0 1:4.3 2:3.0 3:1.1 4:0.1

    0 1:5.8 2:4.0 3:1.2 4:0.2

    0 1:5.7 2:4.4 3:1.5 4:0.4

    0 1:5.4 2:3.9 3:1.3 4:0.4

    0 1:5.1 2:3.5 3:1.4 4:0.3

    0 1:5.7 2:3.8 3:1.7 4:0.3

    0 1:5.1 2:3.8 3:1.5 4:0.3

    0 1:5.4 2:3.4 3:1.7 4:0.2

    0 1:5.1 2:3.7 3:1.5 4:0.4

    0 1:4.6 2:3.6 3:1.0 4:0.2

    0 1:5.1 2:3.3 3:1.7 4:0.5

    0 1:4.8 2:3.4 3:1.9 4:0.2

    0 1:5.0 2:3.0 3:1.6 4:0.2

    0 1:5.0 2:3.4 3:1.6 4:0.4

    0 1:5.2 2:3.5 3:1.5 4:0.2

    0 1:5.2 2:3.4 3:1.4 4:0.2

    0 1:4.7 2:3.2 3:1.6 4:0.2

    0 1:4.8 2:3.1 3:1.6 4:0.2

    0 1:5.4 2:3.4 3:1.5 4:0.4

    0 1:5.2 2:4.1 3:1.5 4:0.1

    0 1:5.5 2:4.2 3:1.4 4:0.2

    0 1:4.9 2:3.1 3:1.5 4:0.1

    0 1:5.0 2:3.2 3:1.2 4:0.2

    0 1:5.5 2:3.5 3:1.3 4:0.2

    0 1:4.9 2:3.1 3:1.5 4:0.1

    0 1:4.4 2:3.0 3:1.3 4:0.2

    0 1:5.1 2:3.4 3:1.5 4:0.2

    0 1:5.0 2:3.5 3:1.3 4:0.3

    0 1:4.5 2:2.3 3:1.3 4:0.3

    0 1:4.4 2:3.2 3:1.3 4:0.2

    0 1:5.0 2:3.5 3:1.6 4:0.6

    0 1:5.1 2:3.8 3:1.9 4:0.4

    0 1:4.8 2:3.0 3:1.4 4:0.3

    0 1:5.1 2:3.8 3:1.6 4:0.2

    0 1:4.6 2:3.2 3:1.4 4:0.2

    0 1:5.3 2:3.7 3:1.5 4:0.2

    0 1:5.0 2:3.3 3:1.4 4:0.2

    1 1:7.0 2:3.2 3:4.7 4:1.4

    1 1:6.4 2:3.2 3:4.5 4:1.5

    1 1:6.9 2:3.1 3:4.9 4:1.5

    1 1:5.5 2:2.3 3:4.0 4:1.3

    1 1:6.5 2:2.8 3:4.6 4:1.5

    1 1:5.7 2:2.8 3:4.5 4:1.3

    1 1:6.3 2:3.3 3:4.7 4:1.6

    1 1:4.9 2:2.4 3:3.3 4:1.0

    1 1:6.6 2:2.9 3:4.6 4:1.3

    1 1:5.2 2:2.7 3:3.9 4:1.4

    1 1:5.0 2:2.0 3:3.5 4:1.0

    1 1:5.9 2:3.0 3:4.2 4:1.5

    1 1:6.0 2:2.2 3:4.0 4:1.0

    1 1:6.1 2:2.9 3:4.7 4:1.4

    1 1:5.6 2:2.9 3:3.6 4:1.3

    1 1:6.7 2:3.1 3:4.4 4:1.4

    1 1:5.6 2:3.0 3:4.5 4:1.5

    1 1:5.8 2:2.7 3:4.1 4:1.0

    1 1:6.2 2:2.2 3:4.5 4:1.5

    1 1:5.6 2:2.5 3:3.9 4:1.1

    1 1:5.9 2:3.2 3:4.8 4:1.8

    1 1:6.1 2:2.8 3:4.0 4:1.3

    1 1:6.3 2:2.5 3:4.9 4:1.5

    1 1:6.1 2:2.8 3:4.7 4:1.2

    1 1:6.4 2:2.9 3:4.3 4:1.3

    1 1:6.6 2:3.0 3:4.4 4:1.4

    1 1:6.8 2:2.8 3:4.8 4:1.4

    1 1:6.7 2:3.0 3:5.0 4:1.7

    1 1:6.0 2:2.9 3:4.5 4:1.5

    1 1:5.7 2:2.6 3:3.5 4:1.0

    1 1:5.5 2:2.4 3:3.8 4:1.1

    1 1:5.5 2:2.4 3:3.7 4:1.0

    1 1:5.8 2:2.7 3:3.9 4:1.2

    1 1:6.0 2:2.7 3:5.1 4:1.6

    1 1:5.4 2:3.0 3:4.5 4:1.5

    1 1:6.0 2:3.4 3:4.5 4:1.6

    1 1:6.7 2:3.1 3:4.7 4:1.5

    1 1:6.3 2:2.3 3:4.4 4:1.3

    1 1:5.6 2:3.0 3:4.1 4:1.3

    1 1:5.5 2:2.5 3:4.0 4:1.3

    1 1:5.5 2:2.6 3:4.4 4:1.2

    1 1:6.1 2:3.0 3:4.6 4:1.4

    1 1:5.8 2:2.6 3:4.0 4:1.2

    1 1:5.0 2:2.3 3:3.3 4:1.0

    1 1:5.6 2:2.7 3:4.2 4:1.3

    1 1:5.7 2:3.0 3:4.2 4:1.2

    1 1:5.7 2:2.9 3:4.2 4:1.3

    1 1:6.2 2:2.9 3:4.3 4:1.3

    1 1:5.1 2:2.5 3:3.0 4:1.1

    1 1:5.7 2:2.8 3:4.1 4:1.3

    特征选择

    20180110232825704929.png

    第一个特征权重为0,可以忽略,选择2,3,4个特征

    原文:http://www.cnblogs.com/xiaoma0529/p/6929051.html

    展开全文
  • 特征选择 Python代码

    千次阅读 2019-12-12 20:38:57
    一、特征选择 对与机器学习建模。在海量特征时,特征工程选择是必要的。特征工程很大程度上决定了模型的效果和模型的稳定性。特征工程中包函内容很多,包括数据分析,特征组合变换,特征选择和特征降维等等的技术。...

    本文利用python实现RFE特征选择、基于树模型的特征选择、lasso回归特征选择、Chi2特征选择、特征间相关性进行特征选择、IV值特征选择,K-S值特征选择。并放到一个类中,方便在数据建模时直接调用。

    一、特征选择

    对与机器学习建模。在海量特征时,特征工程选择是必要的。特征工程很大程度上决定了模型的效果和模型的稳定性。特征工程中包函内容很多,包括数据分析,特征组合变换,特征选择和特征降维等等的技术。特征工程和数据的清洗占据了建模过程中绝大部分的时间。其中特征选择是必不可少的阶段。
    当建模样本数量不足,但特征较多的时候。特征选择是必须的。因为参数的数量规模往往是与特征的多少是正相关的。如果没有足够的样本支撑特征参数的估计时,我们必须增加样本量,或减少估计的参数。
    一般出现两种情况时,我们要进行特征选择。
    首先,特征之间存在明显的相关性,我们称之为“冗余特征”,将这些特征全部加入模型训练是不必要的,甚至会导致参数的估计是不稳定,甚至是错误的。(计量经济学中也是同样的道理,样本数量小于参数数量,参数是估计不出来的。参数之间的共线性,导致参数估计不准确。)
    其次,当一个特征与我们模型的目标值不相关的时候,我们称之为“无关特征”。这类特征加入模型后相当于模型增加了噪声,模型变得“厚重”且“不稳定”。在建模的时候也必须将无用或者几乎没有作用的特征删除。
    特征选择对于建模往往具有以下作用:

    1. 减少建模使用特征的数量,使模型训练和预测用时更少
    2. 降低模型使用特征间的相关性,提高模型参数估计的精度
    3. 减少模型中无用的噪声,提高模型的稳定性

    二、特征的方法

    特征选择的目的是选择选择特征集的一个子集,对于特征集,需要搜索里面的可能特征子集使我们的评价函数达到最优。关于特征搜索,有一下三种方式:

    1. 完全搜索:即搜索所有可能的特征子集。计入试验,选取最优子集,复杂度太高。
    2. 启发式搜索:使用“贪心”思想,当一个特征加入已选特征子集后,从剩余的待选特征集中选择一个使目标值最优的特征加入已选特征子集。重复此步骤,直到停止条件
    3. 随机搜索:在模型的搜索中设置一些超参数或者条件。这些参数条件会应县特征选择,也使得搜索加速。

    而根据特征选择和评价的方式的不同,特征选择的算法通常分为三类:

    1. 过滤式(Filter):事先进行特征选择,再将选择的特征加入我们的机器学习模型。特征选择的方式与目标通常与我们选择的机器学习模型是无关的。常用的方法如:chi2检验,信息增益,相关系数法等等。在风控模型和一些评分卡模型中,也是用IV值,k-s值等进行特征选择。
    2. 包裹时(Wrapper):直接把最终将要使用的机器学习的评价函数作为特征子集的评价准则,选择可以使所用的机器学习性能最好的模型,如sklearn.feature_selection的RFE选择器。
    3. 嵌入式(Embedding):让模型在学习的过程中自动进行参数选择。如L1正则化,其结果是无用或惩罚较大的特征前的系数变为0。

    关于特征选择的方法,有很多文章进行了生动讲述,此处就不再重复了。可参考:
    链接: 机器学习:特征选择(feature selection)
    特征选择(feature selection)

    其中对于数值型特征,常用的特征选择方法有RFE特征选择、基于树模型的特征选择、lasso回归选择,其中一些方法选择特征时要注意对特征进行标准化。在风控领域中特常用IV值,K-S值进行特征选择。

    对于类别型特征,常用的特征选择方式是利用假设检验的方式进行卡方检验。

    三、一些特征选择方法的python实现

    **本文利用python实现RFE特征选择、基于树模型的特征选择、lasso回归特征选择、Chi2特征选择、特征间相关性进行特征选择、IV值特征选择,K-S值特征选择。**并放到一个类中,方便在数据建模时直接调用。

    # -*- coding: utf-8 -*-
    """
    Created on Thu Dec 12 19:23:11 2019
    @author: nbszg
    """
    
    import pandas as pd
    import numpy as np
    from scipy import stats
    from sklearn.feature_selection import RFE
    from sklearn.feature_selection import SelectKBest
    from sklearn.feature_selection import chi2
    from sklearn.linear_model import  LogisticRegression
    from sklearn.ensemble import ExtraTreesClassifier
    from sklearn.linear_model import  LassoCV
    
    #特征选择器
    class Feature_Selector(object):
        #用于计算特征列de WOE,WOE的计算是计算IV的基础步骤
        def woe_cul(self, df,col,label_col):
            '''
            用于计算特征列的 WOE
            df:存储特征与标签的dataframe
            col:需要计算的特征列名称
            label_col:标签列名称
            
            return:WOE计算结果的dataframe
            '''
            subdata=pd.DataFrame(df.groupby(col)[col].count())    #记录每个分组的数量
            subdata.rename(columns={col:'total'}, inplace=True)
            suby=pd.DataFrame(df.groupby(col)[label_col].sum())    #记录每个分组的正样本数量
            data=pd.DataFrame(pd.merge(subdata,suby,how="left",left_index=True,right_index=True))
            b_total=data[label_col].sum()    #记录正样本总数量
            total=data['total'].sum()   #总样本数量
            g_total=total-b_total   #负样本数量
            data["bad"]=data[label_col]/b_total   #每组正样本占比
            data["good"]=(data['total']-data[label_col])/g_total   #每组负样本占比
            data["WOE"]=data.apply(lambda x:np.log(x.bad/x.good),axis=1)   #woe计算公式
            
            return data.loc[:,["bad","good","WOE"]]
        #计算IV    
        def iv_cul(df):
            '''
            用于计算特征列的IV值
            df:WOE计算结果的dataframe
            
            return:计算特征列的IV值
            '''
            df["IV"]=df.apply(lambda x:(x.bad-x.good)*x.WOE,axis=1)    #IV的计算公式
            IV=sum(df["IV"])
            return IV
        #基于IV值的特征选择函数
        def iv_selector(self, df, feature_col, label_col, threshold=0.1):
            '''
            使用特征列与label列的IV值进行特征选择
            df:存储特征与标签的dataframe
            feature_col:可选择的特征列名列表为list
            label_col:标签列名称,为str
            threshold:选择的阈值,若ks值大于threshold,则加入到选择变量列表
            
            return:函数最终选择的特征列表
            '''
            n=20  #计算IV时需要将连续变量进行分组,这里分20组
            k=100//n   #用于后面的计算分位数
            iv_col=[]
            for col in feature_col:
                df_copy = df[[col, label_col]].copy()
                df_copy[col+'_group'] = df_copy[col]   #用于记录分组变量
                for i in range(n):
                    if i<n-1:
                        df_copy.loc[(df_copy[col]>=df_copy[col].quantile(k*i/100)) & (df_copy[col]<df_copy[col].quantile(k*(i+1)/100)),col+'_group'] = i+1   #记录变量所在的组数
                    else:
                        df_copy.loc[(df_copy[col]>=df_copy[col].quantile(k*i/100)) & (df_copy[col]<=df_copy[col].quantile(k*(i+1)/100)),col+'_group'] = i+1  #边界值特殊处理
                
                woe_trian = self.woe_cul(df_copy, col+'_group', label_col)#计算woe
                iv=self.iv_cul(woe_trian)   #计算IV值
                if iv>=threshold:
                    iv_col.append(col)
            
            return iv_col
        
        #计算ks值
        def ks_cal(self, df, score_col, label_col):
            '''
            用于计算特征列与标签列的ks值
            df:存储特征与标签的dataframe
            score_col:需要计算的特征列名称
            label_col:标签列名称
            
            return:计算ks值
            '''
            ks=0
            if (isinstance(score_col, str) and isinstance(label_col, str)):
                Bad = df.ix[df[label_col]==1,score_col]   #记录 label=1
                Good = df.ix[df[label_col]==0, score_col] #记录 label=0
                ks,pvalue = stats.ks_2samp(Bad.values,Good.values)   #计算ks
            else:
                raise TypeError("score_col or class_col must be str")
                
            return ks
        
        #基于ks值特征选择函数
        def ks_selector(self, df, feature_col, label_col, threshold=0.1):
            '''
            使用特征列与label列的ks值进行特征选择
            df:存储特征与标签的dataframe
            feature_col:可选择的特征列名列表为list
            label_col:标签列名称,为str
            threshold:选择的阈值,若ks值大于threshold,则加入到选择变量列表
            
            return:函数最终选择的特征列表
            '''
            ks_col=[]
            for col in feature_col:
                ks = self.ks_cal(df, col, label_col)
                if ks>=threshold:
                    ks_col.append(col)   #若ks值大于threshold,则加入到选择变量列表
            
            return ks_col
        
        #基于卡方检验的特征选择器
        def chi2_selector(self, df, feature_col, label_col, p=0.05):
            '''
            基于卡方检验的特征选择器
            df:存储特征与标签的dataframe
            feature_col:可选择的特征列名列表为list
            label_col:标签列名称,为str
            p:检验统计量对应p值的阈值
            
            return:函数最终选择的特征列表
            '''
            test = SelectKBest(score_func=chi2, k=len(feature_col))
            fit = test.fit(df[feature_col], df[label_col])
            select_col=np.array(feature_col)[test.pvalues_<p]
            return list(select_col)
        
        #基于Logistic的RFE特征选择函数
        def rfe_selector(self, df, feature_col, label_col, select_num):
            '''
            使用特征列与label列的进行RFE特征选择
            df:存储特征与标签的dataframe
            feature_col:可选择的特征列名列表为list
            label_col:标签列名称,为str
            select_num:需要选择的特征数量
            
            return:函数最终选择的特征列表
            '''
            if select_num>len(feature_col):
                raise ValueError("rfe_selector's select_num greater than length of feature_col")  #选择数量不可大于原有特征数量
            
            model = LogisticRegression()
            rfe = RFE(model, select_num)
            rfe = rfe.fit(df[feature_col], df[label_col])    #使用RFE进行选择
            rfe_col = list(np.array(feature_col)[rfe.support_])
            
            return rfe_col
        
        #基于树模型的选择函数
        def tree_selector(self, df, feature_col, label_col, select_num):
            '''
            使用特征列与label列,基于树模型进行特征选择
            df:存储特征与标签的dataframe
            feature_col:可选择的特征列名列表为list
            label_col:标签列名称,为str
            select_num:需要选择的特征数量
            
            return:函数最终选择的特征列表
            '''
            if select_num>len(feature_col):
                raise ValueError("tree_selector's select_num greater than length of feature_col")  #选择数量不可大于原有特征数量
            
            model = ExtraTreesClassifier()   #分类器
            model.fit(df[feature_col], df[label_col])   
            importance = pd.DataFrame()
            importance['col'] = feature_col
            importance['importance'] = model.feature_importances_   
            importance.sort_values('importance',ascending=False, inplace=True)   #按照树模型得到特征重要性排序
            tree_col = list(importance['col'][0:select_num])   #选择排在前select_num个特征
            
            return tree_col
        #基于lasso回归的特征选择,lasso回归可理解为带l1正则化的线性回归。
        def lassoCV_selector(self, df, feature_col, label_col, select_num, scale=True):
            '''
            基于lasso回归的特征选择,lasso回归可理解为带l1正则化的线性回归。
            df:存储特征与标签的dataframe
            feature_col:可选择的特征列名列表为list
            label_col:标签列名称,为str
            select_num:需要选择的特征数量
            scale:是否进行归一化,与树模型不同。回归参数大小对于规模敏感,因此需要归一化
            
            return:函数最终选择的特征列表
            '''
            if select_num>len(feature_col):
                raise ValueError("lassoCV_selector's select_num greater than length of feature_col")  #选择数量不可大于原有特征数量
            
            df_copy = df[feature_col].copy()
            df_copy[label_col] = df[label_col]
            if scale==True:
                for col in feature_col:
                    df_copy[col] = (df_copy[col]-df_copy[col].min())/(df_copy[col].max()-df_copy[col].min())   #因为基于回归,对规模敏感,因此需要归一化
    
            model_lasso = LassoCV(alphas = [0.1,1,0.001, 0.0005]).fit(df_copy[feature_col], df_copy[label_col])
            coef = pd.Series(model_lasso.coef_, index = feature_col)
            feature_importance = pd.DataFrame(coef.sort_values()).reset_index()
            head_list = list(feature_importance['index'].head(int(select_num/2)))     #选择参数大小排在select_num//2的特征
            tail_list = list(feature_importance['index'].tail(int(select_num/2)))    #因为参数估计可能为负数,设参数为正负数量各一半,因此还选择参数大小排在最后select_num//2的特征,也可以直接对参数直接取绝对值,排序后直接取select_num个
            lassoCV_col = head_list+tail_list
            
            return lassoCV_col
    
        #基于特征间相关性的特征选择器
        def relation_selector(self, df, feature_col, threshold=0.5):    #判断类别型特征间的相关性,将相关性高于threshold的两个特征删除一个
            '''
            基于特征间相关性的特征选择器
            df:存储特征与标签的dataframe
            feature_col:可选择的特征列名列表为list
            threshold:设定的特征相关性的阈值,相关系数高于threshold的两列特征,需要删除一列
            
            return:函数最终选择的特征列表
            '''
            drop_col = []   #用于记录删除的列
            corr_df=df[feature_col].corr()  #计算相关系数矩阵
            for i in range(len(feature_col)-1):
                #相关性高的两个特征中,将一个加入要删除的列表
                drop_col = drop_col+list(corr_df.ix[i][i+1:][corr_df.ix[i][i+1:]>threshold].index)    #因为对对称矩阵,且为了防止重复删除,只遍历矩阵的下三角部分即可,大于阈值的列加入删除列
            
            drop_col=list(set(drop_col))  #去重
            res_col=[]
            for col in feature_col:    #取feature_colfeature_col与drop_col的差集
                if col not in drop_col:
                    res_col.append(col)
            return res_col
    
    展开全文
  • 特征选择python代码

    千次阅读 2018-09-20 15:57:40
    为什么不做特征之间相关性的动作呢,我理解实际上决策树模型应该可以解决绝大部分此类的工作,但是做一下也不妨,很多人不做是因为代码较为麻烦,还要区分数值型还是字符型。简洁一点也不是什么坏事。 #coding=utf-...
  • 一、特征词选择与特征词权重关系开始学文本分类的时候经常要搞晕特征词选择和特征词权重这两个东西,因为两者都要进行量化,...特征词的选择算法有:文本特征选择的算法有基于文档频率(Document Frequency)、信息增...
  • 基于互信息的特征选择matlab代码
  • 资料来源,百度关键字搜索“特征选择 过滤式”的前二三十页不重复的数据(不得不说csdn的文章互抄率也太高了,而且好多优秀的文章都是从知乎转来的)、《机器学习》等平常看的书、google上“feature selection ...
  • java在文本分类中卡方的特征选择,在文本分类的特征选择阶段,一般使用“词汇t与类别c不相关”来做原假设,计算出的开方值越大,说明对原假设的偏离越大,我们越倾向于认为原假设的反面情况是正确的。选择的过程为每...
  • package ...import weka.attributeSelection.*;import weka.core.*;import weka.core.converters.ConverterUtils.*;import weka.classifiers.*;import weka.classifiers.meta.*;import ...
  • 嵌入式特征选择方法,号称结合了过滤式和包裹式的优点,将特征选择嵌入到模型构建的过程中: 这是特征选择的一整个流程的总结,所谓嵌入式特征选择,就是通过一些特殊的模型拟合数据然后根据模型自身的某些对于特征...
  • 1. 特征选择------sklearn代码1.1 特征选择------方差法忽略warning错误import warningswarnings.filterwarnings("ignore")# 方差法from sklearn.feature_selection import VarianceThresholdX = [[0, 2, 0, 3], [0,...
  • 特征选择 代码下载 本文主要介绍sklearn中进行特征选择的方法。 sklearn.feature_selection模块中的类可用于样本集的特征选择/降维,以提高估计量的准确性得分或提高其在超高维数据集上的性能。 单变量特征选择是...
  • # 取第i个特征和输出特征Y比较,使用随机森林rf模型和r2评估工具 # ShuffleSplit类用于将样本集合随机“打散”后划分为训练集、测试集 # 元素总数为len(X),重新洗牌和分裂迭代次数为3,test集所占比例为0.3 ...
  • 特征选择(含代码

    2019-09-12 14:20:06
    当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征: 特征是否发散:如果一个特征不发散,例如方差接近于0,也...根据特征选择的形式又可以将...
  • 前文提到过,除了分类算法以外,为分类文本作处理的特征提取算法也对最终效果有巨大影响,而特征提取算法又分为特征选择和特征抽取两大类,其中特征选择算法有互信息,文档频率,信息增益,开方检验等等十数种,这次...
  • 单变量过滤方法主要是基于特征变量和目标变量之间的相关性、互信息等计算出来的,总结如下:1、最简单的方差选择法from sklearn.feature_selection import VarianceThreshold result=VarianceThreshold(threshold=...
  • 特征选择 代码下载 本文主要介绍sklearn中进行特征选择的方法。 sklearn.feature_selection模块中的类可用于样本集的特征选择/降维,以提高估计量的准确性得分或提高其在超高维数据集上的性能。 文章目录1 Select...
  • 特征选择是一个重要的数据预处理过程,在现实机器学习任务中,获得数据之后通常先进行特征选择,此后在训练学习器,如下图所示:进行特征选择有两个很重要的原因:避免维数灾难:能剔除不相关(irrelevant)或冗余...
  • 两行代码完成特征工程-基于Python的特征自动化选择代码(提供下载)特征工程往往需要大量代码进行数据处理,本文介绍一个特征选择神器:FeatureSelector是用于减少机器学习数据集的维数的工具,可以傻瓜式地进行特征...
  • 本文介绍一个特征选择神器:特征选择器是用于减少机器学习数据集的维数的工具,可以傻瓜式地进行特征选择,两行代码即可搞定!!来源:Will Koehrsen代码整理及注释翻译:黄海广代码和数...
  • 克隆代码有害性预测中的特征选择模型
  • 单变量过滤方法主要是基于特征变量和目标变量之间的相关性、互信息等计算出来的,总结如下:1、最简单的方差选择法from sklearn.feature_selection import VarianceThreshold result=VarianceThreshold(threshold=...
  • 昨天考察了加入噪声的feature importance和... 在介绍shap之前,我们来回顾一下shap之前的树的特征重要性有哪些变体的应用: 1、permutation_importance 这个也是eli5带有的功能,原理如下: (摘录自http://sofa...
  • 特征选择DF方法实现源代码

    热门讨论 2010-11-12 14:02:48
    特征选择DF方法实现源代码 要求要先自行分好词 代码中有详细注释

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,300
精华内容 1,320
关键字:

特征选择代码