机器学习之数据集处理

本文介绍了机器学习中的数据集划分,如训练数据和测试数据的使用,以及数据预处理的步骤,包括特征提取、特征预处理和特征降维。在特征工程部分,详细讲解了如何使用sklearn库进行特征提取,如字典特征和文本特征的转换,并展示了归一化和标准化的示例。最后,探讨了特征降维的方法,如方差选择法和主成分分析(PCA)在高维数据简化中的应用。
摘要由CSDN通过智能技术生成

1.数据集

1.1 训练数据

用于训练,构建模型。

1.2 测试数据

在模型检验时使用,用于评估模型是否有效。

1.3 数据集划分

API:sklearn.model_selection.train_test_split(),特征值代表数据的特征,目标值代表想要的分类结果。

from sklearn.datasets  import load_iris
from sklearn.model_selection import train_test_split
def datasets_demo():
    #获取数据集
    iris = load_iris()
    print("鸢尾花数据集:\n",iris)
    print("查看数据集描述:\n",iris["DESCR"])
    print("查看特征值的名字:\n",iris.feature_names)
    print("查看特征值:\n",iris.data)
    print("查看特征值形状:\n",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)
    print("测试集的特征值:\n",x_test,x_test.shape)
    return None
if __name__ == "__main__":
        datasets_demo()        

这里定义训练集的特征值(x_train),测试集的特征值(x_test),训练集的目标值(y_train),测试集的目标值(y_test)

2.特征工程

特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。特征工程包括特征提取、特征预处理和特征降维三个部分。

2.1 特征提取

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

2.1.1字典特征提取(特征离散化)

字典特征提取API:sklearn.feature_extraction.DictVectorizer(sparse=True,…),sparse默认为True,提取结果为稀疏矩阵(只描述非零点的位置)-节省内存
在这里插入图片描述
示例代码如下:

from sklearn.feature_extraction import DictVectorizer
def dict_feature():
    """
    字典特征提取DictVectorizer()
    :return:
    """
    data = [{"city": "北京", "temperature": 100},
            {"city": "上海", "temperature": 60},
            {"city": "深圳", "temperature": 30}]
    # 1.实例化一个转换器
    transfer = DictVectorizer(sparse=False)  # sparse默认为True,提取结果为稀疏矩阵(只描述非零点的位置)-节省内存
    # 2.调用fit_transform()
    result = transfer.fit_transform(data)
    print("特征名:", transfer.get_feature_names())
    print("提取结果为:\n", result)
if __name__ == "__main__":
    dict_feature()

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

2.1.2文本特征提取

文本特征提取API:sklearn.feature_extraction.text

文本特征提取方法一

API:sklearn.feature_extraction.text.CountVectorizer(stop_words=[]),返回词频矩阵,即每个单词出现的次数;stop_words表示停用词,即不对这些词进行统计。

(1)英文文本特征提取

代码如下:

from sklearn.feature_extraction.text import CountVectorizer
def text_feature():
    """
    英文特征提取CountVectorizer()
    :return:
    """
    data = ["life is short, i like like python", "life is too long, i dislike python"]
    transfer = CountVectorizer()
    result = transfer.fit_transform(data)
    print("特征名:", transfer.get_feature_names())
    print("提取结果为:\n", result.toarray())
if __name__ == "__main__":
    text_feature()

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

(1)中文文本特征提取——采用jieba分词

代码如下:

from sklearn.feature_extraction.text import CountVectorizer
import jieba
def count_chinese_feature():
    """
    中文特征提取,自动分词
    :return:
    """
    data = ["十月中旬,好不容易遇着一次休养的机会。",
            "舒展一下筋骨,顺便先欣赏一下风光。",
            "当晚我九点时就迷迷糊糊睡着了,不知过了多久却突然醒来。"]
    data_new = []
    for i in data:
        cut_result = " ".join(list(jieba.cut(i)))
        data_new.append(cut_result)
    transfer = CountVectorizer(stop_words=["20", "索性", "好不容易"])
    result = transfer.fit_transform(data_new)
    print("特征名:\n", transfer.get_feature_names())
    print("提取结果为:\n", result.toarray())
if __name__ == "__main__":
    count_chinese_feature()

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

文本特征提取方法二

API:sklearn.feature_extraction.text.TfidfVectorizer(stop_words=[])
TF:即词频(term frequency),指的是一个给定的词语在该文件中出现的频率。
IDF:即逆向文档频率(inverse document frequency),指的是一个词语的普遍重要性。某一特定词语的IDF可以由总文件数目除以包含该词语文件的数目,再将得到的商取以10为底的对数得到。
TFIDFi,j=TFi,j × IDFi,j

TFIDF方法中文文本特征提取——采用jieba分词

代码如下:

import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
def tfidf_feature():
    """
    用Tfidf的方法进行文本特征提取,衡量一个词的重要程度,即词频
    :return:
    """
    data = ["十月中旬,好不容易遇着一次休养的机会。",
            "舒展一下筋骨,顺便先欣赏一下风光。",
            "当晚我九点时就迷迷糊糊睡着了,不知过了多久却突然醒来。"]
    data_new = []
    for i in data:
        cut_result = " ".join(list(jieba.cut(i)))
        data_new.append(cut_result)
    transfer = TfidfVectorizer(stop_words=["20", "索性", "好不容易"])
    result = transfer.fit_transform(data_new)
    print("特征名:\n", transfer.get_feature_names())
    print("提取结果为:\n", result.toarray())
if __name__ == "__main__":
    tfidf_feature()

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

2.2 特征预处理

特征预处理就是通过一些转化函数将特征数据转换成更加适合算法模型的特征数据过程。(无量纲化)
特征预处理API:sklearn.preprocessing

2.2.1 归一化

定义:通过对原始数据进行变换把数据映射到指定区间(默认为[0,1])之间。
公式:X’=(X-min)/(max-min) X’‘=X’*(mx-mi)+mi ,其中max为一列的最大值,min为一列的最小值,X’'为最终结果,mx和mi分别为指定区间的上限和下限。
API:sklearn.preprocessing.MinMaxScaler(feature_range(0,1),…)
示例代码如下:

import pandas as pd
from sklearn.preprocessing import MinMaxScaler


def minmax_scaler():
    """
    归一化
    :return:
    """
    # 1.获取数据
    data = pd.read_csv("dating1.txt")
    # print(data)
    data = data.iloc[:, :3]
    print("处理之前的数据:\n%s" % data)
    # 2.实例化一个转换器
    transfer = MinMaxScaler(feature_range=(1, 3))
    # 3.调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("归一化后的数据:\n%s" % data_new)


if __name__ == "__main__":
    minmax_scaler()

运行结果如下:
在这里插入图片描述
归一化总结:由于指定区间是变化的,所以数据处理的稳定性较差,只适合传统精确小数据。

2.2.2 标准化

定义:通过对原始数据进行变换把数据变换到均值为0,标准差为1的范围内。
公式:X’=(X-mean)/σ,其中mean为平均值,σ为标准差。
API:sklearn.preprocessing.StandardScaler()
示例代码如下:

# 标准化
import pandas as pd
from sklearn.preprocessing import StandardScaler


def standard_scaler():
    """
    标准化
    :return:
    """
    # 1.获取数据
    data = pd.read_csv("dating1.txt")
    # print(data)
    data = data.iloc[:, :3]
    print("处理之前的数据:\n%s" % data)
    # 2.实例化一个转换器
    transfer = StandardScaler()
    # 3.调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("标准化后的数据:\n%s" % data_new)


if __name__ == "__main__":
    standard_scaler()

运行结果如下:
在这里插入图片描述
标准化总结:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据环境。

2.3 特征降维

降维是指在某些特定条件下,降低随机变量(特征)的个数,得到一组“不相关”的主变量(特征)的过程。特征降维主要有特征选择主成分分析(可以理解为一种特征提取的方式)两种方法。

2.3.1特征选择

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

方差选择法(低方差特征过滤)

API:sklearn.feature_selection.Variance.Threshold(threshold=0.0)
返回值:训练集差异低于threshold的特征将被删除,默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
示例代码:

# 方差选择法(低方差特征过滤)
import pandas as pd
from sklearn.feature_selection import VarianceThreshold


def variance_demo():
    """
    方差选择法(低方差特征过滤)
    :return:
    """
    # 1.获取数据
    data = pd.read_csv("factor_returns.csv")
    data = data.iloc[:, 1:-2]
    # 2.实例化转换器类
    variance = VarianceThreshold()
    # 3.调用fit_transform()
    data_new = variance.fit_transform(data)
    print("低方差特征过滤后的数据:\n%s" % data_new)


if __name__ == "__main__":
    variance_demo()

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

相关系数方法(皮尔逊相关系数)

API:from scipy.stats import pearsonr,传入参数x,y,x和y为需要对比的两个特征。
示例代码:

# 相关系数方法(皮尔逊相关系数)
import pandas as pd
from scipy.stats import pearsonr


def variance_demo1():
    """
    相关系数方法(皮尔逊相关系数)
    :return:
    """
    # 1.获取数据
    data = pd.read_csv("factor_returns.csv")
    data = data.iloc[:, 1:-2]
    # 2.计算相关系数
    r = pearsonr(data["pb_ratio"], data["market_cap"])
    print("pb_ratio和market_cap的相关系数为:\n", r)


if __name__ == "__main__":
    variance_demo1()

运行结果如下:
在这里插入图片描述
总结:如果特征与特征之间相关性很高,可以选择其中一个加入到主变量,或者将两个特征加权求和形成一个新的特征。

2.3.2主成分分析(PCA)

定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量,尽量使损失最小。
API:sklearn.decomposition.PCA(n_components=None),n_components为小数时表示保留百分之多少的信息,为整数时表示保留多少特征。
示例代码:

from sklearn.decomposition import PCA


def PCA_demo():
    """
    PCA降维
    :return:
    """
    data = [[1, 2, 5, 6], 
            [5, 6, 7, 6], 
            [5, 5, 2, 5], 
            [5, 5, 5, 6]]
    # 1.实例化一个转换器
    transfer = PCA(n_components=0.75)
    # 2.调用fit_transform
    data_new = transfer.fit_transform(data)
    print("转换前的数据", data)
    print("转换后的数据", data_new)


if __name__ == "__main__":
    PCA_demo()

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

2.3.3 降维案例(探究用户对物品类别喜好)

(1)需要将用户ID和物品类别放到同一张表中——合并
(2)找到用户ID和物品类别之间的关系——交叉表和透视表
(3)特征冗余——降维
示例代码:

import pandas as pd
from sklearn.decomposition import PCA


def PCA_example():
    """
    降维案例:探究用户对商品类别喜好
    :return:
    """
    # 1.获取数据
    orders = pd.read_csv("./orders.csv")
    aisles = pd.read_csv("./aisles.csv")
    products = pd.read_csv("./products.csv")
    order_products = pd.read_csv("./order_products__prior.csv")
    # 2.合并表
    tab1 = pd.merge(aisles, products, on=["aisle_id", "aisle_id"])  # 合并aisles和products
    # print(tab1)
    tab2 = pd.merge(tab1, order_products, on=["product_id", "product_id"])  # 合并tab1和order_products
    tab3 = pd.merge(tab2, orders, on=["order_id", "order_id"])  # 合并tab2和orders
    # 3.找到user_id和aisle之间的关系
    table = pd.crosstab(tab3["user_id"], tab3["aisle"])
    data = table[:10000]
    # 4.PCA降维
    transfer = PCA(n_components=0.75)  # 实例化一个转换器
    data_new = transfer.fit_transform(data)  # 调用fit_transform
    print("降维前的数据", data.shape)
    print("降维后的数据", data_new.shape)


if __name__ == "__main__":
    PCA_example()

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

willing秋刀鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值