Python机器学习—特征工程

1、数据集

1.1 可用数据集

在这里插入图片描述
Kaggle网址:https://www.kaggle.com/datasets
UCI数据集网址: http://archive.ics.uci.edu/ml/
scikit-learn网址:https://scikit-learn.org/stable/

1.2 scikit-learn数据集

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

sklearn小数据集

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

    # 数据集划分
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
    print("训练集的特征值:\n", x_train, x_train.shape)

    return None

sklearn大数据集

sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
  • subset:‘train’或者’test’,‘all’,可选,选择要加载的数据集。
  • 训练集的“训练”,测试集的“测试”,两者的“全部”

1.3 数据集的划分

  • 训练数据:用于训练,构建模型
  • 测试数据:在模型检验时使用,用于评估模型是否有效,测试集一般在20%~30%

数据集划分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 = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("训练集的特征值:\n", x_train, x_train.shape)

2.特征工程

特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。

  • 意义:会直接影响机器学习的效果

2.1特征工程包含内容

  • 特征抽取
  • 特征预处理
  • 特征降维

3.特征提取

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

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

特征提取API:sklearn.feature_extraction

3.1字典特征提取

def dict_demo():
    """
    字典特征提取
    :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.2 文本特征提取

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

3.3中文文本特征提取

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


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

3.4 Tf-idf文本特征提取

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

公式

  • 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
  • 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
    在这里插入图片描述
def tfidf_demo():
    """
    用tfidf的方法进行文本特征提取
    :return:
    """
    # 1.将中文文本进行分词
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    # print(data_new)
    # 2.实例化一个转换器类
    transfer = TfidfVectorizer(stop_words=["一种", '因为'])
    # 3.调用fit_transform
    data_final = transfer.fit_transform(data_new)
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    return None

4.特征预处理

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

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

数值型数据的无量纲化:

  • 归一化
  • 标准化
API:sklearn.preprocessing

4.1 归一化

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

def minmax_demo():
    """
    归一化
    :return:
    """
    # 1.获取数据
    data = pd.read_csv('dating.txt')

    data = data.iloc[:, :3]
    # print("data:\n", data)
    # 2.实例化一个转换器类
    transfer = MinMaxScaler()

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

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

4.2 标准化

通过对原始数据进行变换把数据变换到均值为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

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

5. 特征降维

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

降维的两种方式

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

5.1 特征选择

数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。

方法:

  • Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联
            方差选择法:低方差特征过滤
            相关系数
  • Embedded (嵌入式):算法自动选择特征(特征与目标值之间的关联)
            决策树:信息熵、信息增益
            正则化:L1、L2
            深度学习:卷积等
API:sklearn.feature_selection

5.1.1 低方差特征过滤

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

  • 特征方差小:某个特征大多样本的值比较相近
  • 特征方差大:某个特征很多样本的值都有差别
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)

   
    return None

5.1.2 相关系数

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

  • 反映变量之间相关关系密切程度的统计指标
def pearsonr_demo():
    """
    相关系数计算
    :return: None
    """
    data = pd.read_csv("factor_returns.csv")
    data = data.iloc[:, 1:-2]

    # 计算某两个变量之间的相关系数
    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

6. 主成分分析

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

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

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

def pca_demo():
    """
    PCA降维
    :return:
    """
    data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]
    # 1.实例化一个转换器类
    transfer = PCA(n_components=2)
    # 2. 调用fit_transform()
    data_new = transfer.fit_transform(data)
    print('data_new:\n', data_new)

    return None

总结

在这里插入图片描述
关于本节所有代码及数据集相关文件参考如下链接:
https://download.csdn.net/download/qq_45625499/21048609?spm=1001.2014.3001.5501

  • 7
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
特工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。它包括特征抽取、特征预处理和特征降维等内容。特征工程对于机器学习的效果具有直接影响。 在Python中进行机器学习特征工程,可以使用多个库和工具来完成。下面是一些常用的Python库和工具: 1. Scikit-learn:Scikit-learn是一个功能丰富的机器学习库,提供了许多特征工程的方法,包括特征抽取、特征预处理和特征降维等。你可以使用Scikit-learn来进行特征选择、标准化、缺失值处理等操作。 2. Pandas:Pandas是一个用于数据分析和处理的库,提供了丰富的数据操作功能。你可以使用Pandas来加载和清洗数据,进行数据预处理和特征选择。 3. Numpy:Numpy是Python中一个强大的数值计算库,提供了高效的数组操作功能。你可以使用Numpy来进行数值特征的处理,如归一化、标准化和缩放等。 4. Featuretools:Featuretools是一个用于自动特征工程的库,它可以根据数据的结构和关系自动生成特征。你可以使用Featuretools来创建新的特征,通过组合和聚合现有特征。 5. Feature-Engine:Feature-Engine是一个专注于特征工程的库,提供了多个特征处理方法。你可以使用Feature-Engine来处理缺失值、离群值、编码分类变量等。 在进行机器学习特征工程时,你需要根据具体的问题和数据集选择适合的方法和工具。通过合理的特征工程处理,可以提高机器学习模型的性能和准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万里守约

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值