【机器学习】02-数据集、特征工程相关知识

一、数据集

分类: 训练集和测试集

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
https://scikit-learn.org.cn/

对比:

  • Scikit-learn特点:
    1、数据量小
    2、方便学习
  • UCI特点:
    1、收录了360个数据集
    2、覆盖科学、生活、经济等领域
    3、数据集几十万
  • Kaggle特点:
    1、大数据竞赛平台
    2、80万科学家
    3、数据量巨大

2.scikit-learn工具介绍

  • Python语言的机器学习工具
  • Scikit-learn包括许多知名的机器学习算法的实现
  • 文档完善,容易上手,丰富的API

安装:
①安装依赖库:numpy和scipy
安装 numpy

sudo pip install numpy

安装 scipy
需要先安装 matplotlib ipython ipython-notebook pandas sympy

pip install matplotlib 
pip install ipython 
pip install ipython-notebook
pip install pandas 
pip install sympy
pip install scipy

②安装 Scikit-learn

pip install scikit-learn

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

import sklearn

安装成功结果:成功结果

3.Scikit-learn包含的内容

Scikit-learn包含的内容

4. sklearn数据集

  • sklearn.datasets
    sklearn.datasets.load_*():获取小规模数据集,数据包含在datasets里。
    sklearn.datasets.fetch_*(data_home=None):获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/
    (注:星号*位置为数据集名称)

4.1 sklearn小数据集
实例:

  • sklearn.datasets.load_iris()
    加载并返回鸢尾花数据集
名称数量
类别3
特征4
样本数量150
每个类别数量50
  • sklearn.datasets.load_boston()
    加载并返回波士顿房价数据集
名称数量
目标类别5-50
特征13
样本数量506

4.2 Sklearn大数据集
实例:
sklearn.datasets.fetch_20newsgroups(data=None, subset=‘train’)

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

4.3 sklearn数据集返回值介绍
load和fetch返回的数据类型datasets.base.Bunch(字典格式)
data: 特征数据数组,是[n_samples * n_features]的二维numpy.ndarry数组
target: 标签数组,是n_samples的一维numpy.ndarry数组
DESCR: 数据描述
feature_names: 特征名,新闻数据,手写数字、回归数据集没有
target_names: 标签名
以索引形式获取对应values:
dict[“key”] = values
bunch.key = values

from sklearn.datasets import load_iris
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)  # shape:(150,4)
    return None

if __name__ == "__main__":
    datasets_demo()

部分运行结果:结果1
结果2

5. 数据集的划分

那么拿到的数据是否全部都用来训练一个模型?
然而并不是,要留部分数据用于评估模型是否有效。

机器学习一般的数据集会划分为两个部分:
训练数据: 用于训练,构建模型
测试数据: 在模型检验时使用,用于评估模型是否有效
划分比例:
训练集:70%、80% (训练数据越多,模型越好)
测试集:30%、20%
数据集划分api:sklearn.model_selection.train_test_split(arrays, *options)

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

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

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

    # 数据集划分  X为特征 Y为目标值
    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)   # 120个样本 150*0.2=测试集特征值个数
    return None

if __name__ == "__main__":
    datasets_demo()

二、特征工程

1. 为什么需要特征工程?

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已

2. 什么是特征工程?

特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
意义:会直接影响机器学习的效果。

3. 特征工程的位置与数据处理的比较

  • pandas:一个数据读取非常方便以及基本的处理格式的工具 (数据清洗、数据处理)
  • sklearn:对于特征的处理提供了强大的接口

4. 特征工程包含内容

特征抽取/特征提取
特征预处理
特征降维

5. 特征提取

5.1 什么是特征提取

由于一些类似文本数据并不能直接被机器学习算法处理,所以要进行特征提取。
特征提取即将任意数据(如文本或图像)转换为可用于机器学习的数字特征

注:特征值是为了计算机更好的去理解数据
机器学习算法 -- 统计方法 - >数学公式

分类:

  • 字典特征提取(特征离散化)文本类型 -> 数值
  • 文本特征提取 类型 -> 数值
  • 图像特征提取(深度学习再介绍)

5.2 特征提取API

sklearn.feature_extraction

6. 字典特征提取

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

sklearn.feature_extraction.DictVectorizer(sparse=True,)
  • DictVectorizer.fit_transform(X), X:字典或者包含字典的迭代器返回值,返回sparse矩阵
  • DictVectorizer.inverse_transform(X), X:array数组或者sparse矩阵 返回值:转换之前数据格式
  • DictVectorizer.get_feature_names():返回类别名称
  vector 数学:向量 物理:矢量
  矩阵 matrix 二维数组
  向量 vector 一维数组
  sparse矩阵==将非零值按位置表示出来,可节省内存,提高效率

示例:
对以下数据进行特征提取:

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

矩阵二维数组–矩阵

对数据进行特征提取:将类别转换为one-hot编码,节省内存,提高下载效率

from sklearn.feature_extraction import DictVectorizer

def dict_demo():
    """
    字典特征抽取
    :return:
    """
    data = [{'city':'北京', 'temperature':100},
            {'city':'上海', 'temperature':60},
            {'city':'深圳', 'temperature':30}]
    # 1、实例化一个转换器类
    #transfer = DictVectorizer() # 返回sparse矩阵
    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

if __name__ == "__main__":
    dict_demo()

结果:

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

7. 文本特征提取

1.含义:单词作为特征
作用: 对文本数据进行特征值化

sklearn.feature_extraction.text.CountVectorizer(stop_words=[])#返回词频矩阵,停用词:stop_words=[]
  • CountVectorizer.fit_transform(X),X:文本或者包含文本字符串的可迭代对象,返回值:返回sparse矩阵
  • CountVectorizer.inverse_transform(X),X:array数组或者sparse矩阵,返回值:转换之前数据格
  • CountVectorizer.get_feature_names():返回值:单词列表

示例:
2.英文文本分词:

from sklearn.feature_extraction.text import CountVectorizer

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)
    print("data_new:\n", data_new.toarray())  # toarray转换为二维数组
    print("特征名字:\n", transfer.get_feature_names())
    return None

if __name__ == "__main__":
    count_demo()

结果:
统计每个特征值出现的次数

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

3.中文文本分词:

注意:不支持单个中文词!
计算特征词出现的个数
from sklearn.feature_extraction.text import CountVectorizer

def count_demo():
    """
    文本特征抽取:CountVectorizer
    :return:
    """
    data = ['我 爱 北京 天安门',
            '天安门 上 太阳 升']
    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())  # toarray转换为二维数组
    print("特征名字:\n", transfer.get_feature_names())

    return None

if __name__ == "__main__":
    count_demo()

结果:

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

中文文本特征抽取–自动分词
示例:

from sklearn.feature_extraction.text import CountVectorizer
import jieba


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

    # 1、实例化一个转换器类
    transfer = CountVectorizer()
    # 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

def cut_word(text):
    """
    进行中文分词:“我爱北京天安门” -> "我 爱  北京 天安门"
    """
    return ' '.join(jieba.cut(text)) #jieba.cut()返回一个生成器

if __name__ == "__main__":
    count_chinese_demo2()
    #print(cut_word('我爱北京天安门'))

结果:
结果1
4.TfidVectorizer
Tf-idf文本特征提取

关键词: 在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少

  • Tf-idf的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分来
  • Tf-idf作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
  • TF-IDF:衡量重要程度
  • TF(term frequency):词频
  • IDF:逆向文档频率,可以由总文件数目 / 包含该词语之文件的数目,再将得到的商取以10为底的对数得到
    公式

计算示例:

现有两个词 “经济”,“非常”
1000篇文章-语料库, 100篇文章 有 "非常"
10篇文章 有 “经济”
两篇文章
文章A(100词) : 10次“经济”
TF-IDF:0.2,tf:10/100 = 0.1,idf:lg 1000/10 = 2
文章B(100词) : 10次“非常” 
TF-IDF:0.1,tf:10/100 = 0.1,idf: lg 10 1000/100 = 1
通过A/B对比,可得“经济”词有更重要影响。

API:

sklearn.feature_extraction.text.TfidVectorizer(stop_words=None...)  #返回词的权重矩阵
  • Tfidfvectorizer.fit_transform(X) -X:文本或者包含文本字符串的可迭代对象。返回值:返回sparse矩阵
  • TfidfVectorizer.inverse_transform(X) -X:array数组或者sparse矩阵。返回值:转换之前数据格式
  • TfidfVectorizer.get_feature_names() 返回值:单词列表
    示例:
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
import jieba

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

    # 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

if __name__ == "__main__":
    tfidf_demo()
    #print(cut_word('我爱北京天安门'))

结果:
结果1

8.特征预处理

8.1 什么是特征预处理?
通过一些转换函数,将特征数据转换成更适合算法模型的特征数据的过程。
数值数据的无量纲化:

  • 归一化
  • 标准化

8.2 特征预处理API

sklearn.preprocessing

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

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

8.3 归一化
8 .3.1 定义
通过对原始的数据进行变换把数据映射到(默认为[0,1]之间)

8.3.2 公式
公式归一化
8.3.3 API

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

MinMaxScaler.fit_transform(X),X:numpy array格式的数据[n_samples,n_features],返回值:转换后的形式相同的array

示例:

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

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

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

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

    return None

if __name__ == "__main__":
    minmax_demo()

结果:
结果1
缺点:如果有异常值(最大/最小值异常)会有什么影响?

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

8.4 标准化

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

8.4.2 公式
公式-标准化

对于标准化来说,如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响不大,从而方差改变较小

8.4.3 API

sklearn.perprocessing.StandradScaler()
  • 处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1
  • StandardScaler.fit_transform(X),X;numpy
    array格式的数据[n_samples,n_features],返回值:转化后的形状相同的array

示例:

from sklearn.preprocessing import MinMaxScaler, StandardScaler

def stand_demo():
    """
    标准化
    :return:
    """
    # 1、获取数据
    data = pd.read_csv("datingTestSet2.txt", sep='\t')
    data = data.iloc[:, :3]
    print("data:\n", data)
    # 2、实例化一个转换器类
    transform = StandardScaler()
    #transform = StandardScaler(feature_range=[2,3])

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

if __name__ == "__main__":
    stand_demo()

结果:
标准化结果
8.4.4 标准化总结
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

9 特征降维

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

9.2 方式

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

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

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

模块:

sklearn.feature_selection

9.4 低方差特征过滤

  • 特征方差小:某个特征大多样本的值比较相近
  • 特征方差大:某个特征很多样本的值都有差别

9.4.1 API

sklearn.feature_selection.VArianceThreshold(threshold=0.0)

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

9.4.2 数据计算
示例:

from sklearn.feature_selection import VarianceThreshold

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

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

    # 3、调用fit_transform
    data_new = transform.fit_transform(data)
    print("data_new\n", data_new, data_new.shape)
    return None

if __name__ == "__main__":
    variance_demo()

结果:
结果

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

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

def pca_demo():
    """
    PCA降维
    :return:
    """
    data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
    # 1、实例化一个转换器类
    transform = PCA(n_components=2)  # 4个特征降到2个特征

    # 2、调用fit_transform
    data_new = transform.fit_transform(data)
    print("data_new\n", data_new)

    transform2 = PCA(n_components=0.95)  # 保留95%的信息
    data_new2 = transform2.fit_transform(data)
    print("data_new2\n", data_new2)
    return None

if __name__ == "__main__":
    pca_demo()

结果:

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

备注:

参考学习:B站-黑马程序员3天快速入门python机器学习
笔记内容随时补充,如需相关资料可私信本人
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值