3.特征工程-特征抽取、特征预处理、特征降维

环境配置(必看)

Anaconda-创建虚拟环境的手把手教程相关环境配置看此篇文章,本专栏深度学习相关的版本和配置,均按照此篇文章进行安装。

头文件引用

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.decomposition import PCA
from sklearn.feature_selection import VarianceThreshold
from scipy.stats import pearsonr
import pandas as pd
import jieba

1.数据集: sklearn

代码

1.load_iris() 获取鸢尾花数据集,数据集的形状为(150, 4)
2.train_test_split()调用划分数据集的函数,test_size=0.2意思是将150个数据中的20%划分为测试集,剩下的80%为训练集。从代码运行的图中 x_train.shape: (120, 4)可以看出,训练集为150 * 0.8 = 120个
3.其他的打印,可以自己运行程序去看一下

def datasets_demo():
    """
    获取鸢尾花数据集
    :return:
    """
    # 获取鸢尾花数据集
    iris = load_iris()
    print(f"鸢尾花数据集的返回值: {iris}")
    # print("查看数据集描述: \n", iris["DESCR"])
    print(f"查看特征值的名字:{iris.feature_names}")
    # print(f"查看特征值:{iris.data} \n 特征值的形状:{iris.data.shape}")
    print(f"标签组:{iris.target}")
    print(f"标签名:{iris.target_names}")

    # 数据集划分 特征数据 目标数据 测试集比例 随机种子
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=20)
    print(f"x_train: \n {x_train} \n x_train.shape: {x_train.shape}")
    return None

运行结果

鸢尾花数据集的返回值:
在这里插入图片描述
在这里插入图片描述

查看特征值的名字、标签组、标签名
在这里插入图片描述
划分数据集后,训练集的形状
在这里插入图片描述

2.字典特征抽取: DictVectorizer

代码

1.从运行结果可以看出,'city’有北京、上海、深圳三个类别,对应one-hot编码就是001 010 100三种情况;'temperature’只有就是顺应数值。
2.DictVectorizer()默认返回的是稀疏矩阵,结果在下边的运行结果中。其中的:
(0, 1) 1.0
(1, 0) 1.0
(2, 2) 1.0
可以看出是对应非稀疏矩阵的坐标位置。
3.数据需要处理成字典的类型才可以使用DictVectorizer()

def dict_demo():
    """
    字典特征抽取: DictVectorizer
    :return:
    """
    data = [{'city': '北京', 'temperature': 100},
            {'city': '上海', 'temperature': 60},
            {'city': '深圳', 'temperature': 30}]

    # 1.实例化一个转换器类 不填写参数默认返回的是稀疏矩阵
    transfer = DictVectorizer(sparse=False)
    # 2.调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    print("特征名字: \n", transfer.get_feature_names())
    return None

运行结果

在这里插入图片描述

稀疏矩阵

在这里插入图片描述

3.文本特征抽取(英文文本): CountVectorizer()

代码

1.CountVectorizer()没有像DictVectorizer()通过输入参数来控制是否返回稀疏矩阵,而是通过data_new.toarray()来转换为非稀疏矩阵
2.CountVectorizer(stop_words=[“is”, “too”]),可以通过入参stop_words=[“is”, “too”]来控制不统计某些单词。

def count_demo():
    """
    文本特征抽取: CountVectorizer
    :return:
    """
    data = ["Life is short, i like like python", "life is too long, i dislike python"]
    # 1.实例化一个转换器类
    transfer = CountVectorizer()
    # 2.调用fit_transform()
    data_new = transfer.fit_transform(data)
    # data_new.toarray()生成非稀疏矩阵
    print("data_new:\n", data_new.toarray())
    print("特征名字: \n", transfer.get_feature_names())
    return None

运行结果

在这里插入图片描述

4.中文文本分词(中文文本特征抽取使用)

代码

1.运行函数: cut_word(“我爱北京天安门”), 得到运行结果

def cut_word(text):
    """
    中文分词: 我爱北京天安门
    :param text:
    :return:
    """
    # jieba.cut(text)对字符串进行分词处理
    # " ".join() 转换为字符串
    tmp = " ".join(list(jieba.cut(text)))
    print(f"{tmp}\n{type(tmp)}")

    return tmp

运行结果

在这里插入图片描述

5.中文文本特征抽取

代码

1.需要调用cut_word()进行分词,然后再进行特征抽取
2.中文文本特征抽取与英文文本抽取唯一的不同就是分词,后续是一样的处理
3.与TfidfVectorizer()计算出的结果不同,CountVectorizer()统计的是特征出现的个数,TfidfVectorizer()统计的是特征的重要程度

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

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))

    print(f"data_new = \n{data_new}")
    # 1.实例化一个转换器类
    transfer = CountVectorizer()
    # 2.调用fit_transform()
    data_final = transfer.fit_transform(data_new)
    # data_final.toarray()生成非稀疏矩阵
    print("data_final:\n", data_final.toarray())
    print("特征名字: \n", transfer.get_feature_names())
    
    return None

运行结果

在这里插入图片描述

6.文本特征抽取: TfidfVectorizer

代码

1.TfidfVectorizer(stop_words=[“is”, “too”]),可以通过入参stop_words=[“is”, “too”]来控制不统计某些单词。
2.计算出的结果矩阵,是代表各个特征的重要程度

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

    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))

    # 1.实例化一个转换器类
    transfer = TfidfVectorizer()
    # 2.调用fit_transform()
    data_final = transfer.fit_transform(data_new)
    print("data_final:\n", data_final.toarray())
    print("特征名字: \n", transfer.get_feature_names())
    return None

运行结果

在这里插入图片描述

7.归一化:MinMaxScaler

代码

1.需要dating.txt数据的可以把邮箱留在评论区
2.如果样本的最大值或者最小值是异常点,对归一化的结果有很大的影响,所以对数据进行处理更建议使用下边的标准化

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

    # 2、实例化一个转换器类
    # feature_range=[2, 3] 归一化放缩的范围[2, 3]
    transfer = MinMaxScaler(feature_range=[2, 3])

    # 3、调用fit_transform
    # data数据的形状(n_samples, n_features)  行:样本数   列:特征数
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

    return None

运行结果

可以看到归一化后的数值全部在[2, 3]范围内,通过MinMaxScaler的入参feature_range=[2, 3]来进行调整
在这里插入图片描述

8.标准化: StandardScaler

代码

1.处理之后,对于每列来说,所有数据都聚集在均值为0,标准差为1的附近

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)
    return None

运行结果

在这里插入图片描述

9.过滤低方差特征: VarianceThreshold

代码

1.pearsonr()得出皮尔逊相关系数,相关系数r的值介于-1至1之间

  1. r > 0,表示两变量正相关, r < 0,两变量负相关;
  2. |r| = 1,表示两变量为完全正相关, r = 0,表示两变量无相关关系;
    2.相关系数,只看第一个值即可,不需要看第二个值。例如:
    相关系数: (-0.004389322779936271, 0.8327205496564927)
    只看-0.004389322779936271即可。
def variance_demo():
    """
    过滤低方差特征
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("factor_returns.csv")
    data = data.iloc[:, 1:-2]
    print("data:\n", data)

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

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

    # 计算某两个变量之间的相关系数
    r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
    print("相关系数:\n", r1)
    r2 = pearsonr(data['revenue'], data['total_expense'])
    print("revenue与total_expense之间的相关性:\n", r2)

    return None

运行结果

结果1:threshold=0时运行的结果

可以看到数据原本是具有9个特征,设置threshold=0后,过滤掉0个特征,还剩下9个特征
在这里插入图片描述

结果2:threshold=10时运行的结果

可以看到数据原本是具有9个特征,设置threshold=10后,过滤掉2个特征,还剩下7个特征
在这里插入图片描述

10.数据降维: PCA

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

代码

1.n_components=2减少到2个特征,代码中是将4个特征减少到2个特征

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

    # 1.实例化一个转换器类
    # n_components 1.整数:留下特征数   2.小数: 保留特征的百分比
    transfer = PCA(n_components=2)
    # 2.调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

    return None

运行结果

n_components=2

在这里插入图片描述

n_components=0.95 代表保留95%的特征

从结果看,保留95%的信息依旧还保留2个特征,说明这个PCA的方法还是不错的!
在这里插入图片描述

本章学习资源

黑马程序员3天快速入门python机器学习
我是跟着视频进行的学习,欢迎大家一起来学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值