什么是机器学习的特征工程?【数据集特征抽取(字典,文本TF-Idf)、特征预处理(标准化,归一化)、特征降维(低方差,相关系数,PCA)】
阅读原文时间:2022年04月05日阅读:1

2.特征工程

2.1.1 可用数据集

Kaggle网址:https://www.kaggle.com/datasets

UCI数据集网址: http://archive.ics.uci.edu/ml/

scikit-learn网址:http://scikit-learn.org/stable/datasets/index.html#datasets

2.1.2 安装scikit-learn工具

pip3 install Scikit-learn==0.19.1

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

import sklearn

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

  • 分类、聚类、回归
  • 特征工程
  • 模型选择、调优

2.1.3 sklearn数据集

1 scikit-learn数据集API介绍

  • sklearn.datasets

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

2 sklearn小数据集

  • sklearn.datasets.load_iris()

    加载并返回鸢尾花数据集

  • sklearn.datasets.load_boston()

    加载并返回波士顿房价数据集

3 sklearn大数据集

  • sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)

    • subset:'train'或者'test','all',可选,选择要加载的数据集。
    • 训练集的“训练”,测试集的“测试”,两者的“全部”。

4 sklearn数据集返回值介绍

  • load和fetch

    返回的数据类型datasets.base.Bunch(字典格式)

    • data:特征数据数组,是 [n_samples * n_features] 的二维 numpy.ndarray 数组
    • target:标签数组,是 n_samples 的一维 numpy.ndarray 数组
    • DESCR:数据描述
    • feature_names:特征名,新闻数据,手写数字、回归数据集没有
    • target_names:标签名

2.1.4 数据集划分

机器学习一般的数据集会划分为两个部分:

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

划分比例:

  • 训练集:70% 80% 75%
  • 测试集:30% 20% 25%

数据集划分api

  • sklearn.model_selection.train_test_split(arrays, *options)

    • x 数据集的特征值
    • y 数据集的标签值
    • test_size 测试集的大小,一般为float
    • random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
    • return 测试集特征训练集特征值值,训练标签,测试标签(默认随机取)

使用这个方法的时候要注意返回值的接收顺序:

x_train, x_test, y_train, y_test 分别表示 :训练集的特征值、测试集的特征值;训练集的目标值、测试集的目标值。

def datasets_demo():
    """
    sklearn数据集使用(划分)
    :return:
    """
    # 获取数据集
    iris = load_iris()
    print("鸢尾花数据集:\n", iris)
    print("查看数据集描述:\n", iris["DESCR"])
    print("查看特征值的名字:\n", iris.feature_names)
    print("查看特征值:\n", iris.data, iris.data.shape)

    # 训练集的特征值x_train 测试集的特征值x_test 训练集的目标值y_train 测试集的目标值y_test(x是特征,y是目标)
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.5, random_state=22)
    print("训练集的特征值:\n", x_train, x_train.shape)

    return None

2.2.1 什么是特征抽取

1 将任意数据(如文本或图像)转换为可用于机器学习的数字特征

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

  • 字典特征提取(特征离散化)
  • 文本特征提取
  • 图像特征提取(深度学习将介绍)

2 特征提取API

sklearn.feature_extraction

2.2.2 字典特征提取

作用:对字典数据进行特征值化

  • sklearn.feature_extraction.DictVectorizer(sparse=True,…)

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

1 应用

我们对以下数据进行特征提取

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

2 流程分析

  • 实例化类DictVectorizer

  • 调用fit_transform方法输入数据并转换(注意返回格式)

    def dict_demo():
    """
    字典特征抽取
    :return:
    """
    data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
    # 1、实例化一个转换器类(One-Hot编码)
    """
    sparse=True 稀疏矩阵:用位置编号+数据表示(不包括数据0)
    (0, 1) 1.0
    (0, 3) 100.0
    (1, 0) 1.0
    (1, 3) 60.0
    (2, 2) 1.0
    (2, 3) 30.0
    sparse=False
    """
    transfer = DictVectorizer(sparse=True)

    # 2、调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("字典特征抽取:\n",data_new)
    # print("data_new:\n", data_new.toarray(), type(data_new))
    print("特征名字:\n", transfer.get_feature_names())
    return None
  • 我的理解是:用0,1的方式来表示非数值化数据的位置,如果在那个位置有这个数据,那么置为1,如果没有置为0。

  • 这里有一个小知识点就是稀疏矩阵,如果sparse=True,那么输出结果将变成【非0位置,非0值】这样来表示,如果数据的特征值很多,那么就会出现很多个0,这样表示会更省内存。如果使用sparse=False,那么就是我们最常见的矩阵形式。

sparse=True

  (0, 1)    1.0
  (0, 3)    100.0
  (1, 0)    1.0
  (1, 3)    60.0
  (2, 2)    1.0
  (2, 3)    30.0

sparse=False

[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]
特征名字:
 ['city=上海', 'city=北京', 'city=深圳', 'temperature']

3 小结

当数据中存在类别信息(比如这个例子中不同的地点)的时候,我们会选择用字典特征提取。


2.3.3 文本特征提取

作用:对文本数据进行特征值化

  • 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

1 英文

def count_demo():
    """
    文本特征抽取:CountVecotrizer
    :return:
    """
    data = ["life is short,i like like python", "life is too long,i dislike python"]
    # 1、实例化一个转换器类(把出现过的单词都放进来返回,返回数组,表示这些出现过的单词在特征句子中出现的次数)
    transfer = CountVectorizer(stop_words=["is", "too"])

    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names())

    return None

输出结果:

data_new:
 [[0 1 2 0 1 1]
 [1 1 0 1 1 0]]
特征名字:
 ['dislike', 'life', 'like', 'long', 'python', 'short']

2 中文(结巴分词)

pip3 install jieba


def cut_word(text):
    """
    进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门"
    :param text:
    :return:
    """
    return " ".join(list(jieba.cut(text)))

def count_chinese_demo2():
    """
    中文文本特征抽取,自动分词
    :return:
    """
    # 将中文文本进行分词
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    # print(data_new)
    # 1、实例化一个转换器类
    transfer = CountVectorizer(stop_words=["一种", "所以"])

    # 2、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names())

    return None

输出结果:

data_new:
 [[0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 1 0]
 [0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 0 1]
 [1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0 0]]
特征名字:
 ['不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']

注:这里面的数值表示分析出来的特征名字在不同的样本中出现的次数,比如第一行 [0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 1 0] 第六个数字2表示在第一行文字中,“今天” 这个词出现了两次。

2.3.4 Tf-Idf 文本特征提取

  • TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
  • TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

1 公式

  • 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
  • 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到

注:假如一篇文件的总词语数是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

2 案例

这里面可以把总文件数理解为总样本数,比如这个案例总样本数是3

ef tfidf_demo():
    """
    用TF-IDF的方法进行文本特征抽取
    词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
    逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。
    某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
    :return:
    """
    # 将中文文本进行分词
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    # print(data_new)
    # 1、实例化一个转换器类
    transfer = TfidfVectorizer(stop_words=["一种", "所以"])

    # 2、调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names())

    return None

输出结果:

data_new:
 [[0.         0.21821789 0.         0.         0.         0.43643578
  0.         0.         0.         0.         0.         0.21821789
  0.         0.21821789 0.         0.         0.         0.
  0.21821789 0.         0.43643578 0.         0.21821789 0.
  0.43643578 0.21821789 0.         0.         0.         0.21821789
  0.21821789 0.         0.         0.21821789 0.        ]
 [0.         0.         0.2410822  0.         0.         0.
  0.2410822  0.2410822  0.2410822  0.         0.         0.
  0.         0.         0.         0.         0.2410822  0.55004769
  0.         0.         0.         0.2410822  0.         0.
  0.         0.         0.48216441 0.         0.         0.
  0.         0.         0.2410822  0.         0.2410822 ]
 [0.15895379 0.         0.         0.63581516 0.47686137 0.
  0.         0.         0.         0.15895379 0.15895379 0.
  0.15895379 0.         0.15895379 0.15895379 0.         0.12088845
  0.         0.15895379 0.         0.         0.         0.15895379
  0.         0.         0.         0.31790758 0.15895379 0.
  0.         0.15895379 0.         0.         0.        ]]
特征名字:
 ['不会', '不要', '之前', '了解', '事物', '今天', '光是在', '几百万年', '发出', '取决于', '只用', '后天', '含义', '大部分', '如何', '如果', '宇宙', '我们', '放弃', '方式', '明天', '星系', '晚上', '某样', '残酷', '每个', '看到', '真正', '秘密', '绝对', '美好', '联系', '过去', '还是', '这样']

2.3.1 什么是特征预处理

# scikit-learn的解释
provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.

通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程

1 包含内容

  • 数值型数据的无量纲化:

    • 归一化
    • 标准化

2 特征预处理API

sklearn.preprocessing

为什么我们要进行归一化/标准化?

  • 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级容易影响(支配)目标结果,使得一些算法无法学习到其它的特征

我们需要用到一些方法进行无量纲化使不同规格的数据转换到同一规格

2.3.2 归一化

1 定义

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

2 公式

作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0

3 API

  • sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )

    • MinMaxScalar.fit_transform(X)

      • X:numpy array格式的数据[n_samples,n_features]
    • 返回值:转换后的形状相同的array

1、实例化MinMaxScalar

2、通过fit_transform转换

def minmax_demo():
    """
    归一化
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("dating.txt")
    data = data.iloc[:, :3]
    print("data:\n", data)

    # 2、实例化一个转换器类
    transfer = MinMaxScaler(feature_range=[2, 3])

    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

    return None

输出结果:

data:
      milage     Liters  Consumtime
0     40920   8.326976    0.953952
1     14488   7.153469    1.673904
2     26052   1.441871    0.805124
3     75136  13.147394    0.428964
4     38344   1.669788    0.134296
..      ...        ...         ...
995   11145   3.410627    0.631838
996   68846   9.974715    0.669787
997   26575  10.650102    0.866627
998   48111   9.134528    0.728045
999   43757   7.882601    1.332446

[1000 rows x 3 columns]
data_new:
 [[2.44832535 2.39805139 2.56233353]
 [2.15873259 2.34195467 2.98724416]
 [2.28542943 2.06892523 2.47449629]
 ...
 [2.29115949 2.50910294 2.51079493]
 [2.52711097 2.43665451 2.4290048 ]
 [2.47940793 2.3768091  2.78571804]]

4 小结

注意最大值最小值是变化的,另外最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

2.3.3 标准化

1 定义

通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内

2 公式

  • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
  • 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。

3 案例

#标准化
def stand_demo():
    """
    标准化
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("dating.txt")
    data = data.iloc[:, :3]
    print("data:\n", data)

    # 2、实例化一个转换器类
    transfer = StandardScaler()

    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("标准化结果 data_new:\n", data_new)
    print("每一列特征的平均值:\n", transfer.mean_)
    print("每一列特征的方差:\n", transfer.var_)
    return None

输出结果:

data:
      milage     Liters  Consumtime
0     40920   8.326976    0.953952
1     14488   7.153469    1.673904
2     26052   1.441871    0.805124
3     75136  13.147394    0.428964
4     38344   1.669788    0.134296
..      ...        ...         ...
995   11145   3.410627    0.631838
996   68846   9.974715    0.669787
997   26575  10.650102    0.866627
998   48111   9.134528    0.728045
999   43757   7.882601    1.332446

[1000 rows x 3 columns]
标准化结果 data_new:
 [[ 0.33193158  0.41660188  0.24523407]
 [-0.87247784  0.13992897  1.69385734]
 [-0.34554872 -1.20667094 -0.05422437]
 ...
 [-0.32171752  0.96431572  0.06952649]
 [ 0.65959911  0.60699509 -0.20931587]
 [ 0.46120328  0.31183342  1.00680598]]
每一列特征的平均值:
 [3.36354210e+04 6.55996083e+00 8.32072997e-01]
每一列特征的方差:
 [4.81628039e+08 1.79902874e+01 2.46999554e-01]

2.4.1 降维

降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程

  • 降低随机变量的个数
  • 相关特征(correlated feature)
    • 相对湿度与降雨量之间的相关等

因为在进行训练的时候,我们都是使用特征进行学习。如果特征本身存在问题或者特征之间相关性较强,对于算法学习预测会影响较大

2.4.2 降维的方式

  • 特征选择(数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。)
  • 主成分分析(可以理解一种特征提取的方式)

1 低方差特征过滤

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

  • 特征方差小:某个特征大多样本的值比较相近(比如说有一个样本是鸟有没有爪子,那么这行数据正常情况下方差的0,以为鸟都有爪子,数据几乎没什么波动,这对我们研究几乎没有价值)

  • 特征方差大:某个特征很多样本的值都有差别

  • sklearn.feature_selection.VarianceThreshold(threshold = 0.0)

    • 删除所有低方差特征
    • Variance.fit_transform(X)
      • X:numpy array格式的数据[n_samples,n_features]
      • 返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。

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

    return None

输出结果:刚开始是有12列数据,低方差过滤(<1)之后剩余8列

            index  pe_ratio  pb_ratio    market_cap  \
0     000001.XSHE    5.9572    1.1818  8.525255e+10
1     000002.XSHE    7.0289    1.5880  8.411336e+10
...           ...       ...       ...           ...
2316  601958.XSHG   52.5408    2.4646  3.287910e+10
2317  601989.XSHG   14.2203    1.4103  5.911086e+10   

      return_on_asset_net_profit  du_return_on_equity            ev  \
0                         0.8008              14.9403  1.211445e+12
1                         1.6463               7.8656  3.002521e+11
...                          ...                  ...           ...
2316                      2.7444               2.9202  3.883803e+10
2317                      2.0383               8.6179  2.020661e+11   

      earnings_per_share       revenue  total_expense        date    return
0                 2.0100  2.070140e+10   1.088254e+10  2012-01-31  0.027657
1                 0.3260  2.930837e+10   2.378348e+10  2012-01-31  0.082352
2                -0.0060  1.167983e+07   1.203008e+07  2012-01-31  0.099789
...                  ...           ...            ...         ...       ...
2315              0.2200  1.789082e+10   1.749295e+10  2012-11-30  0.137134
2316              0.1210  6.465392e+09   6.009007e+09  2012-11-30  0.149167
2317              0.2470  4.509872e+10   4.132842e+10  2012-11-30  0.183629  

[2318 rows x 12 columns]
删除低方差特征的结果:
 [[  5.95720000e+00   1.18180000e+00   8.52525509e+10 ...,   1.21144486e+12
    2.07014010e+10   1.08825400e+10]
 [  7.02890000e+00   1.58800000e+00   8.41133582e+10 ...,   3.00252062e+11
    2.93083692e+10   2.37834769e+10]
 [ -2.62746100e+02   7.00030000e+00   5.17045520e+08 ...,   7.70517753e+08
    1.16798290e+07   1.20300800e+07]
 ...,
 [  3.95523000e+01   4.00520000e+00   1.70243430e+10 ...,   2.42081699e+10
    1.78908166e+10   1.74929478e+10]
 [  5.25408000e+01   2.46460000e+00   3.28790988e+10 ...,   3.88380258e+10
    6.46539204e+09   6.00900728e+09]
 [  1.42203000e+01   1.41030000e+00   5.91108572e+10 ...,   2.02066110e+11
    4.50987171e+10   4.13284212e+10]]
形状:
 (2318, 8)

2 相关系数

  • 皮尔逊相关系数(Pearson Correlation Coefficient)

    • 反映变量之间相关关系密切程度的统计指标

相关系数的值介于–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为高度线性相关

API

  • from scipy.stats import pearsonr

    • x : (N,) array_like

    • y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)

      1)输入:x为特征,y为目标变量.

      2)输出:r: 相关系数 [-1,1]之间,p-value: p值。

      注: p值越小,表示相关系数越显著,一般p值在500个样本以上时有较高的可靠性。

      计算出变量A和变量B的皮尔逊相关系数为0,不代表A和B之间没有相关性,只能说明A和B之间不存在线性相关关系。

相关系数为(0,1]的正数,表明x和y之间呈线性正相关;相关系数为0,表明二者不存在 线性相关 关系,但不排除存在其他非线性相关关系;相关系数为[-1,0)的负数,表明x和y之间存在线性负相关关系。

p值是拒绝零假设的需要的最小显著性水平,p值较小越容易拒绝原假设。我是这样理解的,p值就是零假设成立的时候,出现抽取出来的这个样本统计值的概率是多少,但是对于连续性总体,某一个点的的概率为0,所以加上了一段出现更离谱的概率也就是不利于零假设的概率。总之,简单理解就是p值就是零假设成立时,出现该样本统计值的概率,概率越小,说明零假设越不合理,越拒绝。

作者:我是这里的
链接:https://www.zhihu.com/question/405665370/answer/1325982899
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


#低方差特征过滤
def variance_demo():
    """
    过滤(某一列)低方差特征
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("factor_returns.csv")
    data = data.iloc[:, 1:-2]
    print("data:\n", data)

    # 2、实例化一个转换器类 小于等于threshold的会被去掉
    transfer = VarianceThreshold(threshold=10)

    # 3、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new, data_new.shape)

    # 计算某两个变量之间的相关系数
    """
    相关系数的值介于–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为高度线性相关
    """
    r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
    print("pe_ratio 和 pb_ratio 的相关系数:\n", r1)
    r2 = pearsonr(data['revenue'], data['total_expense'])
    print("revenue与total_expense之间的相关性:\n", r2)

    return None

输出结果:

pe_ratio 和 pb_ratio 的相关系数:
 (-0.004389322779936271, 0.8327205496564927)
revenue与total_expense之间的相关性:
 (0.9958450413136115, 0.0)

3 PCA主成分分析

  • 定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
  • 作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
  • 应用:回归分析或者聚类分析当中

API:

  • sklearn.decomposition.PCA(n_components=None)

    • 将数据分解为较低维数空间
    • n_components:
      • 小数:表示保留百分之多少的信息
      • 整数:减少到多少特征
    • PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
    • 返回值:转换后指定维度的array

    def pca_demo():
    """
    PCA降维
    :return:
    """
    data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]

    # 1、实例化一个转换器类
    transfer = PCA(n_components=0.95)
    
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    return None

输出结果:

data_new:
 [[ 1.28620952e-15  3.82970843e+00]
 [ 5.74456265e+00 -1.91485422e+00]
 [-5.74456265e+00 -1.91485422e+00]]

几个问题:

1、数据集的结构是什么?

答案: 特征值+ 目标值

2、机器学习算法分成哪些类别? 如何分类

答案: 根据是否有目标值分为 监督学习和非监督学习监督学习

根据目标值的数据类型:目标值为离散值就是分类问题

目标值为连续值就是回归问题

3、什么是标准化? 和归一化相比有什么优点?

答案: 标准化是通过对原始数据进行变换把数据变换到均值为0,方差为1范围内

优点: 少量异常点, 不影响平均值和方差, 对转换影响小