三sklearn数据集&特征工程

1. 数据集

1. sklearn 数据集介绍

其获取数据集有两种方式:

load_xxx: 获取小数据集(依赖库自带)
fetch_xxx: 从互联网下载一些大的数据集

以莺尾花数据集为例子:

from sklearn.datasets import load_iris
# 获取鸢尾花数据集
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)

结果:

鸢尾花数据集的返回值:
 {'data': array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2], ...
鸢尾花的特征值:
 [[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2] ...
鸢尾花的目标值:
 [0 0 0 0 0 ...
鸢尾花特征的名字:
 ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
鸢尾花目标值的名字:
 ['setosa' 'versicolor' 'virginica']
鸢尾花的描述:
 .. _iris_dataset:
 ...

2. 莺尾花数据可视化

莺尾花预测是KNN一个经典的例子, 可以理解为一个分类预测。莺尾花的数据集有150 条,每个样本包含:

特征值四:花瓣花萼的长度和宽度

目标值有3种:setosa、versicolor、virginica

# 内嵌绘图
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.datasets import load_iris
# 获取鸢尾花数据集
iris = load_iris()
# 把数据转换成dataframe的格式
iris_d = pd.DataFrame(iris['data'], columns = ['Sepal_Length', 'Sepal_Width', 'Petal_Length', 'Petal_Width'])
iris_d['Species'] = iris.target

def plot_iris(iris, col1, col2):
    sns.lmplot(x = col1, y = col2, data = iris, hue = "Species", fit_reg = False)
    plt.xlabel(col1)
    plt.ylabel(col2)
    plt.title('iris graph')
    plt.show()
plot_iris(iris_d, 'Petal_Width', 'Sepal_Length')

结果:

3. 数据集拆分

方法:

def train_test_split(
    *arrays,
    test_size=None,
    train_size=None,
    random_state=None,
    shuffle=True,
    stratify=None,
):
    """Split arrays or matrices into random train and test subsets.

    Quick utility that wraps input validation and
    ``next(ShuffleSplit().split(X, y))`` and application to input data
    into a single call for splitting (and optionally subsampling) data in a
    oneliner.

    Read more in the :ref:`User Guide <cross_validation>`.

    Parameters
    ----------
    *arrays : sequence of indexables with same length / shape[0]
        Allowed inputs are lists, numpy arrays, scipy-sparse
        matrices or pandas dataframes.

    test_size : float or int, default=None
        If float, should be between 0.0 and 1.0 and represent the proportion
        of the dataset to include in the test split. If int, represents the
        absolute number of test samples. If None, the value is set to the
        complement of the train size. If ``train_size`` is also None, it will
        be set to 0.25.

    train_size : float or int, default=None
        If float, should be between 0.0 and 1.0 and represent the
        proportion of the dataset to include in the train split. If
        int, represents the absolute number of train samples. If None,
        the value is automatically set to the complement of the test size.

    random_state : int, RandomState instance or None, default=None
        Controls the shuffling applied to the data before applying the split.
        Pass an int for reproducible output across multiple function calls.
        See :term:`Glossary <random_state>`.

    shuffle : bool, default=True
        Whether or not to shuffle the data before splitting. If shuffle=False
        then stratify must be None.

    stratify : array-like, default=None
        If not None, data is split in a stratified fashion, using this as
        the class labels.
        Read more in the :ref:`User Guide <stratification>`.

    Returns
    -------
    splitting : list, length=2 * len(arrays)
        List containing train-test split of inputs.

        .. versionadded:: 0.16
            If the input is sparse, the output will be a
            ``scipy.sparse.csr_matrix``. Else, output type is the same as the
            input type.

测试:默认是 训练:测试=3:1, 也就是训练=0.75

# 内嵌绘图
from sklearn.datasets import load_iris

# 1、获取鸢尾花数据集
from sklearn.model_selection import train_test_split

iris = load_iris()
# 对鸢尾花数据集进行分割
# 训练集的特征值x_train 测试集的特征值x_test 训练集的目标值y_train 测试集的目标值y_test
# random_state: 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同
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)
print("x_train:\n", x_train)
print("x_test:\n", x_test)
print("y_train:\n", y_train)
print("y_test:\n", y_test)

2. 特征工程

1. 特征提取

特征提取是将任意数据(如文本或图像)转换为可用于机器学习的数字特征。也就是说特征值是为了计算机更好的去理解数据。主要包括:

字典特征提取

文本特征提取

图像特征提取(深度学习)

1. 特征提取api

sklearn.feature_extraction

2. 字典特征提取

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

数据:

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

按照我们一开始的思路进行编码:

  1. 给每个城市一个code。 假设北京是 1, 上海是2, 深圳是3
  2. 构造出的数据集如下
city temperature
1 100
2 60
3 30
  1. 这样构造的数据有个缺点就是city的值范围不同,会一直递增。 对结果会干扰。

对于DictVectorizer(sparse=False)构造的数据如下:

city=上海 city=北京 city=深圳 temperature
0 1 0 100
1 0 0 60
0 0 1 30

测试:

from sklearn.feature_extraction import DictVectorizer


def dict_demo():
    """
    字典特征值提取
    :return:
    """
    data = [{'city': '北京', 'temperature': 100}, {'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]
    # 1. 实例化一个转换器   默认返回 sparse矩阵  将非0值按位置表示出来 以节省内存 提高加载效率
    transfer = DictVectorizer(sparse=False)

    # 应用场景:数据集中类别特征值较多;将数据集的特征-》字典类型;DictVectorizer转换;本身拿到的就是字典

    # 2. 调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    # 3. 拿到转换前的数据
    transform = transfer.inverse_transform(data_new)
    print("transform:\n", transform)
    print("特征名字:\n", transfer.get_feature_names_out())
    return None


dict_demo()

结果:

data_new:
 [[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]
transform:
 [{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
特征名字:
 ['city=上海' 'city=北京' 'city=深圳' 'temperature']

将DictVectorizer(sparse=True) 再次查看结果:(稀疏矩阵记录不为0的元素的坐标与值:左边为坐标,右边为值)

data_new:
   (0, 1)	1.0
  (0, 3)	100.0
  (1, 0)	1.0
  (1, 3)	60.0
  (2, 2)	1.0
  (2, 3)	30.0
transform:
 [{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
特征名字:
 ['city=上海' 'city=北京' 'city=深圳' 'temperature']

3. 文本特征提取

对文本数据进行特征值化。简单理解就是对文本里面包含的词进行统计,如果是中文可以分词后进行统计。

1. 英文文本特征提取

from sklearn.feature_extraction.text import CountVectorizer


def count_demo():
    """
    文本特征值抽取
    :return:
    """
    data = ["life is short, i like python", "life is too long i dislike python"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # stop_words 可以指定停用词
    # transfer = CountVectorizer(stop_words=["is", "too"])
    data_new = transfer.fit_transform(data)

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

    return None


count_demo()

结果:

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

2. 中文文本特征提取(自己空格分词)

上面英文文本本身就是空格分割的, 已经达到了分词的效果。对于中文来说需要自己分割。

from sklearn.feature_extraction.text import CountVectorizer


def count_chinese_demo():
    """
    中文文本特征值抽取
    :return:
    """
    data = ["我 爱 北京 天安门", "天安门 上 太阳 升"]
    # data = ["我爱北京天安门", "天安门上太阳升"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    data_new = transfer.fit_transform(data)

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

    return None

count_chinese_demo()

结果:

data_new:
 [[1 1 0]
 [0 1 1]]
特征名字:
 ['北京' '天安门' '太阳']

3. 使用jieba 分词

jieba 分词测试:

import jieba


def count_word(text):
    """
    进行中文分词 我爱北京天安门-》我 爱 北京 天安门
    :param text:
    :return:
    """
    a = " ".join(list(jieba.cut(text)))
    print(a)
    return a


count_word("我爱北京天安门")

结果:

我 爱 北京 天安门

jieba分词后测试

import jieba
from sklearn.feature_extraction.text import CountVectorizer


def count_word(text):
    """
    进行中文分词 我爱北京天安门-》我 爱 北京 天安门
    :param text:
    :return:
    """
    a = " ".join(list(jieba.cut(text)))
    print(a)
    return a


def count_chinese_demo2():
    """
    中文文本特征值抽取 自动分词
    :return:
    """
    data = ["在过去两个月里,我和60多位小伙伴进行了1对1的一小时沟通;",
            "TA绝大多数是想要尝试副业变现的朋友。",
            "从一线城市到三线城市,从宝妈到职场人,从职场到体制内。"]
    # 1、实例化一个转换器类
    transfer = CountVectorizer(stop_words=["从宝妈"])
    data_new = transfer.fit_transform(count_word(item) for item in data)

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

    return None


count_chinese_demo2()

结果:

在 过去 两个 月 里 , 我 和 60 多位 小伙伴 进行 了 1 对 1 的 一 小时 沟通 ;
TA 绝大多数 是 想要 尝试 副业 变现 的 朋友 。
从 一线 城市 到 三线 城市 , 从宝妈 到 职场 人 , 从 职场 到 体制 内 。
data_new:
 [[1 0 0 0 1 0 0 0 0 1 1 1 0 0 0 1 0 0 1 1]
 [0 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 1 0 0 0]
 [0 0 1 1 0 1 0 0 2 0 0 0 0 0 0 0 0 2 0 0]]
特征名字:
 ['60' 'ta' '一线' '三线' '两个' '体制' '副业' '变现' '城市' '多位' '小伙伴' '小时' '尝试' '想要'
 '朋友' '沟通' '绝大多数' '职场' '过去' '进行']

4. Tf-idf文本特征提取

词频(term frequency,tf)指的是某一个给定的词语在该文本中出现的频率。

TF-IDF的主要思想是:

如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

逆向文档频率(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

import jieba
from sklearn.feature_extraction.text import TfidfVectorizer


def count_word(text):
    """
    进行中文分词 我爱北京天安门-》我 爱 北京 天安门
    :param text:
    :return:
    """
    a = " ".join(list(jieba.cut(text)))
    print(a)
    return a


def tfidf_demo():
    """
    用TF-IDF方法进行文本特征值抽取
    :return:
    """
    data = ["在过去两个月里,我和60多位小伙伴进行了1对1的一小时沟通;",
            "TA绝大多数是想要尝试副业变现的朋友。",
            "从一线城市到三线城市,从宝妈到职场人,从职场到体制内。"]
    transfer = TfidfVectorizer(stop_words=["从宝妈"])
    data_new = transfer.fit_transform(count_word(item) for item in data)

    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names_out())
    return None


tfidf_demo()

结果:

在 过去 两个 月 里 , 我 和 60 多位 小伙伴 进行 了 1 对 1 的 一 小时 沟通 ;
TA 绝大多数 是 想要 尝试 副业 变现 的 朋友 。
从 一线 城市 到 三线 城市 , 从宝妈 到 职场 人 , 从 职场 到 体制 内 。
data_new:
 [[0.35355339 0.         0.         0.         0.35355339 0.
  0.         0.         0.         0.35355339 0.35355339 0.35355339
  0.         0.         0.         0.35355339 0.         0.
  0.35355339 0.35355339]
 [0.         0.37796447 0.         0.         0.         0.
  0.37796447 0.37796447 0.         0.         0.         0.
  0.37796447 0.37796447 0.37796447 0.         0.37796447 0.
  0.         0.        ]
 [0.         0.         0.30151134 0.30151134 0.         0.30151134
  0.         0.         0.60302269 0.         0.         0.
  0.         0.         0.         0.         0.         0.60302269
  0.         0.        ]]
特征名字:
 ['60' 'ta' '一线' '三线' '两个' '体制' '副业' '变现' '城市' '多位' '小伙伴' '小时' '尝试' '想要'
 '朋友' '沟通' '绝大多数' '职场' '过去' '进行']

2. 特征预处理

1. 什么是特征预处理

简单说:通过一些转换函数将特征数据转换成更加适合算法模型的特征数据的过程。包含归一化和标准化。

2. 为什么需要进行归一化/标准化?

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

同样以上面的数据为例子,特征1和特征2的数据量相差比较大,但是我们认为其重要程度是一样的,因此我们需要将其进行归一化与标准化。

3. 归一化

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

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

import numpy as np
from sklearn.preprocessing import MinMaxScaler

# 1. 构造数据
x = np.array([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])
print(x)
transfer = MinMaxScaler(feature_range=(0, 1))
# 2. 调用fit_transform
data = transfer.fit_transform(x)
print("最小值最大值归一化处理的结果:\n", data)

结果:

[[90  2 10 40]
 [60  4 15 45]
 [75  3 13 46]]
最小值最大值归一化处理的结果:
 [[1.         0.         0.         0.        ]
 [0.         1.         1.         0.83333333]
 [0.5        0.5        0.6        1.        ]]

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

4. 标准化

通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内。在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

作用于每一列,mean为平均值,σ为标准差

import numpy as np
from sklearn.preprocessing import MinMaxScaler, StandardScaler

# 1. 构造数据
x = np.array([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])
print(x)
transfer = StandardScaler()
# 2. 调用fit_transform
data = transfer.fit_transform(x)
print("标准化的结果:\n", data)
print("每一列特征的平均值:\n", transfer.mean_)
print("每一列特征的方差:\n", transfer.var_)

结果:

[[90  2 10 40]
 [60  4 15 45]
 [75  3 13 46]]
标准化的结果:
 [[ 1.22474487 -1.22474487 -1.29777137 -1.3970014 ]
 [-1.22474487  1.22474487  1.13554995  0.50800051]
 [ 0.          0.          0.16222142  0.88900089]]
每一列特征的平均值:
 [75.          3.         12.66666667 43.66666667]
每一列特征的方差:
 [150.           0.66666667   4.22222222   6.88888889]

3. 特征降维

1. 定义

降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程。因为在进行训练的时候,我们都是使用特征进行学习。如果特征本身存在问题或者特征之间相关性较强,对于算法学习预测会影响较大。

比如:

  • 降低随机变量的个数: 二个特征合并成一个特征
  • 相关特征:相对湿度与降雨量之间的关联

2. 两种方式

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

1. 特征选择

1. 定义

​ 数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。比如: 鸟的羽毛颜色、眼镜宽度、眼睛长度、爪子长度、体格大小。

2. 方法:
1.Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联
  • 方差选择法:低方差特征过滤.VarianceThreshold。删除低方差的一些特征,再结合方差的大小来考虑这个方式的角度。

    相关API:

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

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

      例子:对某些股票的指标特征之间进行一个筛选,除去'index,'date','return'列不考虑(这些类型不匹配,也不是所需要指标)

      原来特征数量:

      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
      

      处理后剩余这些特征:

      pe_ratio,pb_ratio,market_cap,return_on_asset_net_profit,du_return_on_equity,ev,earnings_per_share,revenue,total_expense
      

      代码和结果:

      from sklearn.feature_selection import VarianceThreshold
      import pandas as pd
      
      # 1、初始化VarianceThreshold,指定阀值方差
      # 2、调用fit_transform
      
      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
      
      variance_demo()
      
      ---结果
                  index  pe_ratio  pb_ratio  ...  total_expense        date    return
      0     000001.XSHE    5.9572    1.1818  ...   1.088254e+10  2012-01-31  0.027657
      1     000002.XSHE    7.0289    1.5880  ...   2.378348e+10  2012-01-31  0.082352
      2     000008.XSHE -262.7461    7.0003  ...   1.203008e+07  2012-01-31  0.099789
      3     000060.XSHE   16.4760    3.7146  ...   7.935543e+09  2012-01-31  0.121595
      4     000069.XSHE   12.5878    2.5616  ...   7.091398e+09  2012-01-31 -0.002681
      ...           ...       ...       ...  ...            ...         ...       ...
      2313  601888.XSHG   25.0848    4.2323  ...   1.041419e+10  2012-11-30  0.060727
      2314  601901.XSHG   59.4849    1.6392  ...   1.089783e+09  2012-11-30  0.179148
      2315  601933.XSHG   39.5523    4.0052  ...   1.749295e+10  2012-11-30  0.137134
      2316  601958.XSHG   52.5408    2.4646  ...   6.009007e+09  2012-11-30  0.149167
      2317  601989.XSHG   14.2203    1.4103  ...   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)
      
  • 相关系数: 取值范围 (-1, 1)

主要实现方式:皮尔逊相关系数、斯皮尔曼相关系数。 两个都是返回值越接近|1|,相关性越强;越接近0,相关性越弱。

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

(1). 作用:反映变量之间相关关系密切程度的统计指标

(2). 公式计算:

(3). 例子:计算年广告费投入与月均销售额

之间的相关系数计算:

最终计算:= 0.9942

所以我们最终得出结论是广告投入费与月平均销售额之间有高度的正相关关系。

(4). 特点

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

(5). python 计算两个变量皮尔逊相关系数

from scipy.stats import pearsonr

x1 = [12.5, 15.3, 23.2, 26.4, 33.5, 34.4, 39.4, 45.2, 55.4, 60.9]
x2 = [21.2, 23.9, 32.9, 34.1, 42.5, 43.2, 49.0, 52.8, 59.4, 63.5]

print(pearsonr(x1, x2))

--- 结果
PearsonRResult(statistic=0.9941983762371884, pvalue=4.922089955456965e-09)
  1. 斯皮尔曼相关系数(Rank IC)

(1). 作用: 反映变量之间相关关系密切程度的统计指标

(2). 公式: n为等级个数,d为二列成对变量的等级差数

例子:

(3). 特点:

  • 斯皮尔曼相关系数表明 X (自变量) 和 Y (因变量)的相关方向。 如果当X增加时, Y 趋向于增加, 斯皮尔曼相关系数则为正
  • 与之前的皮尔逊相关系数大小性质一样,取值 [-1, 1]之间

斯皮尔曼相关系数比皮尔逊相关系数应用更加广泛

(4). python 计算类库

from scipy.stats import spearmanr

x1 = [12.5, 15.3, 23.2, 26.4, 33.5, 34.4, 39.4, 45.2, 55.4, 60.9]
x2 = [21.2, 23.9, 32.9, 34.1, 42.5, 43.2, 49.0, 52.8, 59.4, 63.5]

print(spearmanr(x1, x2))

---结果
SignificanceResult(statistic=0.9999999999999999, pvalue=6.646897422032013e-64)
2. Embedded (嵌入式):

​ 算法自动选择特征(特征与目标值之间的关联

  • 决策树:信息熵、信息增益
  • 正则化:L1、L2
  • 深度学习:卷积等

2. 主成分分析(PCA降维)

​ 可以理解为一种特征提取的方式。

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

更好的理解:

2. api
  • sklearn.decomposition.PCA(n_components=None)
    • 将数据分解为较低维数空间
    • n_components:
      • 小数:表示保留百分之多少的信息
      • 整数:减少到多少特征(降低到几维)
    • PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
    • 返回值:转换后指定维度的array
3. python 类库计算
from sklearn.decomposition import PCA

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

    # 1、实例化PCA, 小数——保留多少信息
    transfer = PCA(n_components=0.9)
    # 2、调用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

pca_demo()

--- 结果
保留90%的信息,降维结果为:
 [[-3.13587302e-16  3.82970843e+00]
 [-5.74456265e+00 -1.91485422e+00]
 [ 5.74456265e+00 -1.91485422e+00]]
降维到3维的结果:
 [[-3.13587302e-16  3.82970843e+00  4.59544715e-16]
 [-5.74456265e+00 -1.91485422e+00  4.59544715e-16]
 [ 5.74456265e+00 -1.91485422e+00  4.59544715e-16]]

3. 总结

posted @ 2022-09-28 16:28  QiaoZhi  阅读(641)  评论(0编辑  收藏  举报