机器学习笔记(二)——特征工程


前言

特征工程是利用数据领域的相关知识来创建能够使机器学习算法达到最佳性能的特征的过程。简而言之,特征工程就是一个把原始数据转变成特征的过程,这些特征可以很好的描述这些数据,并且利用它们使机器学习算法达到最佳性能(或者接近最佳性能)。

特征工程的重要性:业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。

本文将介绍特征工程包含的三个主要内容:特征抽取、特征预处理以及特征降维。

一、数据集

要进行机器学习,先要有数据,即数据集是机器学习的基础。没有数据集,机器无法训练学习,进而无法预测。因此,数据集对于机器学习是十分重要的。

概念

数据集,又称为资料集、数据集合或资料集合,是一种由数据所组成的集合。Data set(或dataset)是一个数据的集合,通常以表格形式出现。每一列代表一个特定变量。每一行都对应于某一成员的数据集的问题。它列出的价值观为每一个变量,如身高和体重的一个物体或价值的随机数。每个数值被称为数据资料。对应于行数,该数据集的数据可能包括一个或多个成员。

可用数据集

Kaggle、scikit-learn、UCI三个数据集是我们机器学习经常使用的三个数据集。
在这里插入图片描述

Kaggle

Kaggle是由联合创始人、首席执行官安东尼·高德布卢姆(Anthony Goldbloom)2010年在墨尔本创立的,主要为开发商和数据科学家提供举办机器学习竞赛、托管数据库、编写和分享代码的平台。该平台已经吸引了80万名数据科学家的关注,这些用户资源或许正是吸引谷歌的主要因素。
Kaggle网址:Kaggle网址

UCI

UCI数据集是一个常用的机器学习标准测试数据集,是加州大学欧文分校(University of CaliforniaIrvine)提出的用于机器学习的数据库。机器学习算法的测试大多采用的便是UCI数据集了,其重要之处在于“标准”二字,新编的机器学习程序可以采用UCI数据集进行测试,类似的机器学习算法也可以一较高下。

UCI数据集网址

Scikit-learn

介绍
scikit-learn网址

2007年,Scikit-learn首次被Google Summer of Code项目开发使用,现在已经被认为是最受欢迎的机器学习Python库。

Scikit-learn被视为机器学习项目(尤其是在生产系统中)最佳选择之一的原因有很多,包括且不限于以下内容:

Scikit-learn是一个非常强大的工具,能为库的开发提供了高水平的支持和严格的管理。

清晰一致的代码样式可确保我们的机器学习代码易于理解和再现,并大大降低了对机器学习模型进行编码的入门门槛。

Scikit-learn得到了很多第三方工具的支持,有非常丰富的功能适用于各种用例。

Scikit-learn库具有:分类、聚类、回归特征工程、模型选择、调优等功能。

安装
打开cmd,输入

pip3 --default-timeout=100 install Scikit-learn-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

安装好之后可以通过以下命令查看是否安装成功

pip list
注:安装scikit-learn需要Numpy, Scipy等库

scikit-learn数据集API介绍

sklearn.datasets:加载获取流行数据集
datasets.load_*():获取小规模数据集,数据包含在datasets里
datasets.fetch_*(data_home=None):获取大规模数据集,需要从网络上下载,函数的第一个参数data_home是数据集下载的目录

sklearn小数据集
sklearn.datasets.load_iris():加载并返回鸢尾花数据集
sklearn.datasets.load_boston():加载并返回波士顿房价数据集

sklearn大数据集
sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
subset:‘train’或者’test’,'all’都可选

鸢尾花案例

在这里插入图片描述
sklearn数据集返回值介绍

load和fetch返回的数据类型datasets.base.Bunch(字典格式)
data:特征数据数组,是 [n_samples * n_features] 的二维 numpy.ndarray 数组
target:标签数组,是 n_samples 的一维 numpy.ndarray 数组
DESCR:数据描述
feature_names:特征名,新闻数据,手写数字、回归数据集没有
target_names:标签名(目标值名)
代码

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split


def datasets_demo():
    """
    对鸢尾花数据集的演示
    :return: None
    """
    # 1、获取鸢尾花数据集
    iris = load_iris()
    print("鸢尾花数据集的返回值:\n", iris)
    # 返回值是一个继承自字典的Bench
    print("鸢尾花的特征值:\n", iris["data"]) # 或者是iris.data
    print("鸢尾花的目标值:\n", iris.target)
    print("鸢尾花特征的名字:\n", iris.feature_names)
    print("鸢尾花目标值的名字:\n", iris.target_names)
    print("鸢尾花的描述:\n", iris.DESCR)
    return None


if __name__ == '__main__':
    datasets_demo()

数据集的划分

在机器学习中我们一般会将数据集划分为两个部分:一部分用来训练,另一部分用来测试

训练数据:用于训练,构建模型
测试数据:在模型检验时使用,用于评估模型是否有效

划分比例:
训练集:70% 80% 75%
测试集:30% 20% 30%
API
sklearn.model_selection.train_test_split(arrays, *options)
x 数据集的特征值
y 数据集的目标值
test_size 测试集的大小,一般为float
random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
return 测试集特征训练集特征值值,训练标签,测试标签(默认随机取)
代码

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split


def datasets_demo():
    """
    对鸢尾花数据集的演示
    :return: None
    """
    # 1、获取鸢尾花数据集
    iris = load_iris()
    print("鸢尾花数据集的返回值:\n", iris)
    # 返回值是一个继承自字典的Bench
    print("鸢尾花的特征值:\n", iris["data"])
    print("鸢尾花的目标值:\n", iris.target)
    print("鸢尾花特征的名字:\n", iris.feature_names)
    print("鸢尾花目标值的名字:\n", iris.target_names)
    print("鸢尾花的描述:\n", iris.DESCR)

    # 2、对鸢尾花数据集进行分割
    # 训练集的特征值x_train 测试集的特征值x_test 训练集的目标值y_train 测试集的目标值y_test
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
    print("x_train:\n", x_train.shape)
    # 随机数种子
    x_train1, x_test1, y_train1, y_test1 = train_test_split(iris.data, iris.target, random_state=6)
    x_train2, x_test2, y_train2, y_test2 = train_test_split(iris.data, iris.target, random_state=6)
    print("如果随机数种子不一致:\n", x_train == x_train1)
    print("如果随机数种子一致:\n", x_train1 == x_train2)

    return None


if __name__ == '__main__':
    datasets_demo()

程序数据集下载

链接:https://pan.baidu.com/s/13XfEDISFtkorbLzbgbP6ig
提取码:ac12

二、特征抽取

介绍

将任意数据(如文本、图像等)转变为可用于机器学习的数字特征。

注:特征值化是为了计算机更好的去理解数据

特征提取API
sklearn.feature_extraction

字典的特征提取

sklearn.feature_extraction.DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
DictVectorizer.get_feature_names() 返回类别名称
实例
数据

[{'city': '北京','temperature':100}
{'city': '上海','temperature':60}
{'city': '深圳','temperature':30}]

步骤
1.实例化一个转换器类
2.调用fit_transform

from sklearn.feature_extraction import DictVectorizer


data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]
# 示例化容器
transfer = DictVectorizer(sparse=False)
# 调用fit_transform
data_new = transfer.fit_transform(data)
print("特征名字:\n", transfer.get_feature_names())
print("返回的结果:\n", data_new)

返回结果
在这里插入图片描述

文本特征提取(英文)

API
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

返回词频矩阵
CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
CountVectorizer.get_feature_names() 返回值:单词列表
sklearn.feature_extraction.text.TfidfVectorizer

数据

["Life goes on and on and on",
"On the road of youth, you and I walk together",
"life is short,i like python",
"life is too long,i dislike python"
]

步骤
1.实例化一个转换器类CountVectorizer
2.调用fit_transform方法输入数据并转换 (注意返回格式利用toarray()进行sparse矩阵转换array组)

from sklearn.feature_extraction.text import CountVectorizer


data = ["Life goes on and on and on", "On the road of youth, you and I walk together", "life is short,i like python", "life is too long,i dislike python"]
# 实例化容器
transfer = CountVectorizer()
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("返回特征名字:\n", transfer.get_feature_names())
print("文本特征抽取的结果:\n", data_new.toarray())

运行结果
在这里插入图片描述

中文文本特征提取

由于CountVectorizer()函数默认是以空格作为作为分隔符,所以如果我们对中文文本不做处理,将无法对中文文本的词语进行特征提取。
例如

"人生苦短,我喜欢Python" "生活太长久,我不喜欢Python"
from sklearn.feature_extraction.text import CountVectorizer

data = ["人生苦短,我喜欢Python" "生活太长久,我不喜欢Python"]
# 实例化容器
transfer = CountVectorizer()
# 2、调用fit_transform
data_new = transfer.fit_transform(data)
print("返回特征名字:\n", transfer.get_feature_names())
print("文本特征抽取的结果:\n", data_new.toarray())

将会得到下面的结果:
在这里插入图片描述
所以我们要对中文进行分词处理

jieba分词处理

jieba.cut() :返回词语组成的生成器

安装

pip3 --default-timeout=100 install jieba-i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

使用案例:

今天很残酷,明天更残酷,后天很美好,
但绝对大部分是死在明天晚上,所以每个人不要放弃今天。

我们看到的从很远星系来的光是在几百万年之前发出的,
这样当我们看到宇宙时,我们是在看它的过去。

如果只用一种方式了解某样事物,你就不会真正了解它。
了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系

步骤:
1.对文本进行jieba分词
2.实例化转器类CountVectorizer()
3.调用fit_transform

代码:

import jieba
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer

# 进行分词处理
def cut_words(text):
    """
       对中文进行分词
       "我爱北京天安门"————>"我 爱 北京 天安门"
       :param text:
       :return: text
    """
    text = " ".join(list(jieba.cut(text)))
    # 将列表转化为字符串:"".jion(list)
    return text


def Chinese_cutwords():
    # 讲中文文本分词
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    list_new = []
    for sentence in data:
        text = cut_words(sentence)
        list_new.append(text)
    # print(list_new)
    # 1、实例化一个转换器类
    # transfer = CountVectorizer(sparse=False)
    transfer = CountVectorizer(stop_words=["一种", "不会", "只要"])
    # 2、调用fit_transform
    data = transfer.fit_transform(list_new)
    print("文本特征抽取的结果:\n", data.toarray())
    print("返回特征名字:\n", transfer.get_feature_names())
    return None


if __name__ == '__main__':

    Chinese_cutwords()
    

运行结果:
在这里插入图片描述
缺点:不能处理某个词或短语在多篇文章中出现的次数高这种情况

Tf-idf文本特征提取

TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
公式
词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
tfidf公式。
在这里插入图片描述

最终得出结果可以理解为重要程度。

注:假如一篇文件的总词语数是100个,而词语"非常"出现了5次,那么"非常"一词在该文件中的词频就是5/100=0.05。而计算文件频率(IDF)的方法是以文件集的文件总数,除以出现"非常"一词的文件数。所以,如果"非常"一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是lg(10,000,000 / 1,0000)=3。最后"非常"对于这篇文档的tf-idf的分数为0.05 * 3=0.15

Tf-idf的重要性
分类机器学习算法进行文章分类中前期数据处理方式

案例:

import jieba
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer

def cut_words(text):
    """
       对中文进行分词
       "我爱北京天安门"————>"我 爱 北京 天安门"
       :param text:
       :return: text
    """
    text = " ".join(list(jieba.cut(text)))
    # 将列表转化为字符串:"".jion(list)
    return text
   

def Chinense_tfidf():
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    list1 = []
    for sentence in data:
        text = cut_words(sentence)
        list1.append(text)
    # 实例化一个转化器类
    transfer = TfidfVectorizer(stop_words=["一种", "不要"])
    # 调用 fit_transform
    new_data = transfer.fit_transform(list1)
    # 打印信息
    print("文本特征抽取结果:\n", new_data.toarray())
    print("返回特征名字:\n", transfer.get_feature_names())
    return None


if __name__ == '__main__':

    Chinense_tfidf()

运行结果:
在这里插入图片描述

三、特征预处理

介绍

通过一些函数将原来的特征数据转换为更加适合算法模型的特征数据。

包含内容

归一化,标准化
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征,为什么我们要进行归一化/标准化。

归一化

1 定义
通过对原始数据进行变换把数据映射到(默认为[0,1])之间

2 公式
在这里插入图片描述
3 API
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
MinMaxScalar.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
4 案例
数据

步骤:
1.调用容器类:MinMaxScaler()
2.调用fit_transform()
代码:

import pandas as pd
from sklearn.preprocessing import MinMaxScaler


def minmaxdemo():
    data = pd.read_csv("datingTestSet2.csv")
    print(data)
    data = data.iloc[:, :3]
    # 实例化一个容器类
    transfer = MinMaxScaler()
    # 调用fit_transform
    new_data = transfer.fit_transform(data)
    print("data_new:\n", new_data)
    return None


if __name__ == '__main__':
    minmaxdemo()

由于归一化容易受异常数据点的影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

标准一化

1 定义
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
2.公式
在这里插入图片描述
3.优点
就算出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小
4.API
sklearn.preprocessing.StandardScaler( )
处理之后每列来说所有数据都聚集在均值0附近标准差差为1
StandardScaler.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array
5.案例
步骤:
1、实例化StandardScaler
2、通过fit_transform转换
代码:

import pandas as pd
from sklearn.preprocessing import StandardScaler


def stand_demo():
    data = pd.read_csv("datingTestSet2.csv")
    print(data)
    data = data.iloc[:, :3]
    # 实例化一个容器类
    transfer = StandardScaler()
    # 调用fit_transform
    new_data = transfer.fit_transform(data)
    print("标准化的结果:\n", new_data)
    print("每一列特征的平均值:\n", transfer.mean_)
    print("每一列特征的方差:\n", transfer.var_)
    return None


if __name__ == '__main__':
    stand_demo()

运行结果:
在这里插入图片描述

在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

四、特征降维

介绍

当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。降维降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程。
降维作用:
  1)降低时间复杂度和空间复杂度
  2)节省了提取不必要特征的开销
  3)去掉数据集中夹杂的噪
  4)较简单的模型在小数据集上有更强的鲁棒性
  5)当数据能有较少的特征进行解释,我们可以更好 的解释数据,使得我们可以提取知识。
  6)实现数据可视化

包含内容

特征选择
主成分分析(可以理解一种特征提取的方式)

特征选择

介绍

定义:数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。
方法
Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联,有方差选择法(低方差特征过滤) 和相关系数法
Embedded (嵌入式):算法自动选择特征(特征与目标值之间的关联)
决策树:信息熵、信息增益
正则化:L1、L2
深度学习:卷积等
模块
sklearn.feature_selection

过滤式

低方差过滤

删除低方差的一些特征,前面讲过方差的意义。再结合方差的大小来考虑这个方式的角度。

特征方差小:某个特征大多样本的值比较相近
特征方差大:某个特征很多样本的值都有差别
API
sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
删除所有低方差特征
Variance.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
数据计算
我们对某些股票的指标特征之间进行一个筛选,数据在"factor_regression_data/factor_returns.csv"文件当中,除去’index,‘date’,'return’列不考虑(这些类型不匹配,也不是所需要指标)
一共这些特征:

pe_ratio,pb_ratio,market_cap,return_on_asset_net_profit,du_return_on_equity,ev,earnings_per_share,revenue,total_expense
index,pe_ratio,pb_ratio,market_cap,return_on_asset_net_profit,du_return_on_equity,ev,earnings_per_share,revenue,total_expense,date,return
0,000001.XSHE,5.9572,1.1818,85252550922.0,0.8008,14.9403,1211444855670.0,2.01,20701401000.0,10882540000.0,2012-01-31,0.027657228229937388
1,000002.XSHE,7.0289,1.588,84113358168.0,1.6463,7.8656,300252061695.0,0.326,29308369223.2,23783476901.2,2012-01-31,0.08235182370820669
2,000008.XSHE,-262.7461,7.0003,517045520.0,-0.5678,-0.5943,770517752.56,-0.006,11679829.03,12030080.04,2012-01-31,0.09978900335112327
3,000060.XSHE,16.476,3.7146,19680455995.0,5.6036,14.617,28009159184.6,0.35,9189386877.65,7935542726.05,2012-01-31,0.12159482758620697
4,000069.XSHE,12.5878,2.5616,41727214853.0,2.8729,10.9097,81247380359.0,0.271,8951453490.28,7091397989.13,2012

步骤
1.初始化VarianceThreshold
2、调用fit_transform

from sklearn.feature_selection import VarianceThreshold
import pandas as pd


def Variance():
    data = pd.read_csv("factor_returns.csv")
    print(data)
    # 实例化一个转换器类
    transfer = VarianceThreshold(threshold=1)
    # 2、调用fit_transform
    data = transfer.fit_transform(data.iloc[:, 1:10])
    print("删除低方差特征的结果:\n", data)
    print("形状:\n", data.shape)

    return None


if __name__ == '__main__':
    Variance()

运行结果:
在这里插入图片描述

相关系数

公式:
在这里插入图片描述
特点
相关系数的值介于–1与+1之间,即–1≤ r ≤+1。其性质如下:

当r>0时,表示两变量正相关,r<0时,两变量为负相关
当|r|=1时,表示两变量为完全相关,当r=0时,表示两变量间无相关关系
当0<|r|<1时,表示两变量存在一定程度的相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量			的线性相关越弱
一般可按三级划分:|r|<0.4为低度相关;0.4≤|r|<0.7为显著性相关;0.7≤|r|<1为高度线性相关
这个符号:|r|为r的绝对值, |-5| = 5

API
from scipy.stats import pearsonr
x : (N,) array_like
y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)
案例
股票的财务指标相关性计算
我们刚才的股票的这些指标进行相关性计算, 假设我们以
factor = [‘pe_ratio’,‘pb_ratio’,‘market_cap’,‘return_on_asset_net_profit’,‘du_return_on_equity’,‘ev’,‘earnings_per_share’,‘revenue’,‘total_expense’]
这些特征当中的两两进行计算,得出相关性高的一些特征。
代码:

import pandas as pd
from scipy.stats import pearsonr


def pearsnor_demo():
    # 读取数据
    data = pd.read_csv("./factor_returns.csv")
    # print(data)
    # 指标
    factor = ['pe_ratio', 'pb_ratio', 'market_cap', 'return_on_asset_net_profit', 'du_return_on_equity', 'ev',
              'earnings_per_share', 'revenue', 'total_expense']
    # print(len(factor))
    # range(0, 5);[0, 1, 2, 3, 4]
    # r = pearsonr(data['pe_ratio'], data['pb_ratio'])
    # print(r[0])
    for i in range(0, len(factor)-1):
        for j in range(i+1, len(factor)):
            print(
                "指标%s与指标%s之间的相关性大小为%f" % (factor[i], factor[j], pearsonr(data[factor[i]], data[factor[j]])[0]))
            # print("指标%s与指标%s之间的相关性大小为%f" % (factor[i], factor[j], r))
    return None


if __name__ == '__main__':
    pearsnor_demo()

运行结果:

指标pe_ratio与指标pb_ratio之间的相关性大小为-0.004389
指标pe_ratio与指标market_cap之间的相关性大小为-0.068861
指标pe_ratio与指标return_on_asset_net_profit之间的相关性大小为-0.066009
指标pe_ratio与指标du_return_on_equity之间的相关性大小为-0.082364
指标pe_ratio与指标ev之间的相关性大小为-0.046159
指标pe_ratio与指标earnings_per_share之间的相关性大小为-0.072082
指标pe_ratio与指标revenue之间的相关性大小为-0.058693
指标pe_ratio与指标total_expense之间的相关性大小为-0.055551
指标pb_ratio与指标market_cap之间的相关性大小为0.009336
指标pb_ratio与指标return_on_asset_net_profit之间的相关性大小为0.445381
指标pb_ratio与指标du_return_on_equity之间的相关性大小为0.291367
指标pb_ratio与指标ev之间的相关性大小为-0.183232
指标pb_ratio与指标earnings_per_share之间的相关性大小为0.198708
指标pb_ratio与指标revenue之间的相关性大小为-0.177671
指标pb_ratio与指标total_expense之间的相关性大小为-0.173339
指标market_cap与指标return_on_asset_net_profit之间的相关性大小为0.214774
指标market_cap与指标du_return_on_equity之间的相关性大小为0.316288
指标market_cap与指标ev之间的相关性大小为0.565533
指标market_cap与指标earnings_per_share之间的相关性大小为0.524179
指标market_cap与指标revenue之间的相关性大小为0.440653
指标market_cap与指标total_expense之间的相关性大小为0.386550
指标return_on_asset_net_profit与指标du_return_on_equity之间的相关性大小为0.818697
指标return_on_asset_net_profit与指标ev之间的相关性大小为-0.101225
指标return_on_asset_net_profit与指标earnings_per_share之间的相关性大小为0.635933
指标return_on_asset_net_profit与指标revenue之间的相关性大小为0.038582
指标return_on_asset_net_profit与指标total_expense之间的相关性大小为0.027014
指标du_return_on_equity与指标ev之间的相关性大小为0.118807
指标du_return_on_equity与指标earnings_per_share之间的相关性大小为0.651996
指标du_return_on_equity与指标revenue之间的相关性大小为0.163214
指标du_return_on_equity与指标total_expense之间的相关性大小为0.135412
指标ev与指标earnings_per_share之间的相关性大小为0.196033
指标ev与指标revenue之间的相关性大小为0.224363
指标ev与指标total_expense之间的相关性大小为0.149857
指标earnings_per_share与指标revenue之间的相关性大小为0.141473
指标earnings_per_share与指标total_expense之间的相关性大小为0.105022
指标revenue与指标total_expense之间的相关性大小为0.995845

主成分分析

介绍
定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量

作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。

应用:回归分析或者聚类分析当中
API

sklearn.decomposition.PCA(n_components=None):将数据分解为较低维数空间
n_components:

小数:表示保留百分之多少的信息
整数:减少到多少特征

PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
返回值:转换后指定维度的array
数据:

[[2,8,4,5],
[6,3,0,8],
[5,4,9,1]]

代码:

from sklearn.decomposition import PCA


def pca_demo():
    data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]
    # 实例化一个容器类 保留90%
    transfer = transfer = PCA(n_components=0.9)
    # 调用fit_transform
    data1 = transfer.fit_transform(data)

    print("保留90%的信息,降维结果为:\n", data1)

    # 1、实例化PCA, 整数——指定降维到的维数
    transfer2 = PCA(n_components=3)
    # 2、调用fit_transform
    data2 = transfer2.fit_transform(data)
    print("降维到3维的结果:\n", data2)
    return None


if __name__ == '__main__':
    pca_demo()

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值