数据的特征工程

数据的特征工程

1.特征工程是什么

特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的模型准确性

2.特征工程的意义

更好的特征意味着更强的鲁棒性

更好的特征意味着只需用简单模型

更好的特征意味着更好的结果

3.scikit-learn库介绍

Python语言的机器学习工具

Scikit-learn包括许多知名的机器学习算法的实现

基于NumPy、SciPy和matplotlib构建

开源、商业可用 - BSD许可

Scikit-learn文档完善,容易上手,丰富的API,使其在学术界颇受欢迎。

4.数据的特征抽取

4.1 定义

特征抽取:将任意数据格式(例如文本和图像)转换为机器学习的数字特征

特征抽取针对非连续型数据

特征抽取对文本等进行特征值化

特征值化是为了计算机更好的去理解数据

4.2 sklearn特征抽取API

sklearn.feature_extraction

4.3 字典特征抽取

定义:将字典中的一些类别数据,分别进行转换成特征

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

类:sklearn.feature_extraction.DictVectorizer

分类特征变量/字典提取语法

sklearn.feature_extraction.DictVectorizer(sparse = True)----将映射列表转换为Numpy数组或scipy.sparse矩阵

sparse :是否转换为scipy.sparse矩阵表示,默认开启

方法:

DictVectorizer.fit_transform(X)

X:字典或者包含字典的迭代器----返回值:返回sparse矩阵

DictVectorizer.inverse_transform(X)

X:array数组或者sparse矩阵----返回值:转换之前数据格式

DictVectorizer.get_feature_names()

返回类别名称

DictVectorizer.transform(X)

按照原先的标准转换

from sklearn.feature_extraction import DictVectorizer
def dictver():
    """字典数据抽取"""
    dict = DictVectorizer()
    data = dict.fit_transform([{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}])
    print(data)
    print(dict.get_feature_names())
    print(data.toarray()) # 转化为数组
    print(dict.inverse_transform(data))
if __name__ == '__main__':
    dictver()

结果为:

数据的特征工程_第1张图片

4.4 文本特征提取(只限于英文)

作用:对文本数据进行特征值化

类:sklearn.feature_extraction.text.CountVectorizer

语法:

sklearn.feature_extraction.text.CountVectorizer()----将文本文档的集合转换为计数矩阵

方法:

CountVectorizer.fit_transform(X,y)

X:文本或者包含文本字符串的可迭代对象----返回值:返回sparse矩阵

CountVectorizer.inverse_transform(X)

X:array数组或者sparse矩阵----返回值:转换之前数据格式

CountVectorizer.get_feature_names()

返回值:单词列表

from sklearn.feature_extraction.text import CountVectorizer
def countvec():
    """对文本进行特征值化"""
    cv = CountVectorizer()
    data = cv.fit_transform(["life is short,i like python","life is too long,i dislike python"])
    print(cv.get_feature_names())  # 返回词的列表,重复的只统计一次,单个字母不统计
    print(data.toarray())  # 对每篇文章,在词的列表里面进行统计每个词出现的次数
if __name__ == '__main__':
    countvec()

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

4.5 中文文本特征值化

from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cutword():
    con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
    con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
    con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
    # 转换成列表
    content1 = list(con1)
    content2 = list(con2)
    content3 = list(con3)
    # 把列表转换成字符串
    c1 = " ".join(content1)
    c2 = " ".join(content2)
    c3 = " ".join(content3)
    return  c1,c2,c3
def zwvec():
    """对中文文本的特征值化"""
    c1,c2,c3 = cutword()
    cv = CountVectorizer()
    data = cv.fit_transform([c1,c2,c3])
    print(cv.get_feature_names())
    print(data.toarray())
if __name__ == '__main__':
    zwvec()

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

4.6 TF-IDF

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

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

类:sklearn.feature_extraction.text.TfidfVectorizer

语法:sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None,…)-----返回词的权重矩阵

方法:

TfidfVectorizer.fit_transform(X,y)

X:文本或者包含文本字符串的可迭代对象-----返回值:返回sparse矩阵

TfidfVectorizer.inverse_transform(X)

X:array数组或者sparse矩阵------返回值:转换之前数据格式

TfidfVectorizer.get_feature_names()

返回值:单词列表

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
def cutword():
    con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
    con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
    con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
    # 转换成列表
    content1 = list(con1)
    content2 = list(con2)
    content3 = list(con3)
    # 把列表转换成字符串
    c1 = " ".join(content1)
    c2 = " ".join(content2)
    c3 = " ".join(content3)
    return  c1,c2,c3
def tfidfvec():
    """对中文文本的特征值化"""
    c1,c2,c3 = cutword()
    tf = TfidfVectorizer()
    data = tf.fit_transform([c1,c2,c3])
    print(tf.get_feature_names())
    print(data.toarray())
if __name__ == '__main__':
    tfidfvec()

结果为:
数据的特征工程_第2张图片
为什么需要TfidfVectorizer?

分类机器学习算法的的重要依据

5.数据的特征处理

特征处理:通过特定的统计方法(数学方法)将数据转换成算法要求的数据。

5.1 特征处理的方法

数值型数据:

标准缩放:1.归一化 2.标准化

3.缺失值

类别型数据:one-hot编码

时间类型:时间的切分

5.2 sklearn特征处理API

sklearn. preprocessing

5.3 归一化

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

目的:使得某一个特征对最终结果不会造成更大影响
公式:
数据的特征工程_第3张图片

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

sklearn归一化API: sklearn.preprocessing.MinMaxScaler

语法:

sklearn.preprocessing.MinMaxScalar(feature_range=(0,1)…)------每个特征缩放到给定范围(默认[0,1])

方法:

MinMaxScalar.fit_transform(X)

X:numpy array格式的数据[n_samples,n_features]

返回值:转换后的形状相同的array

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

from sklearn.preprocessing import MinMaxScaler
def mm():
    """归一化处理"""
    mm = MinMaxScaler()
    data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
    print(data)
if __name__ == '__main__':
    mm()

结果为:
数据的特征工程_第4张图片

5.4 标准化

特点:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内

公式:数据的特征工程_第5张图片
对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变

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

sklearn标准化API: scikit-learn.preprocessing.StandardScaler

语法:

scikit-learn.preprocessing.StandardScaler

处理之后每列来说所有数据都聚集在均值0附近方差为1

方法:

StandardScaler.fit_transform(X,y)

X:numpy array格式的数据[n_samples,n_features]

返回值:转换后的形状相同的array

StandardScaler.mean

原始数据中每列特征的平均值

from sklearn.preprocessing import StandardScaler
def stand():
    """标准化缩放"""
    std = StandardScaler()
    data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])
    print(data)
    print(std.mean_)
if __name__ == '__main__':
    stand()

结果为:
数据的特征工程_第6张图片
在已有样本足够多的情况下比较稳定,标准化适合现代嘈杂大数据场景。

5.5 缺失值处理

缺失值处理方法:

删除—如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列

插补—可以通过缺失值每行或者每列的平均值、中位数来填充

sklearn缺失值API: sklearn.Imputer.SimpleImputer

语法:

SimpleImputer(missing_values=np.nan, strategy=‘mean’)

完成完成缺失值插补

方法:

SimpleImpute.fit_transform(X,y)

X:numpy array格式的数据[n_samples,n_features]

返回值:转换后的形状相同的array

from sklearn.impute import SimpleImputer
import numpy as np
def sim():
    """缺失值处理"""
    im = SimpleImputer(missing_values=np.nan,strategy='mean')
    data = im.fit_transform([[1, 2], [np.nan, 3], [7, 6]])
    print(data)
if __name__ == '__main__':
    sim()

结果是:
数据的特征工程_第7张图片

6.降维

维度:特征的数量

6.1 数据的特征选择

特征选择:是在已有的特征中选择更好的特征。

特征选择原因

冗余:部分特征的相关度高,容易消耗计算性能

噪声:部分特征对预测结果有负影响

sklearn特征选择API:klearn.feature_selection.VarianceThreshold

语法:

klearn.feature_selection.VarianceThreshold(threshold = 0.0)----删除所有低方差特征

方法:

Variance.fit_transform(X,y)

X:numpy array格式的数据[n_samples,n_features]

返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。

from sklearn.feature_selection import VarianceThreshold

def var():
    """特征选择---删除低方差数据"""
    vart = VarianceThreshold()
    data = vart.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
    print(data)
if __name__ == '__main__':
    var()

结果是:
数据的特征工程_第8张图片

6.2 主成分分析

本质:PCA是一种分析、简化数据集的技术

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

作用:可以削减回归分析或者聚类分析中特征的数量

注意:高维度数据容易出现的问题—特征之间通常是线性相关的

PCA的API:sklearn.decomposition.PCA

语法:sklearn.decomposition.PCA(n_components=None)----将数据分解为较低维数空间

n_components:一般在0.9-0.95之间

方法:

PCA.fit_transform(X)

X:numpy array格式的数据[n_samples,n_features]

返回值:转换后指定维度的array

from sklearn.decomposition import PCA
def pca():
    """主成分分析进行特征降维"""
    pca = PCA(n_components=0.9)
    data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
    print(data)
if __name__ == '__main__':
    pca()

结果为:

数据的特征工程_第9张图片
探究:用户对物品类别的喜好细分降维

1.获取数据

数据来源:https://www.kaggle.com/c/instacart-market-basket-analysis/data

数据:

products.csv 商品信息

order_products__prior.csv 订单与商品信息

orders.csv 用户的订单信息

aisles.csv 商品所属具体物品类别

2.数据处理

2.1 合并表格

通过网站中的数据描述可知:

表一:order_products__prior.csv:订单与商品信息

字段:order_id, product_id

表二:products.csv:商品信息

字段:product_id, aisle_id

表三:orders.csv:用户的订单信息

字段:order_id,user_id

表四:aisles.csv:商品所属具体物品类别

字段: aisle_id, aisle

合并过程:

表一与表二通过相同字段(特征)product_id进行合并,合并后的表再与表三通过相同字段order_id进行合并,最后表一二三合并后的表与表四通过相同字段aisle_id合并为一张表

2.2 交叉表(特殊的分组工具)

pd.pd.crosstab(指定的行,指定的列)

2.3 主成分分析

import pandas as pd
from sklearn.decomposition import PCA
# 读取四张表的数据----数据与.py文件在同一目录下
prior = pd.read_csv("order_products__prior.csv")
products = pd.read_csv("products.csv")
orders = pd.read_csv("orders.csv")
aisles = pd.read_csv("aisles.csv")
# 合并为一张表
mt = pd.merge(prior,products,on=['product_id','product_id'])
mt = pd.merge(mt,orders,on=['order_id','order_id'])
mt = pd.merge(mt,aisles,on=['aisle_id','aisle_id'])
# 交叉表(特殊的分组工具)
cross = pd.crosstab(mt['user_id'],mt['aisle'])
# 主成分分析
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)
print(data)

你可能感兴趣的:(机器学习,机器学习)