特征的转换_06-特征降维PCA

来源:互联网 发布:java写的程序怎么运行 编辑:程序博客网 时间:2024/06/05 11:29

1. 为什么特征要降维?

(1)特征之间如果存在多重共线性,或者说是较高的相似性,则模型会不准确,或被高估了水平,PCA降维可以消除特征之间的相似性,保持特征的独立性。

(2)特征太多则模型复杂,在保持模型表现能力不减弱的情况下对特征进行降低维度能够简化模型。

2. 如何降维?

比如有特征x1, x2, x3.
寻找PC1 = w11*x1 + w12*x2 + w13*x3; PC2 = w21*x1 + w22*x2 + w23*x3
PC1, PC2就是降维后的新特征,w11表示元特征x1可以被新特征PC1解释的程度。

如果原来的3个特征有较大的相似性,那么PC1就是取出了他们某个相同的特征信息,通过加权形成了一个专门用来解释这类特征信息的新特征。PC2也同理。也就是说PC1, PC2都是提取了原来特征中某个特征信息,保证了新特征之间的独立性,从而也降低了特征的维度,简化了模型。

3.代码

object FeatureTransform01 {  def main(args: Array[String]) {    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)    val conf = new SparkConf().setAppName("FeatureTransform01").setMaster("local")    val sc = new SparkContext(conf)    val spark = SparkSession      .builder()      .appName("Feature Extraction")      .config("spark.some.config.option", "some-value")      .getOrCreate()    // 创建3个样本5个特征的DataFrame    val data = Array(      Vectors.sparse(5, Seq((1, 1.0), (3, 7.0))),      Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),      Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0)    )    val df = spark.createDataFrame(data.map(Tuple1.apply)).toDF("features")    df.show(false)    // 进行PCA降维,维度维3    val pca = new PCA()      .setInputCol("features")      .setOutputCol("pcaFeatures")      .setK(3)      .fit(df)    // 转换    val result = pca.transform(df)    result.show(false)    sc.stop()  }}

打印结果:5个特征降低到3个特征。

+---------------------+|features             |+---------------------+|(5,[1,3],[1.0,7.0])  ||[2.0,0.0,3.0,4.0,5.0]||[4.0,0.0,0.0,6.0,7.0]|+---------------------++---------------------+-----------------------------------------------------------+|features             |pcaFeatures                                                |+---------------------+-----------------------------------------------------------+|(5,[1,3],[1.0,7.0])  |[1.6485728230883807,-4.013282700516296,-5.524543751369388] ||[2.0,0.0,3.0,4.0,5.0]|[-4.645104331781534,-1.1167972663619026,-5.524543751369387]||[4.0,0.0,0.0,6.0,7.0]|[-6.428880535676489,-5.337951427775355,-5.524543751369389] |+---------------------+-----------------------------------------------------------+
0 0