03_机器学习流程_特征工程

二、特征工程(特征处理)

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

在这里插入图片描述

1.环境配置

安装scikit-learn步骤:(前提需要Numpy,Pandas库)

sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose

测试是否安装成功~

from numpy import *
eye(4)

安装Pandas库:

pip install pandas
pip install Matplotlib

安装Scikit-learn

pip3 install Scikit-learn

2.字典特征抽取

在这里插入图片描述把字典中一些类别数据,分别进行转换成特征,因为原始数据中的有的数据是文本的或者字符串的形式存在的,这时候计算机并不能识别此类型的数据,因此需要对这些数据进行特征抽取。对于本来就是数值型的数据比如说温度等直接保留,而对于有类别的数据则要先转化为字典数据,sklearn中采用one-hot编码的方式处理

作用:对字典数据进行特征值化
类:sklearn.feature_extraction.DictVectorizer
DictVectorizer(sparse=True,…)
DictVectorizer.fit_transform(X)      
X:字典或者包含字典的迭代器
返回值:返回sparse矩阵
DictVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式
DictVectorizer.get_feature_names()
返回类别名称
DictVectorizer.transform(X)
按照原先的标准转换

流程
1):实例化类DictVectorizer
2):调用fit_transform方法输入数据并转换 注意返回格式

3.文本特征抽取(方法流程同字典数据)

3.1jieba分词

目的:对文本数据进行特征抽取,主要用于文本分类,情感分析,在数据统计时由于单个字母不具有主观特色,因此不会统计单个字母出现的字数
中文处理方式:对中文需要进行分词处理—jieba分词

pip  install jieba -i  https://pypi.doubanio.com/simple/  --trusted-host pypi.doubanio.com

但是在例子中会发现问题,分词并不总是理想的,如“三行情诗”,分成了“三”、“行情"、”诗“这明显不是我们想要的。

在这里插入图片描述

from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
import jieba

"""
字典特征抽取以及文本特征抽取
"""
def dictvec():
    # 实例化对象
    dict = DictVectorizer(sparse=False)
    # 调用fit_transform输入数据并转化
    # X: 字典或者包含字典的迭代器
    # 返回值:返回sparse矩阵
    data = dict.fit_transform([{'city':'北京','temperature':100},{'city':'上海','temperature':60},{'city':'深圳','temperature':70}])
    print(data)

    # 返回类别名称
    print(dict.get_feature_names())

    # X:array数组或者sparse矩阵
    #返回值:转换之前数据格式
    print(dict.inverse_transform(data))
    return None

def countvec():
    """
    对文本进行特征值化
    :return: None
    """
    # 实例化对象
    cv = CountVectorizer()
    # 输入数据并转化
    data = cv.fit_transform(["life is short , i like python!","life is too long , so I always miss!"])
    # 返回的是一个数组,按照词列表,显示每篇文章中对应单词出现的次数
    print(data.toarray())
    # 返回词的列表 但仅限于多个字母构成的单词,单个字母以及符号并不统计在内,且重复单词只出现一次
    print(cv.get_feature_names())
    return None

def cutworld():
    """
    分词操作
    :return:
    """
    # 进行分词操作,这是一个生成器
    con1 = jieba.cut("最适合表白的三行情诗,每一句都让人沉醉,你的笑,我看一眼就醉")
    con2 = jieba.cut("但是,要知道中国的文化博大精深,除了所谓的土味情话之外,还有风靡一时的三行情书,下面这些情诗让你在表白的时候别具一格。")
    # 将生成器的到的转换为列表
    content1 = list(con1)
    content2 = list(con2)
    # 将列表在转变为含有以字符串隔开的字符串
    c1 = ' '.join(content1)
    c2 = ' '.join(content2)
    #返回值
    return c1,c2

def hanzivec():
    """
    中文特征值化
    :return: None
    """
    # 获取分词函数得到的返回值
    c1,c2  = cutworld()
    # 打印验证
    print(c1,c2)
    # 实例化对象
    cv = CountVectorizer()
    # 输入数据并转化
    data = cv.fit_transform([c1,c2])
    # 返回的是一个数组,按照词列表,显示每篇文章中对应单词出现的次数
    print(data.toarray())
    # 返回词的列表 但仅限于多个字母构成的单词,单个字母以及符号并不统计在内,且重复单词只出现一次
    print(cv.get_feature_names())

    return None

if __name__ == "__main__":
    dictvec()
    countvec()
    hanzivec()
3.2tf-idf

tf-idf分析问题:我的理解–不同文章的区分不取决于大多数次,tf-df分析根据词汇出现的重要性程度对文章进行划分,比如 共享这个单词仅在一篇文章中出现,相对的就可以认为它是我们文章分类的一个依据。即某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现则认为此词或者短语具有很好的类别区分能力,适合用来分类

Tf-idf:用于评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度

类:sklearn.feature_extraction.text.TfidfVectorizer
相关语法
# 返回词的权重矩阵
TfidfVectorizer(stop_word = None,...)
# X文本或者包含文本字符串的可迭代对象
# 返回值 返回sparse矩阵
TfidfVectorizer.fit_transform(X)
# X array数组或者sparse矩阵
# 返回值:转换之前的数据格式
TfidfVectorizer.inverse_transform(X)
# 返回值:单词列表
TfidfVectorizer.get_feature_names()

在这里插入图片描述

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba

"""
tf-idf分析问题

"""
def cutworld():
    """
    分词操作
    :return:
    """
    # 进行分词操作,这是一个生成器
    con1 = jieba.cut("最适合表白的三行情诗,每一句都让人沉醉,你的笑,我看一眼就醉")
    con2 = jieba.cut("但是,要知道中国的文化博大精深,除了所谓的土味情话之外,还有风靡一时的三行情书,下面这些情诗让你在表白的时候别具一格。")
    # 将生成器的到的转换为列表
    content1 = list(con1)
    content2 = list(con2)
    # 将列表在转变为含有以字符串隔开的字符串
    c1 = ' '.join(content1)
    c2 = ' '.join(content2)
    #返回值
    return c1,c2

def tfidfvec():
    # 获取分词函数得到的返回值
    c1,c2  = cutworld()
    # 打印验证
    print(c1,c2)
    # 实例化对象
    tf = TfidfVectorizer()
    # 输入并返回
    data = tf.fit_transform([c1,c2])
    # 获取列表名称
    print(tf.get_feature_names())
    print(data.toarray())
    return  None

if __name__ == "__main__":
    tfidfvec()

4.数据特征预处理

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

在这里插入图片描述

4.1 归一化

归一化:通过对原始数据进行变换把数据映射到(默认为【0,1】之间

  • 归一化适用于特征同等重要的数据(归一化后使用最小二乘法计算),这样可以避免某一个特征对最终结果不会造成更大的影响
  • 缺点:最大值与最小值非常容易受异常点影响,鲁棒性较差,只适合传统精确小数据场景
  • 步骤:
    • 实例化对象、
    • 通过fit_transfrom转换
4.2 标准化

标准化:通过对原始数据进行变换把数据变换到均值为0,方差为1的范围内。(适用于样本足够多的情况)

在这里插入图片描述

  • 步骤:
    • 实例化StandardScaler,
    • fit_transfrom转换
from sklearn.preprocessing import StandardScaler
"""
数据的预处理之数据标准化

"""
def stand():
    """
    标准化
    :return:None
    """
    # 实例化
    std = StandardScaler()
    #输入并转化
    data = std.fit_transform([[1,-1,3],[2,4,2],[4,6,-1]])
    print(data)
    # 打印每列平均值
    print(std.mean_)
    return None

if __name__ == "__main__":
    stand()

缺失值处理(删除、插补):通常用pandas进行处理

sklearn中缺失值API 
sklearn.preprossing.Imputer

5.数据降维

5.1特征选择

特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值,也可以不改变值,但是选择后的特征维数肯定比选择前小
进行特征选择的原因通常是由于部分特征的相关度高,容易消耗计算机性能(冗余),或者部分特征对预测结果有影响(噪声)

  • 主要方法:
    • Filter(过滤式)Variance Threshold --对方差进行选择
    • Embedded(嵌入式):正则化、决策树
    • Wrapper(包裹式)
    • 其他方法:神经网络
# 特征选择API 
# sklearn.feature_selection.VarianceThreshold
# 步骤: 实例化、fit_transfrom

from sklearn.feature_selection import VarianceThreshold

"""
特征选择实现数据降维 --过滤法
"""
def var():
    """
    特征选择--删除低方差特性
    :return:None
    """
    # 实例化 threshold阈值方差
    var = VarianceThreshold(threshold=0.0)
    #
    data = var.fit_transform([[0,2,0,3],[0,1,4,3],[0,1,1,3]])

    print(data)

    return None


if __name__ == "__main__":
    var()
5.2主成分分析(通常用于特征数量达到上百的时候 考虑数据的简化)

主成分分析(PCA)是一种分析简化数据集的技术,目的是数据维数压缩,尽可能的降低源数据的维数(复杂度),损失少量的信息。
作用:可以消减回归分析或者聚类分析中特征的数量

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值